Bump up odlmicro from Neon to Aluminium. 48/92048/12
authorVenkataSatya Jonnadula <rsankar@luminanetworks.com>
Tue, 11 Aug 2020 17:00:51 +0000 (22:30 +0530)
committerVenkataSatya Jonnadula <ravi.jonnadula@gmail.com>
Tue, 8 Sep 2020 15:30:42 +0000 (21:00 +0530)
This patch is to bump up odlmicro to latest Aluminium.
This involves:
1. Version changes to poms to point to latest platform versions
2. There are lot of changes in MD-SAL and controller from Neon
to Aluminium. Some of the packages which were deprecated in controller
in earlier releases are completely removed and we are forced to migrate
to MD-SAL packages instead.

JIRA: ODLMICRO-29

Signed-off-by: VenkataSatya Jonnadula <rsankar@luminanetworks.com>
Change-Id: I9a09bd938d4d9be82d5a83b18f3cd9ba458c52d5

49 files changed:
micro-core/pom.xml
micro-core/src/main/java/org/opendaylight/aaa/micro/AAAModule.java
micro-core/src/main/java/org/opendaylight/controller/micro/DataBrokerModule.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/controller/micro/GlobalBossGroup.java
micro-core/src/main/java/org/opendaylight/controller/micro/GlobalTimer.java
micro-core/src/main/java/org/opendaylight/controller/micro/GlobalWorkerGroup.java
micro-core/src/main/java/org/opendaylight/controller/micro/InMemoryControllerModule.java
micro-core/src/main/java/org/opendaylight/infrautils/karaf/shell/KarafStandaloneShell.java
micro-core/src/main/java/org/opendaylight/infrautils/web/WebModule.java
micro-core/src/main/java/org/opendaylight/mdsal/micro/MdsalModule.java
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractBaseDataBrokerTest.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractConcurrentDataBrokerTest.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataBrokerTest.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataBrokerTestCustomizer.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataTreeChangeListenerTest.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractNotificationBrokerTest.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractSchemaAwareTest.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AssertCollections.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/ConcurrentDataBrokerTestCustomizer.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/DataBrokerTestCustomizer.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/MockAdapterContext.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/MockSchemaService.java [new file with mode: 0644]
micro-core/src/main/java/org/opendaylight/restconf/micro/RestConfWiring.java
micro-core/src/main/java/org/opendaylight/serviceutils/micro/UpgradeModule.java
micro-core/src/test/java/org/opendaylight/controller/micro/test/InMemoryControllerModuleTest.java
micro-core/src/test/java/org/opendaylight/infrautils/micro/test/DiagStatusModuleTest.java
micro-core/src/test/java/org/opendaylight/infrautils/micro/test/MainTest.java
micro-core/src/test/java/org/opendaylight/mdsal/micro/test/InMemoryMdsalModuleTest.java
micro-core/src/test/java/org/opendaylight/restconf/micro/test/RestConfModuleTest.java
micro-netconf/pom.xml
micro-netconf/src/main/java/org/opendaylight/netconf/micro/NetconfMain.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/NetconfModule.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/annotations/AggregatedNetconfOperationServiceFactory.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/annotations/AggregatedNetconfOperationServiceFactoryMappers.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/annotations/GlobalNetconfProcessingExecutor.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/annotations/GlobalNetconfSshScheduledExecutor.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/annotations/MapperAggregatorRegistry.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/annotations/MdsalNetconfConnector.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/annotations/NetconfAuthProvider.java
micro-netconf/src/main/java/org/opendaylight/netconf/micro/annotations/NetconfClientDispatcher.java
micro-netvirt/pom.xml
micro-openflowplugin/pom.xml
micro-openflowplugin/src/main/java/org/opendaylight/openflowplugin/micro/OpenFlowJavaWiring.java
micro-openflowplugin/src/main/java/org/opendaylight/openflowplugin/micro/OpenFlowPluginModule.java
micro-openflowplugin/src/main/java/org/opendaylight/openflowplugin/micro/OpenflowPluginMain.java
micro-openflowplugin/src/test/java/org/opendaylight/openflowplugin/micro/test/OpenFlowPluginModuleTest.java
micro-ovsdb/pom.xml
micro-ovsdb/src/test/java/org/opendaylight/ovsdb/micro/test/OvsdbModuleTest.java
pom.xml

index 278f160f98c499d63b99f26ba4a9e3d195c52f28..9b1b1bb316e4cd01e0b1b47982f9ccfc64e8a8f0 100644 (file)
     <relativePath>../</relativePath>
   </parent>
 
-  <groupId>org.opendaylight.odlmicro</groupId>
   <artifactId>micro-core</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
 
   <dependencies>
-
     <dependency>
       <groupId>org.immutables</groupId>
       <artifactId>value</artifactId>
+      <version>2.7.5</version>
     </dependency>
 
     <dependency>
@@ -43,7 +41,6 @@
     <dependency>
       <groupId>io.netty</groupId>
       <artifactId>netty-common</artifactId>
-      <version>4.1.31.Final</version>
     </dependency>
 
     <!--infrautils-->
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>netty-event-executor-config</artifactId>
-      <version>0.10.0</version>
     </dependency>
 
     <!--controller-->
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>netty-threadgroup-config</artifactId>
-      <version>0.10.0</version>
     </dependency>
 
     <!--controller-->
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>netty-timer-config</artifactId>
-      <version>0.10.0</version>
     </dependency>
 
     <!--controller-->
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>threadpool-config-impl</artifactId>
-      <version>0.10.0</version>
     </dependency>
 
     <!--mdsal-->
 
     <!--mdsal-->
     <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>sal-binding-broker-impl</artifactId>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-api</artifactId>
+    </dependency>
+
+    <!--mdsal -->
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-dom-broker</artifactId>
+    </dependency>
+
+    <!--mdsal-->
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-spi</artifactId>
+    </dependency>
+
+    <!--mdsal-->
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-test-utils</artifactId>
+    </dependency>
+
+    <!--mdsal-->
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-dom-codec-api</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-dom-adapter</artifactId>
+      <type>test-jar</type>
+      <!-- We are building on top of abstract test classes -->
+      <scope>compile</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-dom-inmemory-datastore</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-runtime-spi</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-runtime-api</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>odl-mdsal-binding-runtime</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
     </dependency>
 
     <!--restconf-->
 
     <!--aaa-->
     <dependency>
-       <groupId>org.opendaylight.aaa</groupId>
-       <artifactId>aaa-cert</artifactId>
-       <version>0.9.0</version>
-       <scope>compile</scope>
+      <groupId>org.opendaylight.aaa</groupId>
+      <artifactId>aaa-cert</artifactId>
+      <scope>compile</scope>
     </dependency>
 
     <!--aaa-->
     <dependency>
-       <groupId>org.opendaylight.aaa</groupId>
-       <artifactId>aaa-encrypt-service-impl</artifactId>
-       <version>0.9.0</version>
+      <groupId>org.opendaylight.aaa</groupId>
+      <artifactId>aaa-encrypt-service-impl</artifactId>
     </dependency>
 
     <!--aaa-->
     <dependency>
-       <groupId>org.opendaylight.aaa</groupId>
-       <artifactId>aaa-shiro</artifactId>
-       <version>0.9.0</version>
+      <groupId>org.opendaylight.aaa</groupId>
+      <artifactId>aaa-shiro</artifactId>
     </dependency>
 
-    <!--aaa -->
-    <!--dependency>
-       <groupId>org.opendaylight.aaa</groupId>
-       <artifactId>aaa-shiro-api</artifactId>
-       <version>0.9.0</version>
-    </dependency-->
-
-    <!--aaa-->
-    <!--dependency>
-       <groupId>org.opendaylight.aaa</groupId>
-       <artifactId>aaa-shiro-act</artifactId>
-       <version>0.9.0</version>
-    </dependency-->
-
     <!--aaa-->
     <dependency>
       <groupId>org.opendaylight.aaa</groupId>
       <artifactId>aaa-authn-api</artifactId>
-       <version>0.9.0</version>
     </dependency>
 
     <!--aaa-->
     <dependency>
       <groupId>org.opendaylight.aaa.web</groupId>
       <artifactId>web-jetty-impl</artifactId>
-      <version>0.9.0</version>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.aaa.web</groupId>
       <artifactId>servlet-jersey2</artifactId>
-      <version>0.9.0</version>
     </dependency>
 
     <!--serviceutils-->
     <dependency>
       <groupId>org.opendaylight.serviceutils</groupId>
       <artifactId>srm-api</artifactId>
-      <version>0.3.0</version>
+      <version>0.6.0-SNAPSHOT</version>
     </dependency>
 
     <!--serviceutils-->
     <dependency>
       <groupId>org.opendaylight.serviceutils</groupId>
       <artifactId>srm-impl</artifactId>
-      <version>0.3.0</version>
+      <version>0.6.0-SNAPSHOT</version>
     </dependency>
 
     <!--serviceutils-->
     <dependency>
       <groupId>org.opendaylight.serviceutils</groupId>
       <artifactId>upgrade</artifactId>
-      <version>0.3.0</version>
+      <version>0.6.0-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
 
     <dependency>
       <groupId>org.opendaylight.aaa.web</groupId>
       <artifactId>testutils</artifactId>
-      <version>0.9.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <artifactId>inject.guice.extensions.jsr250</artifactId>
       <scope>compile</scope>
     </dependency>
-
-    <!--controller-->
     <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>blueprint</artifactId>
-      <version>0.10.0</version>
-      <scope>compile</scope>
+      <groupId>org.glassfish.jersey.inject</groupId>
+      <artifactId>jersey-hk2</artifactId>
+      <version>2.28</version>
     </dependency>
-
   </dependencies>
 
   <build>
       <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <!-- TODO upstream version into odlparent pluginManagement -->
-        <version>3.1.1</version>
         <configuration>
           <descriptors>
             <descriptor>src/assembly/micro.xml</descriptor>
       </plugin>
     </plugins>
   </build>
-</project>
+</project>
\ No newline at end of file
index 968bbaa6674bea1fdd8e3388053beff3513dbb69..9fae8149b0dcc376eb90047096990cabafbb5c86 100644 (file)
@@ -9,9 +9,9 @@ package org.opendaylight.aaa.micro;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
-import javax.annotation.Nullable;
 import javax.inject.Singleton;
-
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.aaa.api.AuthenticationException;
 import org.opendaylight.aaa.api.Claim;
 import org.opendaylight.aaa.api.CredentialAuth;
@@ -48,6 +48,12 @@ public class AAAModule extends AbstractModule {
                 }
                 return null;
             }
+
+            @Override
+            public @NonNull Class<PasswordCredentials> credentialClass() {
+                // TODO Auto-generated method stub
+                return PasswordCredentials.class;
+            }
         };
     }
 }
diff --git a/micro-core/src/main/java/org/opendaylight/controller/micro/DataBrokerModule.java b/micro-core/src/main/java/org/opendaylight/controller/micro/DataBrokerModule.java
new file mode 100644 (file)
index 0000000..8b7b786
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016 Red Hat, 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.micro;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Throwables;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
+import org.opendaylight.mdsal.micro.binding.dom.adapter.AbstractConcurrentDataBrokerTest;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
+
+@Beta
+public class DataBrokerModule {
+    private final boolean useMTDataTreeChangeListenerExecutor;
+
+    private AbstractConcurrentDataBrokerTest dataBrokerTest;
+
+    public DataBrokerModule(final boolean useMTDataTreeChangeListenerExecutor) {
+        this.useMTDataTreeChangeListenerExecutor = useMTDataTreeChangeListenerExecutor;
+    }
+
+    public static DataBroker dataBroker() {
+        return new DataBrokerModule(false).getDataBroker();
+    }
+
+    // Suppress IllegalCatch because of AbstractDataBrokerTest (change later)
+    @SuppressWarnings("checkstyle:IllegalCatch")
+    public DataBroker getDataBroker() {
+        try {
+            // This is a little bit "upside down" - in the future,
+            // we should probably put what is in AbstractDataBrokerTest
+            // into this DataBrokerTestModule, and make AbstractDataBrokerTest
+            // use it, instead of the way around it currently is (the opposite);
+            // this is just for historical reasons... and works for now.
+            dataBrokerTest = new AbstractConcurrentDataBrokerTest(useMTDataTreeChangeListenerExecutor) {};
+            dataBrokerTest.setup();
+            return dataBrokerTest.getDataBroker();
+        } catch (Exception e) {
+            Throwables.throwIfUnchecked(e);
+            throw new IllegalStateException(e);
+        }
+    }
+
+    public DOMDataBroker getDOMDataBroker() {
+        return dataBrokerTest.getDomBroker();
+    }
+
+    public AdapterContext getAdapterContext() {
+        return dataBrokerTest.getDataBrokerTestCustomizer().getAdapterContext();
+    }
+
+    public CurrentAdapterSerializer getCurrentAdapterSerializer() {
+        return dataBrokerTest.getDataBrokerTestCustomizer().getAdapterContext().currentSerializer();
+    }
+
+    @SuppressFBWarnings(value = "NM_CONFUSING")
+    public DOMNotificationRouter getDOMNotificationRouter() {
+        return dataBrokerTest.getDataBrokerTestCustomizer().getDomNotificationRouter();
+    }
+
+    public DOMSchemaService getSchemaService() {
+        return dataBrokerTest.getDataBrokerTestCustomizer().getSchemaService();
+    }
+
+    public EffectiveModelContextProvider getSchemaContextProvider() {
+        return dataBrokerTest.getDataBrokerTestCustomizer().getSchemaService()::getGlobalContext;
+    }
+}
index 531a646cf3bae48560c2802d2b19f1436129ee6c..4673f4bbd21c4e46a9a610dc07b79f86e362cb7b 100644 (file)
@@ -13,11 +13,9 @@ import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import io.netty.channel.EventLoopGroup;
-
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
 
 /**
index e0f79c33cb5388e1e3819a061c767c25c1e63664..65cf9b2e60dcc405c7f1309dcbd7e95f9696b6d9 100644 (file)
@@ -13,11 +13,9 @@ import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import io.netty.util.Timer;
-
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
 
 /**
index f0dfce4cc91d06ac76313a016f2d9ecfe81b9bab..bca6160b6771ed2ccd64b179e6a61db15f387a1e 100644 (file)
@@ -13,11 +13,9 @@ import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import io.netty.channel.EventLoopGroup;
-
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
 
 /**
index 0d7fdb8b726e0ba2d113b1e7b30002b7a395e601..f1eea809b10aac17a4e4515628d9e9ff9e07199b 100644 (file)
@@ -16,42 +16,49 @@ import javax.inject.Singleton;
 import org.opendaylight.controller.config.yang.netty.eventexecutor.AutoCloseableEventExecutor;
 import org.opendaylight.controller.config.yang.netty.threadgroup.NioEventLoopGroupCloseable;
 import org.opendaylight.controller.config.yang.netty.timer.HashedWheelTimerCloseable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
-import org.opendaylight.controller.md.sal.binding.api.NotificationService;
-import org.opendaylight.controller.md.sal.binding.compat.HeliumRpcProviderRegistry;
-import org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataBrokerAdapter;
-import org.opendaylight.controller.md.sal.binding.impl.BindingDOMNotificationPublishServiceAdapter;
-import org.opendaylight.controller.md.sal.binding.impl.BindingDOMNotificationServiceAdapter;
-import org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcProviderServiceAdapter;
-import org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcServiceAdapter;
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
-import org.opendaylight.controller.md.sal.binding.test.DataBrokerTestModule;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
-import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService;
-import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService;
-import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter;
-import org.opendaylight.controller.md.sal.dom.broker.impl.PingPongDataBroker;
-import org.opendaylight.controller.md.sal.dom.broker.impl.mount.DOMMountPointServiceImpl;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.infrautils.inject.guice.AbstractCloseableModule;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcProviderServiceAdapter;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcServiceAdapter;
+import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
+import org.opendaylight.mdsal.dom.api.DOMActionService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMMountPointService;
+import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
+import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter;
+import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
+import org.opendaylight.mdsal.eos.binding.dom.adapter.BindingDOMEntityOwnershipServiceAdapter;
+import org.opendaylight.mdsal.eos.dom.simple.SimpleDOMEntityOwnershipService;
 import org.opendaylight.mdsal.micro.MdsalModule;
-import org.opendaylight.mdsal.micro.PingPong;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.dom.impl.DOMClusterSingletonServiceProviderImpl;
 
 
 @SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
 public class InMemoryControllerModule extends AbstractCloseableModule {
 
-    // TODO re-use org.opendaylight.controller.md.sal.binding.impl.BindingBrokerWiring
+    // TODO re-use
+    // org.opendaylight.controller.md.sal.binding.impl.BindingBrokerWiring
 
-    // TODO propose @Inject and @PreDestroy close() annotations at source to simplify this, a lot...
+    // TODO propose @Inject and @PreDestroy close() annotations at source to
+    // simplify this, a lot...
 
-    private BindingToNormalizedNodeCodec bindingToNormalizedNodeCodec;
+    private CurrentAdapterSerializer currentAdapterSerializer;
+    private AdapterContext adapterContext;
     private BindingDOMNotificationPublishServiceAdapter bindingDOMNotificationPublishServiceAdapter;
     private DOMNotificationRouter domNotificationPublishService;
 
@@ -59,58 +66,63 @@ public class InMemoryControllerModule extends AbstractCloseableModule {
     protected void configureCloseables() {
         install(new MdsalModule());
 
-        // TODO this is just for early stage POC! switch to real CDS wiring here, eventually..
-        DataBrokerTestModule dataBrokerTestModule = new DataBrokerTestModule(true);
+        // TODO this is just for early stage POC! switch to real CDS wiring here,
+        // eventually..
+        DataBrokerModule dataBrokerTestModule = new DataBrokerModule(true);
+
         DataBroker dataBroker = dataBrokerTestModule.getDataBroker();
-        DOMSchemaService domSchemaService = dataBrokerTestModule.getSchemaService();
+        bind(DataBroker.class).toInstance(dataBroker);
 
+        DOMSchemaService domSchemaService = dataBrokerTestModule.getSchemaService();
         bind(DOMSchemaService.class).toInstance(domSchemaService);
+
         DOMDataBroker domDefaultDataBroker = dataBrokerTestModule.getDOMDataBroker();
         bind(DOMDataBroker.class).toInstance(domDefaultDataBroker);
-        bind(DataBroker.class).toInstance(dataBroker);
 
-        bindingToNormalizedNodeCodec = dataBrokerTestModule.getBindingToNormalizedNodeCodec();
-        bind(BindingToNormalizedNodeCodec.class).toInstance(bindingToNormalizedNodeCodec);
+        currentAdapterSerializer = dataBrokerTestModule.getCurrentAdapterSerializer();
+        bind(CurrentAdapterSerializer.class).toInstance(currentAdapterSerializer);
 
-        PingPongDataBroker domPingPongDataBroker = new PingPongDataBroker(domDefaultDataBroker);
-        bind(DOMDataBroker.class).annotatedWith(PingPong.class).toInstance(domPingPongDataBroker);
-        bind(DataBroker.class).annotatedWith(PingPong.class)
-                .toInstance(new BindingDOMDataBrokerAdapter(domPingPongDataBroker, bindingToNormalizedNodeCodec));
+        adapterContext = dataBrokerTestModule.getAdapterContext();
 
         domNotificationPublishService = dataBrokerTestModule.getDOMNotificationRouter();
         bind(DOMNotificationService.class).toInstance(domNotificationPublishService);
-        bind(NotificationService.class).toInstance(
-                new BindingDOMNotificationServiceAdapter(bindingToNormalizedNodeCodec, domNotificationPublishService));
+        bind(NotificationService.class)
+                .toInstance(new BindingDOMNotificationServiceAdapter(adapterContext, domNotificationPublishService));
 
-        bindingDOMNotificationPublishServiceAdapter = new BindingDOMNotificationPublishServiceAdapter(
-                bindingToNormalizedNodeCodec, domNotificationPublishService);
+        bindingDOMNotificationPublishServiceAdapter =
+                new BindingDOMNotificationPublishServiceAdapter(adapterContext, domNotificationPublishService);
         bind(NotificationPublishService.class).toInstance(bindingDOMNotificationPublishServiceAdapter);
-        bind(BindingNormalizedNodeSerializer.class).toInstance(bindingToNormalizedNodeCodec);
+        bind(BindingNormalizedNodeSerializer.class).toInstance(currentAdapterSerializer);
 
         bind(DOMMountPointService.class).to(DOMMountPointServiceImpl.class);
 
         DOMRpcRouter domRpcRouter = DOMRpcRouter.newInstance(domSchemaService);
         bind(DOMRpcRouter.class).toInstance(domRpcRouter);
 
-        DOMRpcService rpcService = domRpcRouter.getRpcService();
-        bind(DOMRpcService.class).toInstance(rpcService);
-
-        org.opendaylight.controller.md.sal.dom.broker.impl.DOMRpcRouter controllerDOMRpcService
-            = new org.opendaylight.controller.md.sal.dom.broker.impl.DOMRpcRouter(
-                    rpcService, domRpcRouter.getRpcProviderService());
-        bind(org.opendaylight.controller.md.sal.dom.api.DOMRpcService.class).toInstance(controllerDOMRpcService);
-        bind(org.opendaylight.controller.md.sal.dom.api.DOMRpcProviderService.class)
-                .toInstance(controllerDOMRpcService);
+        DOMRpcService domRpcService = domRpcRouter.getRpcService();
+        bind(DOMRpcService.class).toInstance(domRpcService);
 
         DOMRpcProviderService domRpcProviderService = domRpcRouter.getRpcProviderService();
-        org.opendaylight.controller.md.sal.dom.api.DOMRpcService controllerDomRpcService
-            = new org.opendaylight.controller.md.sal.dom.broker.impl.DOMRpcRouter(rpcService, domRpcProviderService);
-        BindingDOMRpcServiceAdapter bindingDOMRpcServiceAdapter
-            = new BindingDOMRpcServiceAdapter(controllerDomRpcService, bindingToNormalizedNodeCodec);
-        BindingDOMRpcProviderServiceAdapter bindingDOMRpcProviderServiceAdapter
-            = new BindingDOMRpcProviderServiceAdapter(controllerDOMRpcService, bindingToNormalizedNodeCodec);
-        bind(RpcProviderRegistry.class).toInstance(
-                new HeliumRpcProviderRegistry(bindingDOMRpcServiceAdapter, bindingDOMRpcProviderServiceAdapter));
+        bind(DOMRpcProviderService.class).toInstance(domRpcProviderService);
+
+        DOMActionProviderService domActionProviderService = domRpcRouter.getActionProviderService();
+        bind(DOMActionProviderService.class).toInstance(domActionProviderService);
+
+        DOMActionService domActionService = domRpcRouter.getActionService();
+        bind(DOMActionService.class).toInstance(domActionService);
+
+        BindingDOMRpcServiceAdapter bindingDOMRpcServiceAdapter =
+                new BindingDOMRpcServiceAdapter(adapterContext, domRpcService);
+        bind(RpcConsumerRegistry.class).toInstance(bindingDOMRpcServiceAdapter);
+
+        BindingDOMRpcProviderServiceAdapter bindingDOMRpcProviderServiceAdapter =
+                new BindingDOMRpcProviderServiceAdapter(adapterContext, domRpcProviderService);
+        bind(RpcProviderService.class).toInstance(bindingDOMRpcProviderServiceAdapter);
+
+        SimpleDOMEntityOwnershipService eos = new SimpleDOMEntityOwnershipService();
+        bind(EntityOwnershipService.class).toInstance(new BindingDOMEntityOwnershipServiceAdapter(eos, adapterContext));
+        bind(ClusterSingletonServiceProvider.class).toInstance(new DOMClusterSingletonServiceProviderImpl(eos));
+
     }
 
     // NETCONF
@@ -150,8 +162,6 @@ public class InMemoryControllerModule extends AbstractCloseableModule {
 
     @Override
     public void close() throws Exception {
-        bindingToNormalizedNodeCodec.close();
-        bindingDOMNotificationPublishServiceAdapter.close();
         domNotificationPublishService.close();
     }
 }
index 9e9f68d36da1ea39f245e23c46397f76b20c55cf..708a066b019736bfe221760c202ea74986c23258 100644 (file)
@@ -11,6 +11,7 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.inject.Injector;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Set;
@@ -57,6 +58,7 @@ public class KarafStandaloneShell {
         }
 
         @SuppressWarnings("checkstyle:RegexpSingleLineJava")
+        @SuppressFBWarnings(value = { "UPM_UNCALLED_PRIVATE_METHOD", "UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" })
         // TODO This should ideally only be in src/test, not src/main ...
         private void testAllRegisteredCommands() throws Exception {
             SessionFactory sessionFactory = createSessionFactory(null);
index 32ad205ef186316c05b89d2cc4994f2855edc634..395e7f344c6c40293f16cb06b5b35678dd5d2d40 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.infrautils.web;
 
 import com.google.inject.AbstractModule;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.opendaylight.aaa.web.WebContextSecurer;
 import org.opendaylight.aaa.web.WebServer;
 import org.opendaylight.aaa.web.jetty.JettyWebServer;
@@ -19,19 +20,23 @@ import org.opendaylight.aaa.web.servlet.jersey2.JerseyServletSupport;
  *
  * @author Michael Vorburger.ch
  */
+@SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
 public class WebModule extends AbstractModule {
 
     // TODO note (new) org.opendaylight.aaa.web.testutils.WebTestModule .. integrate?
+//    private JettyWebServer webserver;
 
     @Override
     protected void configure() {
         // TODO read port from a -D parameter or configuration file instead of hard-coding
-        bind(WebServer.class).toInstance(new JettyWebServer(8181));
+//        webserver = new JettyWebServer(8181);
+        bind(WebServer.class).to(JettyWebServer.class);
 
         // JAX-RS
         bind(ServletSupport.class).to(JerseyServletSupport.class);
 
+
         // TODO replace this NOOP WebContextSecurer with one with a fixed uid/pwd for HTTP BASIC (and ditch AAA)
-        bind(WebContextSecurer.class).toInstance((webContextBuilder, urlPatterns) -> { });
+        bind(WebContextSecurer.class).toInstance((webContextBuilder, asyncSupported, urlPatterns) -> { });
     }
 }
index fba98ff616db1af3f7179363cf05434f8652d6f8..5129717bece5729a0f3c42bb89a05fdbce3822a5 100644 (file)
@@ -8,32 +8,8 @@
 package org.opendaylight.mdsal.micro;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import javax.inject.Singleton;
-import org.opendaylight.controller.sal.core.compat.DOMDataBrokerAdapter;
-import org.opendaylight.controller.sal.core.compat.DOMNotificationServiceAdapter;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcProviderServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
-import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMMountPointService;
-import org.opendaylight.mdsal.dom.api.DOMNotificationService;
-import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
-import org.opendaylight.mdsal.dom.api.DOMRpcService;
-import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
-import org.opendaylight.mdsal.dom.broker.DOMRpcRouter;
-import org.opendaylight.mdsal.dom.broker.pingpong.PingPongDataBroker;
-import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
-import org.opendaylight.mdsal.eos.binding.dom.adapter.BindingDOMEntityOwnershipServiceAdapter;
 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService;
 import org.opendaylight.mdsal.eos.dom.simple.SimpleDOMEntityOwnershipService;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
-import org.opendaylight.mdsal.singleton.dom.impl.DOMClusterSingletonServiceProviderImpl;
 
 @SuppressWarnings("deprecation") // sure, but that's the point of this class...
 public class MdsalModule extends AbstractModule {
@@ -49,80 +25,4 @@ public class MdsalModule extends AbstractModule {
         // TODO This is WRONG; later need to use the DistributedEntityOwnershipService instead here!
         bind(DOMEntityOwnershipService.class).to(SimpleDOMEntityOwnershipService.class);
     }
-
-    @Provides
-    @Singleton DataBroker getDataBroker(DOMDataBroker domDataBroker, BindingToNormalizedNodeCodec codec) {
-        return new BindingDOMDataBrokerAdapter(domDataBroker, codec);
-    }
-
-    @Provides
-    @Singleton DOMDataBroker getDOMDataBroker(org.opendaylight.controller.md.sal.dom.api.DOMDataBroker controllerDDB) {
-        return new DOMDataBrokerAdapter(controllerDDB);
-    }
-
-    @Provides
-    @Singleton
-    @PingPong DOMDataBroker getDOMPingPongDataBroker(DOMDataBroker domDataBroker) {
-        return new PingPongDataBroker(domDataBroker);
-    }
-
-    @Provides
-    @Singleton
-    @PingPong
-    DataBroker getPingPongDOMDataBroker(@PingPong DOMDataBroker domDataBroker, BindingToNormalizedNodeCodec codec) {
-        return new BindingDOMDataBrokerAdapter(domDataBroker, codec);
-    }
-
-    @Provides
-    @Singleton
-    BindingToNormalizedNodeCodec getBindingToNormalizedNodeCodec(
-            org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec controllerCodec) {
-        return controllerCodec;
-    }
-
-    @Provides
-    @Singleton DOMNotificationService getDOMNotificationService(
-            org.opendaylight.controller.md.sal.dom.api.DOMNotificationService controllerDNS) {
-        return new DOMNotificationServiceAdapter(controllerDNS);
-    }
-
-    @Provides
-    @Singleton DOMMountPointService getDOMMountPoint(
-            /* org.opendaylight.controller.md.sal.dom.api.DOMMountPointService controllerDMP */) {
-        // TODO doesn't the mdsal DOMMountPointServiceImpl need the controller DOMMountPointService ?!
-        return new DOMMountPointServiceImpl();
-    }
-
-    @Provides
-    @Singleton EntityOwnershipService getDOMEntityOwnershipService(
-            DOMEntityOwnershipService domService, BindingNormalizedNodeSerializer conversionCodec) {
-        return new BindingDOMEntityOwnershipServiceAdapter(domService, conversionCodec);
-    }
-
-    @Provides
-    @Singleton ClusterSingletonServiceProvider getClusterSingletonServiceProvider(DOMEntityOwnershipService eos) {
-        return new DOMClusterSingletonServiceProviderImpl(eos);
-    }
-
-//    @Provides
-//    @Singleton DOMRpcService getDOMService(org.opendaylight.controller.md.sal.dom.api.DOMRpcService controllerDRSA) {
-//        return new DOMRpcServiceAdapter(controllerDRSA);
-//    }
-
-    @Provides
-    @Singleton
-    RpcConsumerRegistry getRpcConsumerRegistry(DOMRpcService domService, BindingToNormalizedNodeCodec codec) {
-        return new BindingDOMRpcServiceAdapter(domService, codec);
-    }
-
-    @Provides
-    @Singleton
-    RpcProviderService getRpcProviderService(DOMRpcProviderService domRpcRegistry, BindingToNormalizedNodeCodec codec) {
-        return new BindingDOMRpcProviderServiceAdapter(domRpcRegistry, codec);
-    }
-
-    @Provides
-    @Singleton DOMRpcProviderService getDOMRpcProviderService(DOMRpcRouter domRpcRouter) {
-        return domRpcRouter.getRpcProviderService();
-    }
 }
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractBaseDataBrokerTest.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractBaseDataBrokerTest.java
new file mode 100644 (file)
index 0000000..317c8bf
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2017 Red Hat, 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.mdsal.micro.binding.dom.adapter;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+
+public abstract class AbstractBaseDataBrokerTest extends AbstractSchemaAwareTest {
+    private static final int ASSERT_COMMIT_DEFAULT_TIMEOUT = 5000;
+
+    private AbstractDataBrokerTestCustomizer testCustomizer;
+    private DataBroker dataBroker;
+    private DOMDataBroker domBroker;
+
+    protected abstract AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer();
+
+    public AbstractDataBrokerTestCustomizer getDataBrokerTestCustomizer() {
+        if (testCustomizer == null) {
+            throw new IllegalStateException("testCustomizer not yet set by call to createDataBrokerTestCustomizer()");
+        }
+        return testCustomizer;
+    }
+
+    @Override
+    protected void setupWithSchema(final EffectiveModelContext context) {
+        testCustomizer = createDataBrokerTestCustomizer();
+        dataBroker = testCustomizer.createDataBroker();
+        domBroker = testCustomizer.getDOMDataBroker();
+        testCustomizer.updateSchema(context);
+    }
+
+    public DataBroker getDataBroker() {
+        return dataBroker;
+    }
+
+    public DOMDataBroker getDomBroker() {
+        return domBroker;
+    }
+
+    protected static final void assertCommit(final ListenableFuture<?> commit) {
+        assertCommit(commit, ASSERT_COMMIT_DEFAULT_TIMEOUT);
+    }
+
+    protected static final void assertCommit(final ListenableFuture<?> commit, final long timeoutInMS) {
+        try {
+            commit.get(timeoutInMS, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractConcurrentDataBrokerTest.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractConcurrentDataBrokerTest.java
new file mode 100644 (file)
index 0000000..b92819e
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2017 Red Hat, 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.mdsal.micro.binding.dom.adapter;
+
+/**
+ * Abstract base for DataBroker tests.
+ *
+ * <p>Uses single thread executor for the Serialized DOM DataBroker (instead of the direct executor used by the
+ * AbstractDataBrokerTest) in order to allow tests to use the DataBroker concurrently from several threads.
+ *
+ * @author Michael Vorburger
+ */
+public abstract class AbstractConcurrentDataBrokerTest extends AbstractBaseDataBrokerTest {
+    private final boolean useMTDataTreeChangeListenerExecutor;
+
+    protected AbstractConcurrentDataBrokerTest() {
+        this(false);
+    }
+
+    protected AbstractConcurrentDataBrokerTest(final boolean useMTDataTreeChangeListenerExecutor) {
+        this.useMTDataTreeChangeListenerExecutor = useMTDataTreeChangeListenerExecutor;
+    }
+
+    @Override
+    protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
+        return new ConcurrentDataBrokerTestCustomizer(useMTDataTreeChangeListenerExecutor);
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataBrokerTest.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataBrokerTest.java
new file mode 100644 (file)
index 0000000..d96f420
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2014 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.mdsal.micro.binding.dom.adapter;
+
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+
+/**
+ * Abstract base for DataBroker tests. Note that it performs synchronous commits via a direct executor which can cause
+ * issues if used in a concurrent manner so it is recommended to use AbstractConcurrentDataBrokerTest instead.
+ */
+public class AbstractDataBrokerTest extends AbstractBaseDataBrokerTest {
+    @Override
+    protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
+        return new DataBrokerTestCustomizer();
+    }
+
+    @Override
+    protected void setupWithSchema(final EffectiveModelContext context) {
+        super.setupWithSchema(context);
+        setupWithDataBroker(getDataBroker());
+    }
+
+    protected void setupWithDataBroker(final DataBroker dataBroker) {
+        // Intentionally left No-op, subclasses may customize it
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataBrokerTestCustomizer.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataBrokerTestCustomizer.java
new file mode 100644 (file)
index 0000000..81408b7
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2017 Red Hat, 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.mdsal.micro.binding.dom.adapter;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
+import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker;
+import org.opendaylight.mdsal.dom.spi.store.DOMStore;
+import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStore;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+
+public abstract class AbstractDataBrokerTestCustomizer {
+
+    private DOMDataBroker domDataBroker;
+    private final DOMNotificationRouter domNotificationRouter;
+    private final MockSchemaService schemaService;
+    private ImmutableMap<LogicalDatastoreType, DOMStore> datastores;
+    private final MockAdapterContext adapterContext;
+
+    public ImmutableMap<LogicalDatastoreType, DOMStore> createDatastores() {
+        return ImmutableMap.<LogicalDatastoreType, DOMStore>builder()
+                .put(LogicalDatastoreType.OPERATIONAL, createOperationalDatastore())
+                .put(LogicalDatastoreType.CONFIGURATION,createConfigurationDatastore())
+                .build();
+    }
+
+    public AbstractDataBrokerTestCustomizer() {
+        schemaService = new MockSchemaService();
+        adapterContext = new MockAdapterContext();
+        schemaService.registerSchemaContextListener(adapterContext);
+        domNotificationRouter = DOMNotificationRouter.create(16);
+    }
+
+    public DOMStore createConfigurationDatastore() {
+        final InMemoryDOMDataStore store = new InMemoryDOMDataStore("CFG", getDataTreeChangeListenerExecutor());
+        schemaService.registerSchemaContextListener(store);
+        return store;
+    }
+
+    public DOMStore createOperationalDatastore() {
+        final InMemoryDOMDataStore store = new InMemoryDOMDataStore("OPER", getDataTreeChangeListenerExecutor());
+        schemaService.registerSchemaContextListener(store);
+        return store;
+    }
+
+    public DOMDataBroker createDOMDataBroker() {
+        return new SerializedDOMDataBroker(getDatastores(), getCommitCoordinatorExecutor());
+    }
+
+    public NotificationService createNotificationService() {
+        return new BindingDOMNotificationServiceAdapter(adapterContext, domNotificationRouter);
+    }
+
+    public NotificationPublishService createNotificationPublishService() {
+        return new BindingDOMNotificationPublishServiceAdapter(adapterContext, domNotificationRouter);
+    }
+
+    public abstract ListeningExecutorService getCommitCoordinatorExecutor();
+
+    public ListeningExecutorService getDataTreeChangeListenerExecutor() {
+        return MoreExecutors.newDirectExecutorService();
+    }
+
+    public DataBroker createDataBroker() {
+        return new BindingDOMDataBrokerAdapter(adapterContext, getDOMDataBroker());
+    }
+
+    public AdapterContext getAdapterContext() {
+        return adapterContext;
+    }
+
+    public DOMSchemaService getSchemaService() {
+        return schemaService;
+    }
+
+    public DOMDataBroker getDOMDataBroker() {
+        if (domDataBroker == null) {
+            domDataBroker = createDOMDataBroker();
+        }
+        return domDataBroker;
+    }
+
+    private synchronized ImmutableMap<LogicalDatastoreType, DOMStore> getDatastores() {
+        if (datastores == null) {
+            datastores = createDatastores();
+        }
+        return datastores;
+    }
+
+    public void updateSchema(final EffectiveModelContext ctx) {
+        schemaService.changeSchema(ctx);
+    }
+
+    public DOMNotificationRouter getDomNotificationRouter() {
+        return domNotificationRouter;
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataTreeChangeListenerTest.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractDataTreeChangeListenerTest.java
new file mode 100644 (file)
index 0000000..330b533
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2018 Inocybe Technologies 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.mdsal.micro.binding.dom.adapter;
+
+import static org.junit.Assert.fail;
+
+import com.google.common.util.concurrent.SettableFuture;
+import com.google.common.util.concurrent.Uninterruptibles;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
+import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Abstract base that provides a DTCL for verification.
+ *
+ * @author Thomas Pantelis
+ */
+public class AbstractDataTreeChangeListenerTest extends AbstractConcurrentDataBrokerTest {
+    protected static final class TestListener<T extends DataObject> implements DataTreeChangeListener<T> {
+        private final SettableFuture<Collection<DataTreeModification<T>>> future = SettableFuture.create();
+        private final List<DataTreeModification<T>> accumulatedChanges = new ArrayList<>();
+        private final Function<DataTreeModification<T>, Boolean>[] matchers;
+        private final int expChangeCount;
+
+        private TestListener(final Function<DataTreeModification<T>, Boolean>[] matchers) {
+            this.expChangeCount = matchers.length;
+            this.matchers = matchers;
+        }
+
+        @Override
+        public void onDataTreeChanged(final Collection<DataTreeModification<T>> changes) {
+            synchronized (accumulatedChanges) {
+                accumulatedChanges.addAll(changes);
+                if (expChangeCount == accumulatedChanges.size()) {
+                    future.set(new ArrayList<>(accumulatedChanges));
+                }
+            }
+        }
+
+        public Collection<DataTreeModification<T>> changes() {
+            try {
+                final Collection<DataTreeModification<T>> changes = future.get(5, TimeUnit.SECONDS);
+                Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
+                return changes;
+            } catch (InterruptedException | TimeoutException | ExecutionException e) {
+                throw new AssertionError(String.format(
+                    "Data tree change notifications not received. Expected: %s. Actual: %s - %s",
+                        expChangeCount, accumulatedChanges.size(), accumulatedChanges), e);
+            }
+        }
+
+        public void verify() {
+            Collection<DataTreeModification<T>> changes = new ArrayList<>(changes());
+            Iterator<DataTreeModification<T>> iter = changes.iterator();
+            while (iter.hasNext()) {
+                DataTreeModification<T> dataTreeModification = iter.next();
+                for (Function<DataTreeModification<T>, Boolean> matcher: matchers) {
+                    if (matcher.apply(dataTreeModification)) {
+                        iter.remove();
+                        break;
+                    }
+                }
+            }
+
+            if (!changes.isEmpty()) {
+                DataTreeModification<T> mod = changes.iterator().next();
+                fail(String.format("Received unexpected notification: type: %s, path: %s, before: %s, after: %s",
+                        mod.getRootNode().getModificationType(), mod.getRootPath().getRootIdentifier(),
+                        mod.getRootNode().getDataBefore(), mod.getRootNode().getDataAfter()));
+            }
+        }
+
+        public boolean hasChanges() {
+            synchronized (accumulatedChanges) {
+                return !accumulatedChanges.isEmpty();
+            }
+        }
+    }
+
+    protected AbstractDataTreeChangeListenerTest() {
+        super(true);
+    }
+
+    @SafeVarargs
+    protected final <T extends DataObject> TestListener<T> createListener(final LogicalDatastoreType store,
+            final InstanceIdentifier<T> path, final Function<DataTreeModification<T>, Boolean>... matchers) {
+        TestListener<T> listener = new TestListener<>(matchers);
+        getDataBroker().registerDataTreeChangeListener(DataTreeIdentifier.create(store, path), listener);
+        return listener;
+    }
+
+    public static <T extends DataObject> Function<DataTreeModification<T>, Boolean> match(
+            final ModificationType type, final InstanceIdentifier<T> path, final Function<T, Boolean> checkDataBefore,
+            final Function<T, Boolean> checkDataAfter) {
+        return modification -> type == modification.getRootNode().getModificationType()
+                && path.equals(modification.getRootPath().getRootIdentifier())
+                && checkDataBefore.apply(modification.getRootNode().getDataBefore())
+                && checkDataAfter.apply(modification.getRootNode().getDataAfter());
+    }
+
+    public static <T extends DataObject> Function<DataTreeModification<T>, Boolean> match(final ModificationType type,
+            final InstanceIdentifier<T> path, final T expDataBefore, final T expDataAfter) {
+        return match(type, path, dataBefore -> Objects.equals(expDataBefore, dataBefore),
+            (Function<T, Boolean>) dataAfter -> Objects.equals(expDataAfter, dataAfter));
+    }
+
+    public static <T extends DataObject> Function<DataTreeModification<T>, Boolean> added(
+            final InstanceIdentifier<T> path, final T data) {
+        return match(ModificationType.WRITE, path, null, data);
+    }
+
+    public static <T extends DataObject> Function<DataTreeModification<T>, Boolean> replaced(
+            final InstanceIdentifier<T> path, final T dataBefore, final T dataAfter) {
+        return match(ModificationType.WRITE, path, dataBefore, dataAfter);
+    }
+
+    public static <T extends DataObject> Function<DataTreeModification<T>, Boolean> deleted(
+            final InstanceIdentifier<T> path, final T dataBefore) {
+        return match(ModificationType.DELETE, path, dataBefore, null);
+    }
+
+    public static <T extends DataObject> Function<DataTreeModification<T>, Boolean> subtreeModified(
+            final InstanceIdentifier<T> path, final T dataBefore, final T dataAfter) {
+        return match(ModificationType.SUBTREE_MODIFIED, path, dataBefore, dataAfter);
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractNotificationBrokerTest.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractNotificationBrokerTest.java
new file mode 100644 (file)
index 0000000..ddcfa00
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2015 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.mdsal.micro.binding.dom.adapter;
+
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
+import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+
+public class AbstractNotificationBrokerTest extends AbstractSchemaAwareTest {
+    private AdapterContext bindingToNormalizedNodeCodec;
+    private DOMNotificationRouter domNotificationRouter;
+    private NotificationService notificationService;
+    private NotificationPublishService notificationPublishService;
+
+
+    @Override
+    protected void setupWithSchema(final EffectiveModelContext context) {
+        final DataBrokerTestCustomizer testCustomizer = createDataBrokerTestCustomizer();
+        domNotificationRouter = testCustomizer.getDomNotificationRouter();
+        notificationService = testCustomizer.createNotificationService();
+        notificationPublishService = testCustomizer.createNotificationPublishService();
+        bindingToNormalizedNodeCodec = testCustomizer.getAdapterContext();
+        testCustomizer.updateSchema(context);
+    }
+
+    protected DataBrokerTestCustomizer createDataBrokerTestCustomizer() {
+        return new DataBrokerTestCustomizer();
+    }
+
+    public NotificationService getNotificationService() {
+        return notificationService;
+    }
+
+    public NotificationPublishService getNotificationPublishService() {
+        return notificationPublishService;
+    }
+
+    public DOMNotificationRouter getDomNotificationRouter() {
+        return domNotificationRouter;
+    }
+
+    public AdapterContext getBindingToNormalizedNodeCodec() {
+        return bindingToNormalizedNodeCodec;
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractSchemaAwareTest.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AbstractSchemaAwareTest.java
new file mode 100644 (file)
index 0000000..c540f8d
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014 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.mdsal.micro.binding.dom.adapter;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import java.util.Set;
+import org.junit.Before;
+import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
+import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+
+public abstract class AbstractSchemaAwareTest {
+    private static final LoadingCache<Set<YangModuleInfo>, EffectiveModelContext> SCHEMA_CONTEXT_CACHE =
+            CacheBuilder.newBuilder().weakValues().build(
+                new CacheLoader<Set<YangModuleInfo>, EffectiveModelContext>() {
+                    @Override
+                    public EffectiveModelContext load(final Set<YangModuleInfo> key) {
+                        return BindingRuntimeHelpers.createEffectiveModel(key);
+                    }
+                });
+
+    @Before
+    public final void setup() throws Exception {
+        setupWithSchema(getSchemaContext());
+    }
+
+    protected Set<YangModuleInfo> getModuleInfos() throws Exception {
+        return BindingReflections.cacheModuleInfos(Thread.currentThread().getContextClassLoader());
+    }
+
+    protected EffectiveModelContext getSchemaContext() throws Exception {
+        return SCHEMA_CONTEXT_CACHE.getUnchecked(getModuleInfos());
+    }
+
+    /**
+     * Setups test with Schema context.
+     *
+     * @param context schema context
+     */
+    protected abstract void setupWithSchema(EffectiveModelContext context);
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AssertCollections.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/AssertCollections.java
new file mode 100644 (file)
index 0000000..cbac200
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014, 2015 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.mdsal.micro.binding.dom.adapter;
+
+import java.util.Collection;
+import java.util.Map;
+import org.junit.Assert;
+
+public final class AssertCollections {
+    private AssertCollections() {
+    }
+
+    public static void assertEmpty(final Collection<?> set) {
+        Assert.assertTrue(set.isEmpty());
+    }
+
+    public static void assertEmpty(final Map<?,?> set) {
+        Assert.assertTrue(set.isEmpty());
+    }
+
+    public static void assertContains(final Collection<?> set, final Object... values) {
+        for (Object key : values) {
+            Assert.assertTrue(set.contains(key));
+        }
+    }
+
+    public static void assertContains(final Map<?,?> map, final Object... values) {
+        for (Object key : values) {
+            Assert.assertTrue(map.containsKey(key));
+        }
+    }
+
+    public static void assertNotContains(final Collection<?> set, final Object... values) {
+        for (Object key : values) {
+            Assert.assertFalse(set.contains(key));
+        }
+    }
+
+    public static void assertNotContains(final Map<?,?> map, final Object... values) {
+        for (Object key : values) {
+            Assert.assertFalse(map.containsKey(key));
+        }
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/ConcurrentDataBrokerTestCustomizer.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/ConcurrentDataBrokerTestCustomizer.java
new file mode 100644 (file)
index 0000000..65eaffd
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2017 Red Hat, 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.mdsal.micro.binding.dom.adapter;
+
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.concurrent.Executors;
+
+/**
+ * AbstractDataBrokerTestCustomizer implementation that uses a single-threaded executor for commits.
+
+ * @author Michael Vorburger
+ */
+public class ConcurrentDataBrokerTestCustomizer extends AbstractDataBrokerTestCustomizer {
+
+    private final ListeningExecutorService dataTreeChangeListenerExecutorSingleton;
+
+    public ConcurrentDataBrokerTestCustomizer(boolean useMTDataTreeChangeListenerExecutor) {
+        if (useMTDataTreeChangeListenerExecutor) {
+            dataTreeChangeListenerExecutorSingleton = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
+        } else {
+            dataTreeChangeListenerExecutorSingleton = MoreExecutors.newDirectExecutorService();
+        }
+    }
+
+    @Override
+    public ListeningExecutorService getCommitCoordinatorExecutor() {
+        return MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
+    }
+
+    @Override
+    public ListeningExecutorService getDataTreeChangeListenerExecutor() {
+        return dataTreeChangeListenerExecutorSingleton;
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/DataBrokerTestCustomizer.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/DataBrokerTestCustomizer.java
new file mode 100644 (file)
index 0000000..39cc774
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2014 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.mdsal.micro.binding.dom.adapter;
+
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+
+/**
+ * AbstractDataBrokerTestCustomizer implementation that performs synchronous commits via a direct executor.
+ * Note that this can cause issues if used in a concurrent manner so it is recommended to use
+ * ConcurrentDataBrokerTestCustomizer instead.
+ */
+public class DataBrokerTestCustomizer extends AbstractDataBrokerTestCustomizer {
+
+    @Override
+    public ListeningExecutorService getCommitCoordinatorExecutor() {
+        return MoreExecutors.newDirectExecutorService();
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/MockAdapterContext.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/MockAdapterContext.java
new file mode 100644 (file)
index 0000000..58416e0
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.mdsal.micro.binding.dom.adapter;
+
+import static com.google.common.base.Verify.verifyNotNull;
+
+import org.opendaylight.binding.runtime.api.DefaultBindingRuntimeContext;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator;
+import org.opendaylight.yangtools.util.ClassLoaderUtils;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
+
+public final class MockAdapterContext implements AdapterContext, EffectiveModelContextListener {
+    private volatile CurrentAdapterSerializer serializer = null;
+
+    @Override
+    public CurrentAdapterSerializer currentSerializer() {
+        return verifyNotNull(serializer);
+    }
+
+    @Override
+    public void onModelContextUpdated(final EffectiveModelContext newModelContext) {
+        serializer = new CurrentAdapterSerializer(new BindingCodecContext(DefaultBindingRuntimeContext.create(
+            new DefaultBindingRuntimeGenerator().generateTypeMapping(newModelContext),
+            ClassLoaderUtils::loadClassWithTCCL)));
+    }
+}
diff --git a/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/MockSchemaService.java b/micro-core/src/main/java/org/opendaylight/mdsal/micro/binding/dom/adapter/MockSchemaService.java
new file mode 100644 (file)
index 0000000..b2f0b88
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2014 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.mdsal.micro.binding.dom.adapter;
+
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.dom.api.DOMSchemaServiceExtension;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.util.ListenerRegistry;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
+
+public final class MockSchemaService implements DOMSchemaService, EffectiveModelContextProvider {
+
+    private EffectiveModelContext schemaContext;
+
+    final ListenerRegistry<EffectiveModelContextListener> listeners = ListenerRegistry.create();
+
+    @SuppressFBWarnings(value = "IS2_INCONSISTENT_SYNC")
+    @Override
+    public synchronized EffectiveModelContext getGlobalContext() {
+        return schemaContext;
+    }
+
+    @Override
+    public ListenerRegistration<EffectiveModelContextListener> registerSchemaContextListener(
+            final EffectiveModelContextListener listener) {
+        return listeners.register(listener);
+    }
+
+    @Override
+    public synchronized EffectiveModelContext getEffectiveModelContext() {
+        return schemaContext;
+    }
+
+    @Override
+    public ClassToInstanceMap<DOMSchemaServiceExtension> getExtensions() {
+        return ImmutableClassToInstanceMap.of();
+    }
+
+    public synchronized void changeSchema(final EffectiveModelContext newContext) {
+        schemaContext = newContext;
+        listeners.streamListeners().forEach(listener -> listener.onModelContextUpdated(schemaContext));
+    }
+}
index 1288d090804932d30ddaff1892e5f7af1e4889af..6bb73894ba3c8f57342af4c3bd30213d5fa83022 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.netconf.sal.restconf.impl.ControllerContext;
 import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl;
 import org.opendaylight.netconf.sal.restconf.impl.RestconfProviderImpl;
 import org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper;
+import org.opendaylight.restconf.nb.rfc8040.handlers.ActionServiceHandler;
 import org.opendaylight.restconf.nb.rfc8040.handlers.DOMDataBrokerHandler;
 import org.opendaylight.restconf.nb.rfc8040.handlers.DOMMountPointServiceHandler;
 import org.opendaylight.restconf.nb.rfc8040.handlers.NotificationServiceHandler;
@@ -36,6 +37,7 @@ import org.opendaylight.restconf.nb.rfc8040.handlers.RpcServiceHandler;
 import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
 import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler;
 import org.opendaylight.restconf.nb.rfc8040.services.wrapper.ServicesWrapper;
+import org.opendaylight.restconf.nb.rfc8040.streams.Configuration;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
@@ -68,33 +70,27 @@ public class RestConfWiring {
     @Inject
     public RestConfWiring(RestConfConfig config, WebServer webServer, ServletSupport jaxRS,
             DOMSchemaService domSchemaService, DOMMountPointService domMountPointService, DOMRpcService domRpcService,
-            DOMDataBroker domDataBroker, DOMNotificationService domNotificationService) {
+            DOMDataBroker domDataBroker, DOMNotificationService domNotificationService,
+            TransactionChainHandler transactionChainHandler, SchemaContextHandler schemaCtxHandler,
+            DOMMountPointServiceHandler domMountPointServiceHandler, ControllerContext controllerContext,
+            BrokerFacade broker, RestconfImpl restconf, StatisticsRestconfServiceWrapper stats,
+            ActionServiceHandler actionServiceHandler) {
         this.webServer = webServer;
         LOG.info("config = {}", config);
-
+        //TO DO: Need to get them from properties. In Restconf this is being got from following blue print
+        //netconf/restconf/restconf-nb-rfc8040/src/main/resources/OSGI-INF/blueprint/restconf-bp.xml
+        Configuration configuration = new Configuration(0, 30000, 10000, true);
         // WebSocket
-        ControllerContext controllerContext = ControllerContext.newInstance(domSchemaService, domMountPointService,
-                domSchemaService);
-        BrokerFacade broker = BrokerFacade.newInstance(domRpcService, domDataBroker, domNotificationService,
-                controllerContext);
-        RestconfImpl restconf = RestconfImpl.newInstance(broker, controllerContext);
-        StatisticsRestconfServiceWrapper stats = StatisticsRestconfServiceWrapper.newInstance(restconf);
         IpAddress wsIpAddress = IpAddressBuilder.getDefaultInstance(config.webSocketAddress().getHostAddress());
         this.webSockerServer = new RestconfProviderImpl(stats, wsIpAddress, new PortNumber(config.webSocketPort()));
 
         // Servlet
-        TransactionChainHandler transactionChainHandler = new TransactionChainHandler(domDataBroker);
-        SchemaContextHandler schemaCtxHandler = SchemaContextHandler.newInstance(transactionChainHandler,
-                domSchemaService);
-        schemaCtxHandler.init();
-        DOMMountPointServiceHandler domMountPointServiceHandler = DOMMountPointServiceHandler
-                .newInstance(domMountPointService);
         DOMDataBrokerHandler domDataBrokerHandler = new DOMDataBrokerHandler(domDataBroker);
         RpcServiceHandler rpcServiceHandler = new RpcServiceHandler(domRpcService);
         NotificationServiceHandler notificationServiceHandler = new NotificationServiceHandler(domNotificationService);
         ServicesWrapper servicesWrapper = ServicesWrapper.newInstance(schemaCtxHandler, domMountPointServiceHandler,
-                transactionChainHandler, domDataBrokerHandler, rpcServiceHandler, notificationServiceHandler,
-                domSchemaService);
+                transactionChainHandler, domDataBrokerHandler, rpcServiceHandler, actionServiceHandler,
+                notificationServiceHandler, domSchemaService, configuration);
 
         // This is currently hard-coded to DRAFT_18; if we ever actually need to support the
         // older DRAFT_02 for anything, then (only) add it to the RestConfConfig and switch here
index 04d5d7476f7ba0d26363e4936ac6439f80181403..8421e07321e24cf504a9c02aa9873537cb13b89a 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.serviceutils.micro;
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.micro.ConfigReader;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.serviceutils.upgrade.UpgradeState;
 import org.opendaylight.serviceutils.upgrade.impl.UpgradeStateListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.serviceutils.upgrade.rev180702.UpgradeConfig;
index e85db8fb76d61ccd0835ae63e4034885810b9a99..93de7eb619f0d819771c4b7c361ab83df1677041 100644 (file)
@@ -11,11 +11,10 @@ import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import org.junit.Rule;
 import org.junit.Test;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.NotificationService;
 import org.opendaylight.controller.micro.InMemoryControllerModule;
 import org.opendaylight.infrautils.micro.testutils.AbstractSimpleDistributionTest;
-import org.opendaylight.mdsal.micro.PingPong;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.odlguice.inject.guice.testutils.AnnotationsModule;
 import org.opendaylight.odlguice.inject.guice.testutils.GuiceRule;
 
@@ -24,7 +23,7 @@ public class InMemoryControllerModuleTest extends AbstractSimpleDistributionTest
     public @Rule GuiceRule guice = new GuiceRule(InMemoryControllerModule.class, AnnotationsModule.class);
 
     @Inject DataBroker dataBroker;
-    @Inject @PingPong DataBroker pingPongDataBroker;
+    @Inject DataBroker pingPongDataBroker;
     @Inject NotificationService notificationService;
 
     @Test public void testDataBroker() throws InterruptedException, ExecutionException {
index 16ba58a2a8beaaf5bb13d3103c3b7469adddc521..1ea3120237ac3beffc49ff6056f1d569df15b113 100644 (file)
@@ -12,7 +12,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.opendaylight.infrautils.diagstatus.DiagStatusService;
 import org.opendaylight.infrautils.micro.DiagStatusModule;
-import org.opendaylight.infrautils.ready.guice.ReadyModule;
+import org.opendaylight.infrautils.micro.inject.guice.ready.GuiceReadyModule;
 import org.opendaylight.infrautils.web.WebModule;
 import org.opendaylight.odlguice.inject.guice.testutils.AnnotationsModule;
 import org.opendaylight.odlguice.inject.guice.testutils.GuiceRule;
@@ -24,12 +24,14 @@ import org.opendaylight.odlguice.inject.guice.testutils.GuiceRule;
  */
 public class DiagStatusModuleTest {
 
-    public @Rule GuiceRule guice = new GuiceRule(WebModule.class, DiagStatusModule.class, ReadyModule.class,
+    public @Rule GuiceRule guice = new GuiceRule(WebModule.class, DiagStatusModule.class, GuiceReadyModule.class,
             AnnotationsModule.class);
 
     @Inject DiagStatusService diagStatusService;
 
-    @Test public void testDiagStatusService() { }
+    @Test public void testDiagStatusService() {
+
+    }
 
     // TODO separate DiagStatusWiring0Test VS DiagStatusWiring1Test where *1* registers a
     // Module that actually does bind a ServiceStatusProvider ...
index 75667d4845a604ae2a42f3ad50df65aba82cd3c4..65d1b295294ed7af5e1e7cfc8e7af85b9ae5333e 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.infrautils.micro.test;
 
 import org.opendaylight.infrautils.micro.Main;
-import org.opendaylight.infrautils.ready.guice.ReadyModule;
+import org.opendaylight.infrautils.micro.inject.guice.ready.GuiceReadyModule;
 import org.opendaylight.odlguice.inject.guice.testutils.AbstractGuiceJsr250Module;
 
 /**
@@ -26,7 +26,7 @@ public class MainTest {
     public static class TestModule extends AbstractGuiceJsr250Module {
         @Override
         protected void configureBindings() {
-            install(new ReadyModule());
+            install(new GuiceReadyModule());
 
             // bind(SomeInterfaceWithPostConstruct.class).to(SomeClassWithPostConstruct.class);
         }
index d16a59a7f57efbf7d561ca0c69c2f53f87241606..959421dffef4a96423d84dbcdfc720bfccf6ce6d 100644 (file)
@@ -16,7 +16,6 @@ import org.opendaylight.infrautils.micro.testutils.AbstractSimpleDistributionTes
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.mdsal.micro.PingPong;
 import org.opendaylight.odlguice.inject.guice.testutils.AnnotationsModule;
 import org.opendaylight.odlguice.inject.guice.testutils.GuiceRule;
 
@@ -24,7 +23,7 @@ public class InMemoryMdsalModuleTest extends AbstractSimpleDistributionTest {
 
     public @Rule GuiceRule guice = new GuiceRule(InMemoryControllerModule.class, AnnotationsModule.class);
 
-    @Inject @PingPong DataBroker pingPongDataBroker;
+//    @Inject DataBroker pingPongDataBroker;
     @Inject DataBroker dataBroker;
 
     @Inject RpcProviderService rpcProviderService;
index c5f03ba721cf2c279d8d92a099f7dadc9a126a08..9aa9b6a2f2fbb31152489195cbf1cb2efd8a555a 100644 (file)
@@ -11,6 +11,7 @@ import static com.google.common.truth.Truth.assertThat;
 import static org.opendaylight.infrautils.testutils.web.TestWebClient.Method.GET;
 
 import java.io.IOException;
+import java.net.URISyntaxException;
 import javax.inject.Inject;
 import org.junit.Rule;
 import org.junit.Test;
@@ -36,8 +37,8 @@ public class RestConfModuleTest extends AbstractSimpleDistributionTest {
     @Inject WebServer webServer;
     @Inject TestWebClient http;
 
-    @Test public void testRestConf() throws IOException {
-        assertThat(http.request(GET, "/restconf/modules/").getStatus()).isEqualTo(200);
+    @Test public void testRestConf() throws IOException, InterruptedException, URISyntaxException {
+        assertThat(http.request(GET.name(), "/restconf/modules/").statusCode()).isEqualTo(200);
 
         // TODO test security; add auth support to TestHttpClient, check that w.o. auth it's 401
     }
index 4c84c942d179077157c5ac4f640b33f3798e6c0e..c7e2cbb3852c156cb23ce2b0d5f2471825efeae7 100644 (file)
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  Copyright © 2018 Red Hat, 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
@@ -17,9 +16,7 @@
     <relativePath>../</relativePath>
   </parent>
 
-  <groupId>org.opendaylight.odlmicro</groupId>
   <artifactId>micro-netconf</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
 
   <dependencies>
 
       <artifactId>netconf-topology</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>org.opendaylight.netconf</groupId>
+      <artifactId>netconf-topology-impl</artifactId>
+    </dependency>
+
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
       <artifactId>netconf-topology-singleton</artifactId>
@@ -78,7 +80,6 @@
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>threadpool-config-impl</artifactId>
-      <version>0.10.0</version>
     </dependency>
 
     <!--infrautils-->
 
     <!--aaa-->
     <dependency>
-       <groupId>org.opendaylight.aaa</groupId>
-       <artifactId>aaa-cert</artifactId>
-       <version>0.9.0</version>
-       <scope>compile</scope>
-    </dependency>
-
-    <!--controller-->
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>blueprint</artifactId>
-      <version>0.10.0</version>
+      <groupId>org.opendaylight.aaa</groupId>
+      <artifactId>aaa-cert</artifactId>
       <scope>compile</scope>
     </dependency>
-
   </dependencies>
 
   <build>
index 08704fcc9fe41462d55bf1754e67d3226353c833..e4abfca64f2b28bfe128bead2d555a9fe2f90a1b 100644 (file)
@@ -12,7 +12,8 @@ import org.opendaylight.odlguice.inject.guice.GuiceClassPathBinder;
 
 public final class NetconfMain {
 
-    private NetconfMain() { }
+    private NetconfMain() {
+    }
 
     public static void main(String[] args) {
         GuiceClassPathBinder classPathBinder = new GuiceClassPathBinder("org.opendaylight");
index cbcb736bffed2e1a3d49c1bfa904007f212823f1..849a74067b769b00012ab80b6b60ec3440a6bed7 100644 (file)
@@ -15,6 +15,7 @@ import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 import javax.inject.Singleton;
 import org.opendaylight.aaa.api.CredentialAuth;
+import org.opendaylight.aaa.api.PasswordCredentialAuth;
 import org.opendaylight.aaa.api.PasswordCredentials;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
 import org.opendaylight.aaa.micro.AAAModule;
@@ -53,9 +54,11 @@ import org.opendaylight.netconf.micro.annotations.GlobalNetconfProcessingExecuto
 import org.opendaylight.netconf.micro.annotations.GlobalNetconfSshScheduledExecutor;
 import org.opendaylight.netconf.micro.annotations.MdsalNetconfConnector;
 import org.opendaylight.netconf.micro.annotations.NetconfAuthProvider;
+import org.opendaylight.netconf.sal.connect.impl.DefaultSchemaResourceManager;
+import org.opendaylight.netconf.sal.connect.netconf.DeviceActionFactoryImpl;
+import org.opendaylight.netconf.sal.connect.netconf.schema.mapping.DefaultBaseNetconfSchemas;
 import org.opendaylight.netconf.topology.api.NetconfTopology;
 import org.opendaylight.netconf.topology.impl.NetconfTopologyImpl;
-import org.opendaylight.netconf.topology.impl.SchemaRepositoryProviderImpl;
 import org.opendaylight.odlguice.inject.guice.AutoWiringModule;
 import org.opendaylight.odlguice.inject.guice.GuiceClassPathBinder;
 import org.opendaylight.odlguice.inject.guice.testutils.AnnotationsModule;
@@ -217,35 +220,41 @@ public class NetconfModule extends AutoWiringModule {
 
     // Converted here from netconf-topology/src/main/resources/OSGI-INF/blueprint/netconf-topology.xml
     // START
-    @Provides
-    @Singleton
-    SchemaRepositoryProviderImpl getSchemaRepositoryProviderImpl(
-            ServerChannelInitializer serverChannelInitializer,
-            @GlobalBossGroup EventLoopGroup globalBossGroup,
-            @GlobalWorkerGroup EventLoopGroup globalWorkerGroup) {
-        return new SchemaRepositoryProviderImpl("shared-schema-repository-impl");
-    }
-
+    /*
+     * @Provides
+     *
+     * @Singleton SchemaRepositoryProviderImpl getSchemaRepositoryProviderImpl(
+     * ServerChannelInitializer serverChannelInitializer,
+     *
+     * @GlobalBossGroup EventLoopGroup globalBossGroup,
+     *
+     * @GlobalWorkerGroup EventLoopGroup globalWorkerGroup) { return new
+     * SchemaRepositoryProviderImpl("shared-schema-repository-impl"); }
+     */
     @Provides
     @Singleton
     NetconfTopology getNetconfTopology(@org.opendaylight.netconf.micro.annotations.NetconfClientDispatcher
             NetconfClientDispatcher clientDispatcherDependency,
             @GlobalNetconfSshScheduledExecutor ScheduledThreadPool keepAliveExecutor,
             @GlobalNetconfProcessingExecutor ThreadPool processingExecutor,
-            SchemaRepositoryProviderImpl schemaRepositoryProvider,
+            DefaultSchemaResourceManager defaultSchemaResourceManager,
             @GlobalEventExecutor EventExecutor eventExecutor,
             DataBroker dataBroker,
             DOMMountPointService mountPointService,
-            AAAEncryptionService encryptionService) {
+            AAAEncryptionService encryptionService,
+            DefaultBaseNetconfSchemas defaultBaseNetconfSchemas,
+            DeviceActionFactoryImpl deviceActionFactoryImpl) {
         NetconfTopologyImpl impl = new NetconfTopologyImpl("topology-netconf",
                 clientDispatcherDependency,
                 eventExecutor,
                 keepAliveExecutor,
                 processingExecutor,
-                schemaRepositoryProvider,
+                defaultSchemaResourceManager,
                 dataBroker,
                 mountPointService,
-                encryptionService);
+                encryptionService,
+                defaultBaseNetconfSchemas,
+                deviceActionFactoryImpl);
         impl.init();
         return impl;
     }
@@ -306,7 +315,7 @@ public class NetconfModule extends AutoWiringModule {
     @Singleton
     @NetconfAuthProvider
     CredentialServiceAuthProvider getNetconfAuthProvider(CredentialAuth<PasswordCredentials> credService) {
-        return new CredentialServiceAuthProvider(credService);
+        return new CredentialServiceAuthProvider((PasswordCredentialAuth) credService);
     }
     // Converted here from netconf/aaa-authn-odl-plugin/src/main/resources/OSGI-INF/blueprint/aaa-authn-netconf.xml
     // END
index 3a2ac09cace0c092bd99bbefd573df8324ecb54e..cbef7f842830458c6b1e40904670e88d8ada1eb3 100644 (file)
@@ -15,9 +15,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
-
 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
 
 /**
index 8d189bc93ffd175eff417738d8d0bba9f5e66307..34ba8f321f75bde09eed7907655c4bcee7bbeb00 100644 (file)
@@ -15,9 +15,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
-
 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
 
 /**
index 72490d2d7b6c7885d8cca37e170f08179e6be998..6e389e234014ec71983772cbc24bb669ebb0ba96 100644 (file)
@@ -15,9 +15,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
-
 import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
 
 /**
index d9a21898cadf20579d6c901a7e5c1ad778996166..416da20c8c28b00fc5587ee693df0d6fd060acf0 100644 (file)
@@ -15,9 +15,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
-
 import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
 
 /**
index 4c68334671e11894f76d7c8b8c04175ee9c243fc..66e2c236feb80b45ebb8e2ce9d2195b8bfc82678 100644 (file)
@@ -15,9 +15,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
-
 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener;
 
 /**
index 9980613760c9a7fe5decbb90a40f28063b69a590..347c83061822c56614e63b04bbf84eba8e515ef9 100644 (file)
@@ -15,9 +15,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
-
 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
 
 /**
index 47277eed7529af70214d528e793aa01b7402693b..389a89850a839eedb73e8bf8c577dd1b17b54975 100644 (file)
@@ -15,9 +15,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
-
 import org.opendaylight.netconf.auth.AuthProvider;
 
 /**
index 17c7bb36e167a0a034e2c3a1e26f6310b8d78096..f0a5bfba8a1e58c23159049e305a0fa022e923b5 100644 (file)
@@ -15,7 +15,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-
 import javax.inject.Qualifier;
 
 /**
index 86dad8ced3d43f40c6e7f60ddd76f4ba9490da1e..1b9cb847a9dd2444e3f53684f52da25fbd80b26e 100644 (file)
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  Copyright © 2018 Red Hat, 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
   <artifactId>micro-netvirt</artifactId>
   <version>1.0.0-SNAPSHOT</version>
 
-  <dependencies>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.netvirt</groupId>
+        <artifactId>netvirt-artifacts</artifactId>
+        <version>0.11.0-SNAPSHOT</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
 
+  <dependencies>
     <dependency>
       <groupId>org.opendaylight.odlmicro</groupId>
       <artifactId>micro-genius</artifactId>
         </exclusion>
       </exclusions>
     </dependency>
-
   </dependencies>
 
   <build>
index 6d60b07080a197a954e102ed78104a95d0a507d0..35e37c039b44e883473d3654882d0812434aa9c2 100644 (file)
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  Copyright © 2018 Red Hat, 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
     <relativePath>../</relativePath>
   </parent>
 
-  <groupId>org.opendaylight.odlmicro</groupId>
   <artifactId>micro-openflowplugin</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
 
   <dependencyManagement>
     <dependencies>
       <dependency>
         <groupId>org.opendaylight.openflowplugin</groupId>
         <artifactId>openflowplugin-artifacts</artifactId>
-        <version>0.8.0</version>
+        <version>0.11.0-SNAPSHOT</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
@@ -34,7 +31,6 @@
   </dependencyManagement>
 
   <dependencies>
-
     <dependency>
       <groupId>org.opendaylight.odlmicro</groupId>
       <artifactId>micro-core</artifactId>
       <groupId>org.opendaylight.openflowplugin.openflowjava</groupId>
       <artifactId>openflow-protocol-spi</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.openflowplugin.openflowjava</groupId>
+      <artifactId>openflow-protocol-api</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.openflowplugin.openflowjava</groupId>
       <artifactId>openflow-protocol-impl</artifactId>
@@ -63,7 +63,6 @@
     <dependency>
       <groupId>org.opendaylight.aaa.web</groupId>
       <artifactId>testutils</artifactId>
-      <version>0.9.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -78,7 +77,7 @@
       <!-- TODO <scope>test</scope> instead of compile here once I'll create
            a new infrautils:inject.guice.testutils (non-testutils) for the run-time part.. -->
     </dependency>
-    <!--  TODO remove, this is just a temporary hack, see above -->
+    <!-- TODO remove, this is just a temporary hack, see above -->
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
@@ -90,7 +89,6 @@
       <artifactId>inject.guice.extensions.jsr250</artifactId>
       <scope>compile</scope>
     </dependency>
-
   </dependencies>
 
   <build>
index 2889cc4aaa3003c9693faface8dfdcc16dfc1e6a..08a2b5d62b14c0e62eb73d30db102c3db8acbf12 100644 (file)
@@ -12,6 +12,7 @@ import static com.google.common.collect.Lists.newArrayList;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.opendaylight.controller.micro.ConfigReader;
+import org.opendaylight.openflowjava.protocol.impl.core.OpenflowDiagStatusProviderImpl;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProviderFactory;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProviderList;
@@ -30,18 +31,19 @@ public class OpenFlowJavaWiring {
 
     @Inject
     public OpenFlowJavaWiring(ConfigReader configReader,
-            SwitchConnectionProviderFactory switchConnectionProviderFactory) {
+            SwitchConnectionProviderFactory switchConnectionProviderFactory,
+            OpenflowDiagStatusProviderImpl openflowDiagStatusProviderImpl) {
         SwitchConnectionConfig defaultSwitchConnConfig = configReader
                 .read("/initial/default-openflow-connection-config", SwitchConnectionConfig.class,
                       "openflow-switch-connection-provider-default-impl");
         SwitchConnectionProvider defaultSwitchConnProvider = switchConnectionProviderFactory
-                .newInstance(defaultSwitchConnConfig);
+                .newInstance(defaultSwitchConnConfig, openflowDiagStatusProviderImpl);
 
         SwitchConnectionConfig legacySwitchConnConfig = configReader
                 .read("/initial/legacy-openflow-connection-config",SwitchConnectionConfig.class,
                       "openflow-switch-connection-provider-legacy-impl");
         SwitchConnectionProvider legacySwitchConnProvider = switchConnectionProviderFactory
-                .newInstance(legacySwitchConnConfig);
+                .newInstance(legacySwitchConnConfig, openflowDiagStatusProviderImpl);
 
         switchConnectionProviderList = new SwitchConnectionProviderList(
                 newArrayList(defaultSwitchConnProvider, legacySwitchConnProvider));
index 4288da66a8ba2940f3bba06f409e1c77c9817a7e..c3b57ebcd8f3ce8f6ef34897d2bcde17423d524a 100644 (file)
@@ -9,12 +9,13 @@ package org.opendaylight.openflowplugin.micro;
 
 import com.google.inject.Provides;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.micro.ConfigReader;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
-import org.opendaylight.mdsal.micro.PingPong;
 import org.opendaylight.odlguice.inject.guice.AutoWiringModule;
 import org.opendaylight.odlguice.inject.guice.GuiceClassPathBinder;
+import org.opendaylight.openflowjava.protocol.api.connection.OpenflowDiagStatusProvider;
+import org.opendaylight.openflowjava.protocol.impl.core.OpenflowDiagStatusProviderImpl;
 import org.opendaylight.openflowjava.protocol.impl.core.SwitchConnectionProviderFactoryImpl;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProviderFactory;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProviderList;
@@ -37,6 +38,7 @@ public class OpenFlowPluginModule extends AutoWiringModule {
     protected void configureMore() {
         // TODO curious that this is needed despite SwitchConnectionProviderFactoryImpl being annotated?!
         bind(SwitchConnectionProviderFactory.class).to(SwitchConnectionProviderFactoryImpl.class);
+        bind(OpenflowDiagStatusProvider.class).to(OpenflowDiagStatusProviderImpl.class);
     }
 
     @Provides
@@ -45,8 +47,8 @@ public class OpenFlowPluginModule extends AutoWiringModule {
     }
 
     @Provides
-    @Singleton PingPongDataBroker getPingPongDataBroker(@PingPong DataBroker pingPongDataBroker) {
-        return new ForwardingPingPongDataBroker(pingPongDataBroker);
+    @Singleton PingPongDataBroker getPingPongDataBroker(DataBroker dataBroker) {
+        return new ForwardingPingPongDataBroker(dataBroker);
     }
 
     @Provides
index 86d2de7b61093ce8e4a9ca1d4786dfacda41effe..670bb077f9633f7a77c1e58c99ac8ebe586e71fb 100644 (file)
@@ -12,7 +12,8 @@ import org.opendaylight.odlguice.inject.guice.GuiceClassPathBinder;
 
 public final class OpenflowPluginMain {
 
-    private OpenflowPluginMain() { }
+    private OpenflowPluginMain() {
+    }
 
     public static void main(String[] args) {
         GuiceClassPathBinder classPathBinder = new GuiceClassPathBinder("org.opendaylight");
index 0e429080e30e35420c0054dff7d6182689934e76..10fb3d89204dc4d078c9297840771abe6ef83dbb 100644 (file)
@@ -51,8 +51,8 @@ public class OpenFlowPluginModuleTest extends AbstractSimpleDistributionTest {
     @Inject DiagStatusService diagStatus;
 
     @Test public void testConfig() throws InterruptedException {
-        assertThat(ofpConfig.getGlobalNotificationQuota()).named("globalNotificationQuota").isEqualTo(64000L);
-        assertThat(frmConfig.getReconciliationRetryCount()).named("reconciliationRetryCount").isEqualTo(5);
+        assertThat(ofpConfig.getGlobalNotificationQuota().longValue()).isEqualTo(64000L);
+        assertThat(frmConfig.getReconciliationRetryCount().intValue()).isEqualTo(5);
     }
 
     @Test
index af36dca221122a188cad70efe31e1dc62f037562..1ee932bc0d44ce2e5b7b9f095fb368a561dfb375 100644 (file)
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  Copyright © 2018 Red Hat, 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
 -->
     <relativePath>../</relativePath>
   </parent>
 
-  <groupId>org.opendaylight.odlmicro</groupId>
   <artifactId>micro-ovsdb</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
 
   <dependencyManagement>
     <dependencies>
       <dependency>
         <groupId>org.opendaylight.ovsdb</groupId>
         <artifactId>hwvtepsouthbound-artifacts</artifactId>
-        <version>1.8.0</version>
+        <version>1.11.0-SNAPSHOT</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.ovsdb</groupId>
         <artifactId>library-artifacts</artifactId>
-        <version>1.8.0</version>
+        <version>1.11.0-SNAPSHOT</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.ovsdb</groupId>
         <artifactId>southbound-artifacts</artifactId>
-        <version>1.8.0</version>
+        <version>1.11.0-SNAPSHOT</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
@@ -48,7 +45,6 @@
 
 
   <dependencies>
-
     <dependency>
       <groupId>org.opendaylight.odlmicro</groupId>
       <artifactId>micro-core</artifactId>
@@ -69,7 +65,6 @@
     <dependency>
       <groupId>org.opendaylight.aaa.web</groupId>
       <artifactId>testutils</artifactId>
-      <version>0.9.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -84,7 +79,7 @@
       <!-- TODO <scope>test</scope> instead of compile here once I'll create
            a new infrautils:inject.guice.testutils (non-testutils) for the run-time part.. -->
     </dependency>
-    <!--  TODO remove, this is just a temporary hack, see above -->
+    <!-- TODO remove, this is just a temporary hack, see above -->
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
@@ -96,7 +91,6 @@
       <artifactId>inject.guice.extensions.jsr250</artifactId>
       <scope>compile</scope>
     </dependency>
-
   </dependencies>
 
   <build>
index 25b02f3c8c7a2862fcdc56f6b3562cea9ad9ded7..91a268faba6349cabb2b8bb2784564981df9c2c1 100644 (file)
@@ -12,8 +12,8 @@ import org.junit.Rule;
 import org.opendaylight.aaa.micro.CertModule;
 import org.opendaylight.controller.micro.InMemoryControllerModule;
 import org.opendaylight.infrautils.micro.DiagStatusModule;
+import org.opendaylight.infrautils.micro.inject.guice.ready.GuiceReadyModule;
 import org.opendaylight.infrautils.micro.testutils.AbstractSimpleDistributionTest;
-import org.opendaylight.infrautils.ready.guice.ReadyModule;
 import org.opendaylight.infrautils.web.WebModule;
 import org.opendaylight.odlguice.inject.guice.GuiceClassPathBinder;
 import org.opendaylight.odlguice.inject.guice.testutils.AnnotationsModule;
@@ -23,14 +23,15 @@ import org.opendaylight.ovsdb.lib.OvsdbConnection;
 import org.opendaylight.ovsdb.lib.impl.OvsdbConnectionService;
 import org.opendaylight.ovsdb.micro.OvsdbModule;
 import org.opendaylight.ovsdb.southbound.SouthboundProvider;
+import org.opendaylight.serviceutils.micro.UpgradeModule;
 
 public class OvsdbModuleTest extends AbstractSimpleDistributionTest {
 
     private static final GuiceClassPathBinder CLASS_PATH_BINDER = new GuiceClassPathBinder("org.opendaylight");
 
     public @Rule GuiceRule guice = new GuiceRule(new OvsdbModule(CLASS_PATH_BINDER), new CertModule(),
-            new InMemoryControllerModule(), new DiagStatusModule(), new WebModule(), new ReadyModule(),
-            new AnnotationsModule());
+            new InMemoryControllerModule(), new DiagStatusModule(), new WebModule(), new GuiceReadyModule(),
+            new AnnotationsModule(), new UpgradeModule());
 
     @Inject OvsdbConnection ovsdbConnection;
     @Inject SouthboundProvider southboundProvider;
diff --git a/pom.xml b/pom.xml
index d97c60b569c7a2a21fdecf9bbec061ebcf2dd757..5f5d5299fa6abbc460f004f162efb58129994862 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -7,14 +7,13 @@
  and is available at http://www.eclipse.org/legal/epl-v10.html
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
-    <groupId>org.opendaylight.infrautils</groupId>
-    <artifactId>parent</artifactId>
-    <version>1.5.0</version>
-    <relativePath />
+    <groupId>org.opendaylight.odlparent</groupId>
+    <artifactId>bundle-parent</artifactId>
+    <version>7.0.5</version>
   </parent>
 
   <groupId>org.opendaylight.odlmicro</groupId>
       <dependency>
         <groupId>org.opendaylight.infrautils</groupId>
         <artifactId>infrautils-artifacts</artifactId>
-        <version>1.5.0</version>
+        <version>1.8.0</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.yangtools</groupId>
         <artifactId>yangtools-artifacts</artifactId>
-        <version>2.1.8</version>
+        <version>5.0.5</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.aaa</groupId>
         <artifactId>aaa-artifacts</artifactId>
-        <version>0.9.0</version>
+        <version>0.12.0-SNAPSHOT</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.controller</groupId>
-        <artifactId>mdsal-artifacts</artifactId>
-        <version>1.9.0</version>
+        <artifactId>controller-artifacts</artifactId>
+        <version>2.0.3</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.mdsal</groupId>
         <artifactId>mdsal-artifacts</artifactId>
-        <version>3.0.6</version>
+        <version>6.0.4</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>1.6.0</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-      <dependency>
-        <groupId>org.opendaylight.netconf</groupId>
-        <artifactId>restconf-artifacts</artifactId>
-        <version>1.9.0</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-
-<!--
-      <dependency>
-        <groupId>org.opendaylight.neutron</groupId>
-        <artifactId>neutron-artifacts</artifactId>
-        <version>0.10.0</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-      <dependency>
-        <groupId>org.opendaylight.daexim</groupId>
-        <artifactId>daexim-artifacts</artifactId>
-        <version>1.3.0</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-  -->
-      <dependency>
-        <groupId>org.opendaylight.netvirt</groupId>
-        <artifactId>netvirt-artifacts</artifactId>
-        <version>0.8.0</version>
+        <version>1.9.0-SNAPSHOT</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
   </dependencyManagement>
 
   <dependencies>
-
     <dependency>
       <groupId>org.osgi</groupId>
-      <artifactId>org.osgi.compendium</artifactId>
+      <artifactId>osgi.cmpn</artifactId>
       <scope>compile</scope>
     </dependency>
-      <!-- Logging related -->
+    <!-- Logging related -->
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <artifactId>activation</artifactId>
       <version>1.1.1</version>
     </dependency>
-
-    <!--controller-->
+    <!--controller -->
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>blueprint</artifactId>
-      <version>0.10.0</version>
-      <scope>compile</scope>
-    </dependency>
-
-    <!--mdsal-->
-    <dependency>
-      <!-- TODO remove this temporary v0.1 hack; see org.opendaylight.controller.micro.ControllerModule -->
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>sal-binding-broker-impl</artifactId>
-      <type>test-jar</type>
+      <version>2.0.3</version>
       <scope>compile</scope>
-<!-- TODO
-      <exclusions>
-        <exclusion>
-          <groupId>org.osgi</groupId>
-          <artifactId>org.osgi.core</artifactId>
-        </exclusion>
-      </exclusions>
- -->
     </dependency>
-  
   </dependencies>
   <modules>
     <module>micro-core</module>