Merge changes I85b49247,Icca28a4a
authorEd Warnicke <eaw@cisco.com>
Fri, 10 Jan 2014 17:40:32 +0000 (17:40 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 10 Jan 2014 17:40:32 +0000 (17:40 +0000)
* changes:
  Added DELETE operation
  Changed POST operation

28 files changed:
.gitignore
opendaylight/config/config-util/src/main/java/org/opendaylight/controller/config/util/ConfigTransactionClient.java
opendaylight/config/config-util/src/main/java/org/opendaylight/controller/config/util/ConfigTransactionJMXClient.java
opendaylight/config/yang-test/src/test/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleTest.java [moved from opendaylight/config/yang-test/src/test/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleTest.java with 64% similarity]
opendaylight/distribution/opendaylight/src/main/resources/run.sh
opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java
opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-capable-transaction.yang
opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang
opendaylight/md-sal/model/model-flow-service/src/main/yang/group-service.yang
opendaylight/md-sal/model/model-flow-service/src/main/yang/meter-service.yang
opendaylight/md-sal/model/model-inventory/src/main/yang/netconf-node-inventory.yang [new file with mode: 0644]
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/api/AugmentationCodec.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/api/CodecRegistry.java
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/LazyGeneratedCodecRegistry.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/yangtools/yang/util/YangSchemaUtils.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnToJsonIncorrectTopLevelTest.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnToJsonNotExistingLeafTypeTest.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/xml/test/CnSnToXmlNotExistingLeafTypeTest.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsProvider.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsUpdateCommiter.java
opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/NetconfOperationServiceFactoryImpl.java
opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/osgi/ConfigPersisterActivator.java
opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClient.java
opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/ssh/threads/SocketThread.java
opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/ssh/virtualsocket/ChannelInputStream.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/ComponentActivatorAbstractBase.java
opendaylight/samples/simpleforwarding/src/main/java/org/opendaylight/controller/samples/simpleforwarding/internal/SimpleForwardingImpl.java

index 18817e7c359dbfbe526b0f37e379d859f0dfc97b..b079cba0a10d3a76e09c824bfeb8db16922756c7 100644 (file)
@@ -20,3 +20,4 @@ opendaylight/northbound/integrationtest/logs/*
 .idea
 xtend-gen
 classes
+out/
index 75b180921acedc4158ec6e4dfafa1c1815c28283..4f02db5a3807095c0302ee1446eb765a2858ea77 100644 (file)
@@ -32,8 +32,13 @@ public interface ConfigTransactionClient extends
 
     void validateBean(ObjectName configBeanON) throws ValidationException;
 
-    void destroyConfigBean(String moduleName, String instanceName)
-            throws InstanceNotFoundException;
+    @Deprecated
+    /**
+     * Use {@link #destroyModule(String, String)}
+     */
+    void destroyConfigBean(String moduleName, String instanceName) throws InstanceNotFoundException;
+
+    void destroyModule(String moduleName, String instanceName) throws InstanceNotFoundException;
 
     void setAttribute(ObjectName on, String jmxName, Attribute attribute);
 }
index e683d915baea604db86b891e81dc9192b203c4aa..3583dafd0d46c3fcedb070e00b8cc175255bc4c8 100644 (file)
@@ -84,12 +84,23 @@ public class ConfigTransactionJMXClient implements ConfigTransactionClient {
     }
 
     @Override
+    @Deprecated
+    /**
+     * {@inheritDoc}
+     */
     public void destroyConfigBean(String moduleName, String instanceName)
             throws InstanceNotFoundException {
         destroyModule(ObjectNameUtil.createTransactionModuleON(
                 getTransactionName(), moduleName, instanceName));
     }
 
+    @Override
+    public void destroyModule(String moduleName, String instanceName)
+            throws InstanceNotFoundException {
+        destroyModule(ObjectNameUtil.createTransactionModuleON(
+                getTransactionName(), moduleName, instanceName));
+    }
+
     @Override
     public void abortConfig() {
         configTransactionControllerMXBeanProxy.abortConfig();
@@ -4,8 +4,6 @@ import com.google.common.collect.Lists;
 import junit.framework.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.opendaylight.controller.config.api.ConflictingVersionException;
-import org.opendaylight.controller.config.api.ValidationException;
 import org.opendaylight.controller.config.api.jmx.CommitStatus;
 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
@@ -15,8 +13,14 @@ import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.ObjectName;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 public class NetconfTestImplModuleTest  extends AbstractConfigTest {
 
     public static final String TESTING_DEP_PREFIX = "testing-dep";
@@ -32,17 +36,16 @@ public class NetconfTestImplModuleTest  extends AbstractConfigTest {
     }
 
     @Test
-    public void testDependencyList() throws InstanceAlreadyExistsException, ValidationException,
-            ConflictingVersionException {
+    public void testDependencyList() throws Exception {
         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
 
         ObjectName on = createInstance(transaction, instanceName, 4);
         transaction.validateConfig();
-        CommitStatus status = transaction.commit();
+        CommitStatus status1 = transaction.commit();
 
         assertBeanCount(1, factory.getImplementationName());
         assertBeanCount(4 + 1, DepTestImplModuleFactory.NAME);
-        assertStatus(status, 1 + 4 + 1, 0, 0);
+        assertStatus(status1, 1 + 4 + 1, 0, 0);
 
         transaction = configRegistryClient.createTransaction();
 
@@ -56,6 +59,38 @@ public class NetconfTestImplModuleTest  extends AbstractConfigTest {
         assertTestingDeps(testingDeps, 4);
 
         transaction.abortConfig();
+
+        // check that reuse logic works - equals on list of dependencies.
+        transaction = configRegistryClient.createTransaction();
+        CommitStatus status2 = transaction.commit();
+        assertStatus(status2, 0, 0, 6);
+
+        // replace single dependency
+        transaction = configRegistryClient.createTransaction();
+        String instanceName1 = TESTING_DEP_PREFIX + 1;
+        transaction.destroyModule(DepTestImplModuleFactory.NAME, instanceName1);
+        transaction.createModule(DepTestImplModuleFactory.NAME, instanceName1);
+        CommitStatus status3 = transaction.commit();
+        assertStatus(status3, 1, 1, 4);
+
+    }
+
+    @Test
+    public void testNullCheckInListOfDependencies() throws Exception {
+        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+
+        ObjectName on = createInstance(transaction, instanceName, 4);
+        NetconfTestImplModuleMXBean proxy = transaction.newMXBeanProxy(on, NetconfTestImplModuleMXBean.class);
+        try{
+            proxy.setTestingDeps(null);
+            fail();
+        }catch(RuntimeException e) {
+            Throwable cause = e.getCause();
+            assertNotNull(cause);
+            assertTrue("Invalid type " + cause, cause instanceof IllegalArgumentException);
+            assertEquals("Null not supported", cause.getMessage());
+        }
+        proxy.setTestingDeps(Collections.<ObjectName>emptyList());
     }
 
     private void assertTestingDeps(List<ObjectName> testingDeps, int i) {
index 3a29f63b81a5ab0d442fae2b6e0c75003d6c2e68..ffe53afd4d5393de8e065a1708caf41893e3e726 100755 (executable)
@@ -164,6 +164,8 @@ FWCLASSPATH=${FWCLASSPATH},file:${basedir}/lib/org.eclipse.virgo.kernel.equinox.
 CLASSPATH=${CLASSPATH}:${basedir}/lib/org.eclipse.equinox.launcher-1.3.0.v20120522-1813.jar
 FWCLASSPATH=${FWCLASSPATH},file:${basedir}/lib/org.eclipse.equinox.launcher-1.3.0.v20120522-1813.jar
 
+cd $basedir
+
 if [ "${stopdaemon}" -eq 1 ]; then
     if [ -e "${pidfile}" ]; then
         daemonpid=`cat "${pidfile}"`
index 3d6a0292ef67225079b11759a3560bdfddf85377..2b3347f312469b00ca6748f5d19884626ce1daf3 100644 (file)
@@ -2639,6 +2639,13 @@ public class ForwardingRulesManager implements
         }
     }
 
+    /**
+     * Function called by the dependency manager before Container is Stopped and Destroyed.
+     */
+    public void containerStop() {
+        uninstallAllFlowEntries(false);
+    }
+
     /**
      * Function called by the dependency manager before the services exported by
      * the component are unregistered, this will be followed by a "destroy ()"
@@ -2646,7 +2653,6 @@ public class ForwardingRulesManager implements
      */
     void stop() {
         stopping = true;
-        uninstallAllFlowEntries(false);
         // Shutdown executor
         this.executor.shutdownNow();
         // Now walk all the workMonitor and wake up the one sleeping because
index 483c0c9e126995c60c1a6bd343e796ae4b74084b..1c675f015dfd4a4964214bb289c4b765a05b1846 100644 (file)
@@ -3,6 +3,7 @@ module flow-capable-transaction {
     prefix type;
 
     import opendaylight-inventory {prefix inv; revision-date "2013-08-19";}
+    import ietf-inet-types {prefix inet; revision-date "2010-09-24";}
     import yang-ext {prefix ext; revision-date "2013-07-09";}
     
     revision "2013-11-03" {
@@ -12,6 +13,12 @@ module flow-capable-transaction {
     typedef transaction-id {
        type uint64;
     }
+    // This refers to MD-SAL transaction reference.
+    grouping transaction-metadata {
+        leaf transaction-uri {
+            type inet:uri;
+        }
+    }
     
     grouping transaction-aware {
         leaf transaction-id {
index d6a31c30deeae87f619e157c39901ee3456f9e1a..5c68a137c3d71f8c23da9cd8da3f64d6552e2b56 100644 (file)
@@ -51,11 +51,11 @@ module sal-flow {
 
     rpc add-flow {
         input {
+            uses tr:transaction-metadata;
             leaf flow-ref {
                 type types:flow-ref;
             }
-            uses node-flow;
-            uses tr:transaction-aware;
+            uses node-flow;            
         }
         output {
             uses tr:transaction-aware;
@@ -64,11 +64,11 @@ module sal-flow {
 
     rpc remove-flow {
         input {
+            uses tr:transaction-metadata;
             leaf flow-ref {
                 type types:flow-ref;
             }
-            uses node-flow;
-            uses tr:transaction-aware;
+            uses node-flow;            
         }
         output {
             uses tr:transaction-aware;
@@ -77,11 +77,11 @@ module sal-flow {
 
     rpc update-flow {
         input {
+            uses tr:transaction-metadata;
             leaf flow-ref {
                 type types:flow-ref;
             }
-            uses flow-update;
-            uses tr:transaction-aware;
+            uses flow-update;           
         }
         output {
             uses tr:transaction-aware;
@@ -89,6 +89,7 @@ module sal-flow {
     }
 
     notification flow-added {
+        uses tr:transaction-metadata;
         leaf flow-ref {
             type types:flow-ref;
         }
@@ -97,15 +98,16 @@ module sal-flow {
     }
 
     notification flow-updated {
+        uses tr:transaction-metadata;
         leaf flow-ref {
             type types:flow-ref;
         }
         uses node-flow;
-        uses tr:transaction-aware;
-        
+        uses tr:transaction-aware;        
     }
 
     notification flow-removed {
+        uses tr:transaction-metadata;
         leaf flow-ref {
             type types:flow-ref;
         }
@@ -120,6 +122,7 @@ module sal-flow {
     notification node-error-notification {
         uses error:error-message;
         uses tr:transaction-aware;
+        uses tr:transaction-metadata;
     }
     
     notification node-experimenter-error-notification {
index 6cc1537ebc11c5d8f05a5921badbe79c300c8a12..7eeb0ac0f3767eb0d40e211d0b9c88d188cb8517 100644 (file)
@@ -31,11 +31,11 @@ module sal-group {
 
     rpc add-group {
         input {
+            uses tr:transaction-metadata;
             leaf group-ref {
                 type group-type:group-ref;
             }
-            uses node-group;
-            uses tr:transaction-aware;
+            uses node-group;            
         }
         output {
             uses tr:transaction-aware;
@@ -44,11 +44,11 @@ module sal-group {
 
     rpc remove-group {
         input {
+            uses tr:transaction-metadata;
             leaf group-ref {
                 type group-type:group-ref;
             }
-            uses node-group;
-            uses tr:transaction-aware;
+            uses node-group;            
         }
         output {
             uses tr:transaction-aware;
@@ -57,11 +57,11 @@ module sal-group {
 
     rpc update-group {
         input {
+            uses tr:transaction-metadata;
             leaf group-ref {
                 type group-type:group-ref;
             }
-            uses group-update;
-            uses tr:transaction-aware;
+            uses group-update;            
         }
         output {
             uses tr:transaction-aware;
@@ -69,6 +69,7 @@ module sal-group {
     } 
 
     notification group-added {
+        uses tr:transaction-metadata;
         leaf group-ref {
             type group-type:group-ref;
         }
@@ -77,6 +78,7 @@ module sal-group {
     }
 
     notification group-updated {
+        uses tr:transaction-metadata;
         leaf group-ref {
             type group-type:group-ref;
         }
@@ -85,6 +87,7 @@ module sal-group {
     }
 
     notification group-removed {
+        uses tr:transaction-metadata;
         leaf group-ref {
             type group-type:group-ref;
         }
index 6205fed529d85a849ea77bdf5c6ff87b0b5c1331..ecdef41951aa63482b11c122c51f08d602cb8f26 100644 (file)
@@ -31,11 +31,11 @@ module sal-meter {
 
     rpc add-meter {
         input {
+            uses tr:transaction-metadata;            
             leaf meter-ref {
                 type meter-type:meter-ref;
             }
-            uses node-meter;
-            uses tr:transaction-aware;            
+            uses node-meter;            
         }
         output {
             uses tr:transaction-aware;
@@ -44,12 +44,12 @@ module sal-meter {
 
     rpc remove-meter {
         input {
+            uses tr:transaction-metadata;            
             leaf meter-ref {
                 type meter-type:meter-ref;
             }
             
-            uses node-meter;
-            uses tr:transaction-aware;            
+            uses node-meter;                       
         }
         output {
             uses tr:transaction-aware;
@@ -58,12 +58,12 @@ module sal-meter {
 
     rpc update-meter {
         input {
+            uses tr:transaction-metadata;            
             leaf meter-ref {
                 type meter-type:meter-ref;
             }
             
-            uses meter-update;
-            uses tr:transaction-aware;            
+            uses meter-update;                       
         }
         output {
             uses tr:transaction-aware;
@@ -71,6 +71,7 @@ module sal-meter {
     }
         
     notification meter-added {
+        uses tr:transaction-metadata;
         leaf meter-ref {
             type meter-type:meter-ref;
         }
@@ -79,6 +80,7 @@ module sal-meter {
     }
 
     notification meter-updated {
+        uses tr:transaction-metadata;
         leaf meter-ref {
             type meter-type:meter-ref;
         }
@@ -87,6 +89,7 @@ module sal-meter {
     }
 
     notification meter-removed {
+        uses tr:transaction-metadata;
         leaf meter-ref {
             type meter-type:meter-ref;
         }
diff --git a/opendaylight/md-sal/model/model-inventory/src/main/yang/netconf-node-inventory.yang b/opendaylight/md-sal/model/model-inventory/src/main/yang/netconf-node-inventory.yang
new file mode 100644 (file)
index 0000000..b5cde6e
--- /dev/null
@@ -0,0 +1,27 @@
+module netconf-node-inventory {
+    namespace "urn:opendaylight:netconf-node-inventory";
+    prefix "netinv";
+    
+    import opendaylight-inventory { prefix inv; revision-date "2013-08-19";}
+    import yang-ext {prefix ext; revision-date "2013-07-09";}
+    
+    revision "2014-01-08" {
+        description "Initial revision of Inventory model";
+    }
+    
+    grouping netconf-node-fields {
+        leaf-list initial-capability {
+            type string;
+        }
+        
+        leaf-list current-capability {
+            type string;
+        }
+    }
+    
+    augment /inv:nodes/inv:node {
+        ext:augment-identifier "netconf-node";
+        
+        uses netconf-node-fields;
+    }
+}
\ No newline at end of file
index cdddec76d41f1e643f2f23591c3f678cd26c6eba..970e077c03be4800e25bdf9ee3c3e5ecf0b562ed 100644 (file)
@@ -1,6 +1,7 @@
 package org.opendaylight.controller.sal.binding.dom.serializer.api;
 
 import org.opendaylight.yangtools.yang.binding.Augmentation;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 import org.opendaylight.yangtools.yang.data.api.Node;
 
@@ -12,4 +13,6 @@ public interface AugmentationCodec<A extends Augmentation<?>> extends DomCodec<A
     
     @Override
     public ValueWithQName<A> deserialize(Node<?> input);
+
+    public QName getAugmentationQName();
 }
index b9a4fe87ac80518d054372b5d1056227ea683efb..4565b545baa4aaacc6926e5b43320263297548c3 100644 (file)
@@ -10,6 +10,7 @@ import java.util.List;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.controller.sal.binding.dom.serializer.api.IdentifierCodec;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 
 
 public interface CodecRegistry {
@@ -36,4 +37,6 @@ public interface CodecRegistry {
     void bindingClassEncountered(Class<?> cls);
 
     void putPathToClass(List<QName> names, Class<?> cls);
+
+    public abstract QName getQNameForAugmentation(Class<?> cls);
 }
index 150d0f199f83f5615a9a5a8b7bda07347e6be309..f84503bea4d6e720fe3f16578a01e23116b2e72b 100644 (file)
@@ -26,13 +26,13 @@ import org.opendaylight.yangtools.yang.binding.Augmentable
 import com.google.common.collect.ImmutableList
 import org.opendaylight.yangtools.yang.binding.Augmentation
 import java.util.concurrent.ConcurrentHashMap
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections
 
 class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec {
     
     private static val LOG = LoggerFactory.getLogger(InstanceIdentifierCodecImpl);
     val CodecRegistry codecRegistry;
     
-    val Map<Class<?>,QName> classToQName = new WeakHashMap;
     val Map<Class<?>, Map<List<QName>, Class<?>>> classToPreviousAugment = new WeakHashMap;
     
     public new(CodecRegistry registry) {
@@ -106,7 +106,7 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec {
                 
                 previousAugmentation = null;
             } else {
-                previousQName = resolveQname(baArg.type);
+                previousQName = codecRegistry.getQNameForAugmentation(baArg.type as Class);
                 previousAugmentation = baArg.type;
             }
         }
@@ -122,7 +122,7 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec {
     
     private def dispatch PathArgument serializePathArgument(Item argument, QName previousQname) {
         val type = argument.type;
-        val qname = resolveQname(type);
+        val qname = BindingReflections.findQName(type);
         if(previousQname == null) {
             return new NodeIdentifier(qname);
         }
@@ -134,7 +134,7 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec {
         val Map<QName,Object> predicates = new HashMap();
         val type = argument.type;
         val keyCodec = codecRegistry.getIdentifierCodecForIdentifiable(type);
-        val qname = resolveQname(type);
+        val qname = BindingReflections.findQName(type);
         val combinedInput =  new ValueWithQName(previousQname,argument.key)
         val compositeOutput = keyCodec.serialize(combinedInput as ValueWithQName);
         for(outputValue :compositeOutput.value) {
@@ -145,15 +145,4 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec {
         }
         return new NodeIdentifierWithPredicates(QName.create(previousQname,qname.localName),predicates);
     }
-    
-    def resolveQname(Class<?> class1) {
-        val qname = classToQName.get(class1);
-        if(qname !== null) {
-            return qname;
-        }
-        val qnameField = class1.getField("QNAME");
-        val qnameValue = qnameField.get(null) as QName;
-        classToQName.put(class1,qnameValue);
-        return qnameValue;
-    }
 }
\ No newline at end of file
index cabb1bc4e2c5359582bc95e1e30514f557801b64..89d9b49081bc5dbe032fa47572062a5570d3279f 100644 (file)
@@ -44,6 +44,7 @@ import org.opendaylight.yangtools.yang.binding.BindingCodec;
 import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Identifier;
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
 import org.opendaylight.yangtools.yang.data.api.Node;
@@ -153,6 +154,12 @@ public class LazyGeneratedCodecRegistry implements //
         }
         return codec;
     }
+    
+    @Override
+    public QName getQNameForAugmentation(Class<?> cls) {
+        checkArgument(Augmentation.class.isAssignableFrom(cls));
+        return getCodecForAugmentation((Class<? extends Augmentation>)cls).getAugmentationQName();
+    }
 
     private static Class<? extends Augmentable<?>> getAugmentableArgumentFrom(
             final Class<? extends Augmentation<?>> augmentation) {
@@ -909,9 +916,11 @@ public class LazyGeneratedCodecRegistry implements //
             Delegator<BindingCodec> {
 
         private BindingCodec delegate;
+        private QName augmentationQName;
 
         public AugmentationCodecWrapper(BindingCodec<Map<QName, Object>, Object> rawCodec) {
             this.delegate = rawCodec;
+            this.augmentationQName = BindingReflections.findQName(rawCodec.getClass());
         }
 
         @Override
@@ -936,6 +945,11 @@ public class LazyGeneratedCodecRegistry implements //
             Object rawCodecValue = getDelegate().deserialize((Map<QName, Object>) input);
             return new ValueWithQName<T>(input.getNodeType(), (T) rawCodecValue);
         }
+        
+        @Override
+        public QName getAugmentationQName() {
+            return augmentationQName;
+        }
     }
 
     private class IdentityCompositeCodec implements IdentitityCodec {
index 3ff1d1d6cbafa87a7479945965542eaf8235368e..3b31380afbb5333165062949eafd13378bbbd410 100644 (file)
@@ -121,7 +121,6 @@ public class YangSchemaUtils {
             // TODO Auto-generated constructor stub
         }
 
-        @Override
         public YangNode getParent() {
             // TODO Auto-generated method stub
             return null;
index 6b5776263cc750f70f9694c0f0e1a11f758c3918..a589f9fca3cd8950d1a7e32068e9ba490b899916 100644 (file)
@@ -119,7 +119,6 @@ public class CnSnToJsonIncorrectTopLevelTest extends YangAndXmlAndDataSchemaLoad
             return null;
         }
 
-        @Override
         public YangNode getParent() {
             // TODO Auto-generated method stub
             return null;
index e5a317e2d5fc61101868e62263b524e61726d916..e2d7f0ce137322e1475ae50c8e3ad7ddd52a7d15 100644 (file)
@@ -10,6 +10,7 @@ import java.util.Set;
 import javax.ws.rs.WebApplicationException;
 
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.opendaylight.controller.sal.rest.impl.StructuredDataToJsonProvider;
 import org.opendaylight.controller.sal.restconf.impl.test.*;
@@ -31,6 +32,8 @@ public class CnSnToJsonNotExistingLeafTypeTest extends YangAndXmlAndDataSchemaLo
         dataLoad("/cnsn-to-json/simple-data-types");
     }
 
+    // FIXME
+    @Ignore
     @Test
     public void incorrectTopLevelElementTest() {
 
@@ -66,7 +69,9 @@ public class CnSnToJsonNotExistingLeafTypeTest extends YangAndXmlAndDataSchemaLo
         leafBuild.setConfiguration(true);
 
         contBuild.addChildNode(leafBuild);
-        return contBuild.build(null);
+        // FIXME: build method does not accept any arguments
+        //return contBuild.build(null);
+        return null;
     }
 
 }
index d779b5ce7b5b71e8c56fef7afe6fc45f62e1d844..4da354c2c00223d618e575cf8647c342ca827992 100644 (file)
@@ -63,7 +63,9 @@ public class CnSnToXmlNotExistingLeafTypeTest {
         leafBuild.setConfiguration(true);
 
         contBuild.addChildNode(leafBuild);
-        return contBuild.build(null);
+        // FIXME: build method does not accept any arguments
+        //return contBuild.build(null);
+        return null;
 
     }
 
index 19cf0ed386bda52aed1ab8b572dd1c5cea821d53..45bc9055026812bf00b1f1bf9e3da9c0b97ffb90 100644 (file)
@@ -260,22 +260,9 @@ public class StatisticsProvider implements AutoCloseable {
                 this.multipartMessageManager.addTxIdToRequestTypeEntry(response.get().getResult().getTransactionId()
                         , StatsRequestType.AGGR_FLOW);
             }
+        }else{
+            spLogger.debug("No details found in data store for flow tables associated with Node {}",targetNodeKey);
         }
-        
-        //Note: Just for testing, because i am not able to fetch table list from datastore
-        // Bug-225 is raised for investigation.
-        
-//                spLogger.info("Send aggregate stats request for flow table {} to node {}",1,targetNodeKey);
-//                GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder input = 
-//                        new GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder();
-//                
-//                input.setNode(new NodeRef(InstanceIdentifier.builder(Nodes.class).child(Node.class, targetNodeKey).toInstance()));
-//                input.setTableId(new TableId((short)1));
-//                Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> response = 
-//                        flowStatsService.getAggregateFlowStatisticsFromFlowTableForAllFlows(input.build());`
-//                
-//                multipartMessageManager.setTxIdAndTableIdMapEntry(response.get().getResult().getTransactionId(), (short)1);
-        
     }
 
     private void sendAllNodeConnectorsStatisticsRequest(NodeRef targetNode) throws InterruptedException, ExecutionException{
@@ -376,7 +363,7 @@ public class StatisticsProvider implements AutoCloseable {
     private List<Short> getTablesFromNode(NodeKey nodeKey){
         InstanceIdentifier<FlowCapableNode> nodesIdentifier = InstanceIdentifier.builder(Nodes.class).child(Node.class,nodeKey).augmentation(FlowCapableNode.class).toInstance();
         
-        FlowCapableNode node = (FlowCapableNode)dps.readConfigurationData(nodesIdentifier);
+        FlowCapableNode node = (FlowCapableNode)dps.readOperationalData(nodesIdentifier);
         List<Short> tablesId = new ArrayList<Short>();
         if(node != null && node.getTable()!=null){
             spLogger.info("Number of tables {} supported by node {}",node.getTable().size(),nodeKey);
index aa6e99a03f978a4604fe72ea4ba36307a6bdaa80..e7f6129aa5018c44baa9be2110597fab05c519a3 100644 (file)
@@ -799,7 +799,11 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
      * _ethernetSource=EthernetSource [_address=MacAddress [_value=00:00:00:00:00:00], _mask=null, augmentation=[]], 
      * _ethernetType=EthernetType [_type=EtherType [_value=2048], _mask=null, augmentation=[]]
      * 
-     * So this custom equals method add additional check, in case any match element is null in data-store-flow, but not
+     * Similarly for inPort, if user/application don't set any value for it, FRM will store null value for it in data store. 
+     * When we fetch the same flow (with its statistics) from switch, plugin converts its value to openflow:X:0.
+     *  e.g _inPort=Uri [_value=openflow:1:0]  
+     * 
+     * So this custom equals method add additional check to take care of these scenario, in case any match element is null in data-store-flow, but not
      * in the flow fetched from switch.
      * 
      * @param statsFlow
@@ -820,8 +824,7 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
                     return false;
                 }
             }
-        } //else if(!storedFlow.getEthernetMatch().equals(statsFlow.getEthernetMatch())) {
-        else if(!EthernetMatchEquals(statsFlow.getEthernetMatch(),storedFlow.getEthernetMatch())) {
+        } else if(!EthernetMatchEquals(statsFlow.getEthernetMatch(),storedFlow.getEthernetMatch())) {
             return false;
         }
         if (storedFlow.getIcmpv4Match()== null) {
@@ -847,7 +850,12 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
         }
         if (storedFlow.getInPort()== null) {
             if (statsFlow.getInPort() != null) {
-                return false;
+                String[] portArr = statsFlow.getInPort().getValue().split(":");
+                if(portArr.length >= 3){
+                    if(Integer.parseInt(portArr[2]) != 0){
+                        return false;
+                    }
+                }
             }
         } else if(!storedFlow.getInPort().equals(statsFlow.getInPort())) {
             return false;
index 35695f75102870a00c31f631ca6f26a3b7e5320f..2db3c9d4f1d538893da1b9de420c696ef555e242 100644 (file)
@@ -45,6 +45,7 @@ public class NetconfOperationServiceFactoryImpl implements NetconfOperationServi
                 try {
                     Thread.sleep(ATTEMPT_TIMEOUT_MS);
                 } catch (InterruptedException e1) {
+                    Thread.currentThread().interrupt();
                     throw new RuntimeException(e1);
                 }
                 continue;
index 656091115c8907aa5de61394e1a6a6f9da516317..3c901c3f59e1f45194a5d17cc7979f48932a623b 100644 (file)
@@ -78,7 +78,10 @@ public class ConfigPersisterActivator implements BundleActivator {
                             ignoredMissingCapabilityRegex);
                     jmxNotificationHandler.init();
                 } catch (InterruptedException e) {
-                    logger.info("Interrupted while waiting for netconf connection");
+                    Thread.currentThread().interrupt();
+                    logger.error("Interrupted while waiting for netconf connection");
+                    // uncaught exception handler will deal with this failure
+                    throw new RuntimeException("Interrupted while waiting for netconf connection", e);
                 }
             }
         };
index 8b8c886a1c0328b558a4992c7d67b6b99b71800c..67d95bb90f74ac2098c4677e5cdab002cb1624da 100644 (file)
@@ -110,6 +110,7 @@ public class NetconfClient implements Closeable {
         try {
             return sessionListener.getLastMessage(attempts, attemptMsDelay);
         } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
             throw new RuntimeException(this + " Cannot read message from " + address, e);
         } catch (IllegalStateException e) {
             throw new IllegalStateException(this + " Cannot read message from " + address, e);
index 32de75ca3969a039bbeb0046fc4c2a7b55d3462d..6df19155110e098ea093b370f2473e8ed9135704 100644 (file)
@@ -108,6 +108,7 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
                                         netconf_ssh_input.join();
                                     }
                                 } catch (InterruptedException e) {
+                                    Thread.currentThread().interrupt();
                                    logger.error("netconf_ssh_input join error ",e);
                                 }
 
@@ -116,6 +117,7 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
                                         netconf_ssh_output.join();
                                     }
                                 } catch (InterruptedException e) {
+                                    Thread.currentThread().interrupt();
                                     logger.error("netconf_ssh_output join error ",e);
                                 }
 
index 07c81b0ccb7127aad1a5ffc14a3e6d6412dd1446..4b9bfbf5f826ee13c34127d902c2ad583d5f8eb4 100644 (file)
@@ -57,6 +57,7 @@ public class ChannelInputStream extends InputStream implements ChannelInboundHan
                 try {
                     lock.wait();
                 } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
                     throw new RuntimeException(e);
                 }
             }
index 969aa630a1519f712e24af8ef0e0cd0025022635..0cd1612808b4a67e8c0eb38c0dec013e4090dee3 100644 (file)
@@ -45,8 +45,8 @@ abstract public class ComponentActivatorAbstractBase implements
     Logger logger = LoggerFactory
             .getLogger(ComponentActivatorAbstractBase.class);
     private DependencyManager dm;
-    private ConcurrentMap<ImmutablePair<String, Object>, Component> dbInstances = (ConcurrentMap<ImmutablePair<String, Object>, Component>) new ConcurrentHashMap<ImmutablePair<String, Object>, Component>();
-    private ConcurrentMap<Object, Component> dbGlobalInstances = (ConcurrentMap<Object, Component>) new ConcurrentHashMap<Object, Component>();
+    private ConcurrentMap<ImmutablePair<String, Object>, Component> dbInstances = new ConcurrentHashMap<ImmutablePair<String, Object>, Component>();
+    private ConcurrentMap<Object, Component> dbGlobalInstances = new ConcurrentHashMap<Object, Component>();
 
     /**
      * Method that should be overriden by the derived class for customization
@@ -253,6 +253,11 @@ abstract public class ComponentActivatorAbstractBase implements
                             containerName, imps[i]);
                     Component c = this.dbInstances.get(key);
                     if (c != null) {
+                        if (c.getService() != null) {
+                            c.invokeCallbackMethod(new Object[] { c.getService() }, "containerStop",
+                                                   new Class[][] {{ Component.class}, {} },
+                                                   new Object[][] { {c}, {} });
+                        }
                         // Now remove the component from dependency manager,
                         // which will implicitely stop it first
                         this.dm.remove(c);
index a34cbb5db80f8f7232bf8dac7c2c41e7aba42c01..7a3625a229ef5ae04f76de4a6eabe28feef657b7 100644 (file)
@@ -800,8 +800,7 @@ public class SimpleForwardingImpl implements IfNewHostNotify,
         log.debug("Host Facing Port in a container came up, install the rules for all hosts from this port !");
         Set<HostNodeConnector> allHosts = this.hostTracker.getAllHosts();
         for (HostNodeConnector host : allHosts) {
-            if (node.equals(host.getnodeconnectorNode())
-                    && swPort.equals(host.getnodeConnector())) {
+            if (node.equals(host.getnodeconnectorNode())) {
                 /*
                  * This host resides behind the same switch and port for which a port up
                  * message is received. Ideally this should not happen, but if it does,