config subsystem integration - BUG 541 84/5884/2
authorBasheeruddin Ahmed <syedbahm@cisco.com>
Thu, 3 Apr 2014 00:55:01 +0000 (17:55 -0700)
committerMichal Rehak <mirehak@cisco.com>
Tue, 15 Apr 2014 14:32:17 +0000 (16:32 +0200)
added configuration xml for configSubsystem
added sal code generator
changed reference to swichConnectionProvider (now there is collection)
changed startup in order to use configSubsystem wiring
preserved the osgi BunndleContext access for cli stuff
fixed IT (configSubsystem related stuff)
enabled documentation generator
upated Future obtained from OFJava to ListenableFuture
changed wiring to OFJava (1switchConnectionProvider = 1 switchConnectionHandler)

Change-Id: I9b7ca8a173e4a36381411cec08772d8440180a03
Signed-off-by: Basheeruddin Ahmed <syedbahm@cisco.com>
Signed-off-by: Michal Rehak <mirehak@cisco.com>
18 files changed:
.gitignore
distribution/base/src/assemble/bin.xml
distribution/base/src/main/resources/configuration/initial/42-openflow-protocol-impl.xml [new file with mode: 0644]
openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPaxOptionsAssistant.java
openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPluginToLibraryTest.java
openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/SalIntegrationTest.java
openflowplugin-it/src/test/resources/controller.xml
openflowplugin/pom.xml
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/Activator.java [deleted file]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/ErrorHandlerQueueImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/cmd/MessageCountCommandProvider.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java
openflowplugin/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/common/config/impl/rev140326/ConfigurableOpenFlowProviderModule.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/common/config/impl/rev140326/ConfigurableOpenFlowProviderModuleFactory.java [new file with mode: 0644]
openflowplugin/src/main/yang/openflow-plugin-cfg-impl.yang [new file with mode: 0644]
openflowplugin/src/main/yang/openflow-plugin-cfg.yang [new file with mode: 0644]
pom.xml

index 70a448c65e52e9731239ee6a78e87ce98feb341f..85f15c7866c9771c6cde4b5c4458c67665694d87 100644 (file)
@@ -16,5 +16,6 @@ target
 .settings\r
 MANIFEST.MF\r
 xtend-gen\r
-\r
+.externalToolBuilders\r
+maven-eclipse.xml\r
 \r
index e49f47f5791a3458e3ab5ea5f706ff3b4ba34ffb..387450817fd033ef2bdb1edbe52f844d297b4b57 100644 (file)
         <exclude>opendaylight/plugins/org.opendaylight.controller.protocol_plugins.openflow-*.jar</exclude>
       </excludes>
     </fileSet>
+    <fileSet>
+      <directory>
+        src/main/resources/
+      </directory>
+      <excludes>
+        <exclude>version.properties</exclude>
+        <exclude>configuration/config.ini</exclude>
+      </excludes>
+      <outputDirectory>
+        opendaylight/
+      </outputDirectory>
+    </fileSet>
   </fileSets>
   <dependencySets>
     <dependencySet>
diff --git a/distribution/base/src/main/resources/configuration/initial/42-openflow-protocol-impl.xml b/distribution/base/src/main/resources/configuration/initial/42-openflow-protocol-impl.xml
new file mode 100644 (file)
index 0000000..7c92145
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+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
+-->
+<snapshot>
+  <required-capabilities>
+    <!-- openflowjava -->
+    <capability>urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider:impl?module=openflow-switch-connection-provider-impl&amp;revision=2014-03-28</capability>
+    <capability>urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider?module=openflow-switch-connection-provider&amp;revision=2014-03-28</capability>
+    <!-- openflowplugin -->
+    <capability>urn:opendaylight:params:xml:ns:yang:openflow:common:config:impl?module=openflow-provider-impl&amp;revision=2014-03-26</capability>
+    <capability>urn:opendaylight:params:xml:ns:yang:openflow:common:config?module=openflow-provider&amp;revision=2014-03-26</capability>
+    <!-- binding-broker-impl - provided -->
+  </required-capabilities>
+
+  <configuration>
+
+    <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+      <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+        <!-- default OF-switch-connection-provider (port 6633) -->
+        <module>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider:impl">prefix:openflow-switch-connection-provider-impl</type>
+          <name>openflow-switch-connection-provider-default-impl</name>
+          <port>6633</port>
+          <switch-idle-timeout>15000</switch-idle-timeout>
+        </module>
+        <!-- default OF-switch-connection-provider (port 6653) -->
+        <module>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider:impl">prefix:openflow-switch-connection-provider-impl</type>
+          <name>openflow-switch-connection-provider-legacy-impl</name>
+          <port>6653</port>
+          <switch-idle-timeout>15000</switch-idle-timeout>
+        </module>
+
+
+        <module>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:common:config:impl">prefix:openflow-provider-impl</type>
+          <name>openflow-provider-impl</name>
+          
+          <openflow-switch-connection-provider>
+            <type xmlns:ofSwitch="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider">ofSwitch:openflow-switch-connection-provider</type>
+            <name>openflow-switch-connection-provider-default</name>
+          </openflow-switch-connection-provider>
+          <openflow-switch-connection-provider>
+            <type xmlns:ofSwitch="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider">ofSwitch:openflow-switch-connection-provider</type>
+            <name>openflow-switch-connection-provider-legacy</name>
+          </openflow-switch-connection-provider>
+
+
+          <binding-aware-broker>
+            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
+            <name>binding-osgi-broker</name>
+          </binding-aware-broker>
+        </module>
+      </modules>
+
+      <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+        <service>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider">prefix:openflow-switch-connection-provider</type>
+          <instance>
+            <name>openflow-switch-connection-provider-default</name>
+            <provider>/modules/module[type='openflow-switch-connection-provider-impl'][name='openflow-switch-connection-provider-default-impl']</provider>
+          </instance>
+          <instance>
+            <name>openflow-switch-connection-provider-legacy</name>
+            <provider>/modules/module[type='openflow-switch-connection-provider-impl'][name='openflow-switch-connection-provider-legacy-impl']</provider>
+          </instance>
+        </service>
+
+        <service>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:common:config">prefix:openflow-provider</type>
+          <instance>
+            <name>openflow-provider</name>
+            <provider>/modules/module[type='openflow-provider-impl'][name='openflow-provider-impl']</provider>
+          </instance>
+        </service>
+      </services>
+    </data>
+
+  </configuration>
+</snapshot>
index 0f7a4b402b4703930676d98a30948c889c054329..b025a91a294f8247fadaacc7a5035a1416078c85 100644 (file)
@@ -9,12 +9,12 @@
 package org.opendaylight.openflowplugin.openflow.md.it;
 
 
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-
 import org.ops4j.pax.exam.CoreOptions;
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.options.DefaultCompositeOption;
 
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+
 /**
  * @author mirehak
  *
@@ -33,6 +33,7 @@ public abstract class OFPaxOptionsAssistant {
     public static final String OFPLUGIN = "org.opendaylight.openflowplugin";
     /** controller.model package */
     public static final String CONTROLLER_MODEL = "org.opendaylight.controller.model";
+
     
     /**
      * Works only if property -DinspectOsgi is used
@@ -72,7 +73,8 @@ public abstract class OFPaxOptionsAssistant {
                 baseSalBundles(),
                 ofLibraryBundles(),
                 mavenBundle(CONTROLLER_MODEL, "model-flow-statistics").versionAsInProject(),
-                mavenBundle(OFPLUGIN, "openflowplugin").versionAsInProject());
+                mavenBundle(OFPLUGIN, "openflowplugin").versionAsInProject(),
+                mavenBundle(CONTROLLER,"config-api").versionAsInProject());
     }
 
     /**
index a5d4cb6490c66108404f7c3b5ce251b0b5bff612..646b066eb8567a9537c638fb47120d4dbdc4b59b 100644 (file)
@@ -25,7 +25,7 @@ import org.opendaylight.openflowjava.protocol.impl.clients.ClientEvent;
 import org.opendaylight.openflowjava.protocol.impl.clients.ScenarioHandler;
 import org.opendaylight.openflowjava.protocol.impl.clients.SimpleClient;
 import org.opendaylight.openflowjava.protocol.impl.clients.SleepEvent;
-import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.OpenflowPluginProvider;
 import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
@@ -47,7 +47,7 @@ public class OFPluginToLibraryTest {
             .getLogger(OFPluginToLibraryTest.class);
 
     @Inject @Filter(timeout=5000)
-    SwitchConnectionProvider switchConnectionProvider;
+    OpenflowPluginProvider openflowPluginProvider;
     
     @Inject
     BundleContext ctx;
@@ -60,7 +60,7 @@ public class OFPluginToLibraryTest {
      */
     @Before
     public void setUp() throws InterruptedException {
-        LOG.debug("switchConnectionProvider: "+switchConnectionProvider);
+        LOG.debug("openflowPluginProvider: "+openflowPluginProvider);
         //FIXME: plugin should provide service exposing startup result via future 
         Thread.sleep(5000);
     }
@@ -155,7 +155,7 @@ public class OFPluginToLibraryTest {
     @Test
     public void handshakeFail2() throws Exception {
         LOG.debug("handshakeFail2 integration test");
-        LOG.debug("switchConnectionProvider: "+switchConnectionProvider);
+        LOG.debug("openflowPluginProvider: "+openflowPluginProvider);
 
         switchSim = createSimpleClient();
         switchSim.setSecuredClient(false);
index 5e375d818e8bc6aa369e879c09060b4ace70322b..0cfc15f0810b9bf9cd02db820fc791eac780a68e 100644 (file)
@@ -29,7 +29,7 @@ import org.opendaylight.controller.sal.binding.api.NotificationService;
 import org.opendaylight.controller.test.sal.binding.it.TestHelper;
 import org.opendaylight.openflowjava.protocol.impl.clients.ScenarioHandler;
 import org.opendaylight.openflowjava.protocol.impl.clients.SimpleClient;
-import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.OpenflowPluginProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved;
@@ -38,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Openday
 import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.util.Filter;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,14 +51,15 @@ public class SalIntegrationTest {
 
     private static final Logger LOG = LoggerFactory.getLogger(SalIntegrationTest.class);
 
-    @Inject
-    SwitchConnectionProvider switchConnectionProvider;
-
     @Inject
     BundleContext ctx;
 
     @Inject
     BindingAwareBroker broker;
+    
+    @Inject 
+    @Filter(timeout=20*1000)
+    OpenflowPluginProvider openflowPluginProvider;
 
     /**
      * @return timeout for case of failure
@@ -94,9 +96,9 @@ public class SalIntegrationTest {
         };
         ConsumerContext consumerReg = broker.registerConsumer(openflowConsumer, ctx);
         assertNotNull(consumerReg);
-
+        
         LOG.debug("handshake integration test");
-        LOG.debug("switchConnectionProvider: " + switchConnectionProvider);
+        LOG.debug("openflowPluginProvider: " + openflowPluginProvider);
 
         SimpleClient switchSim = new SimpleClient("localhost", 6653);
         switchSim.setSecuredClient(false);
@@ -143,7 +145,7 @@ public class SalIntegrationTest {
                 TestHelper.configMinumumBundles(),
                 TestHelper.baseModelBundles(),
                 TestHelper.flowCapableModelBundles(), 
-                
+                OFPaxOptionsAssistant.ofLibraryBundles(),
                 OFPaxOptionsAssistant.ofPluginBundles()
                 );
     }
index 08d22b96d67bcee2331ca6512904154cc11b6868..afb81f3d4227d6c0f6e39d388e58981f4360aebb 100644 (file)
                 <capability>
                     urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&amp;revision=2013-10-28
                 </capability>
-
+                
+                <!-- openflowjava -->
+                <capability>urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider:impl?module=openflow-switch-connection-provider-impl&amp;revision=2014-03-28</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider?module=openflow-switch-connection-provider&amp;revision=2014-03-28</capability>
+                <!-- openflowplugin -->
+                <capability>urn:opendaylight:params:xml:ns:yang:openflow:common:config:impl?module=openflow-provider-impl&amp;revision=2014-03-26</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:openflow:common:config?module=openflow-provider&amp;revision=2014-03-26</capability>
             </required-capabilities>
             <configuration>
 
                                 <name>ref_runtime-mapping-singleton</name>
                             </mapping-service>
                         </module>
+                        
+                        
+                        
+                        <!-- default OF-switch-connection-provider (port 6633) -->
+                        <module>
+                          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider:impl">prefix:openflow-switch-connection-provider-impl</type>
+                          <name>openflow-switch-connection-provider-default-impl</name>
+                          <port>6633</port>
+                          <switch-idle-timeout>15000</switch-idle-timeout>
+                        </module>
+                        <!-- default OF-switch-connection-provider (port 6653) -->
+                        <module>
+                          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider:impl">prefix:openflow-switch-connection-provider-impl</type>
+                          <name>openflow-switch-connection-provider-legacy-impl</name>
+                          <port>6653</port>
+                          <switch-idle-timeout>15000</switch-idle-timeout>
+                        </module>
+                
+                        <!-- default OF-plugin openflow-provider -->
+                        <module>
+                          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:common:config:impl">prefix:openflow-provider-impl</type>
+                          <name>openflow-provider-impl</name>
+                          
+                          <openflow-switch-connection-provider>
+                            <type xmlns:ofSwitch="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider">ofSwitch:openflow-switch-connection-provider</type>
+                            <name>openflow-switch-connection-provider-default</name>
+                          </openflow-switch-connection-provider>
+                          <openflow-switch-connection-provider>
+                            <type xmlns:ofSwitch="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider">ofSwitch:openflow-switch-connection-provider</type>
+                            <name>openflow-switch-connection-provider-legacy</name>
+                          </openflow-switch-connection-provider>
+                
+                          <binding-aware-broker>
+                            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
+                            <name>ref_binding-broker-impl</name>
+                          </binding-aware-broker>
+                        </module>
                     </modules>
 
                     <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
                                 </provider>
                             </instance>
                         </service>
+                        
+                        <!-- OFJava instances -->
+                        <service>
+                          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:provider">prefix:openflow-switch-connection-provider</type>
+                          <instance>
+                            <name>openflow-switch-connection-provider-default</name>
+                            <provider>/modules/module[type='openflow-switch-connection-provider-impl'][name='openflow-switch-connection-provider-default-impl']</provider>
+                          </instance>
+                          <instance>
+                            <name>openflow-switch-connection-provider-legacy</name>
+                            <provider>/modules/module[type='openflow-switch-connection-provider-impl'][name='openflow-switch-connection-provider-legacy-impl']</provider>
+                          </instance>
+                        </service>
+                        <!-- OFPlugin instance -->
+                        <service>
+                          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:openflow:common:config">prefix:openflow-provider</type>
+                          <instance>
+                            <name>openflow-provider</name>
+                            <provider>/modules/module[type='openflow-provider-impl'][name='openflow-provider-impl']</provider>
+                          </instance>
+                        </service>
                     </services>
                 </data>
 
index 5cafaf3316cf43b13402ebbe117531b19c9527d4..106eedf19883ca72c88ed8efc80ac4b4b8edd505 100644 (file)
     <artifactId>openflowplugin</artifactId>
     <packaging>bundle</packaging>
 
+    <properties>
+        <yangtools.version>0.6.2-SNAPSHOT</yangtools.version>
+        <yangtools.generator.version>0.6.2-SNAPSHOT</yangtools.generator.version>
+        <yangtools.binding.version>0.6.2-SNAPSHOT</yangtools.binding.version>
+        <jmxGeneratorPath>${project.build.directory}/generated-sources/config</jmxGeneratorPath>
+        <sal-binding-api.version>1.1-SNAPSHOT</sal-binding-api.version>
+    </properties>
+
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>2.3.6</version>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Bundle-Activator>
-                            org.opendaylight.openflowplugin.openflow.md.Activator
-                        </Bundle-Activator>
-                        <Private-Package>
-                            org.opendaylight.openflowplugin.md.*
-                        </Private-Package>
-                    </instructions>
-                    <manifestLocation>${project.build.directory}/META-INF</manifestLocation>
-                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yang-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>generate-sources</goal>
+                        </goals>
+                        <configuration>
+                            <codeGenerators>
+                                <generator>
+                                    <codeGeneratorClass>
+                                        org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+                                    </codeGeneratorClass>
+                                    <outputBaseDir>${project.build.directory}/generated-sources/config</outputBaseDir>
+                                    <additionalConfiguration>
+                                        <namespaceToPackage1>
+                                            urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
+                                        </namespaceToPackage1>
+                                    </additionalConfiguration>
+                                </generator>
+                                <generator>
+                                    <codeGeneratorClass>
+                                        org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+                                    </codeGeneratorClass>
+                                    <outputBaseDir>${project.build.directory}/generated-sources/sal</outputBaseDir>
+                                </generator>
+                                <generator>
+                                    <codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
+                                    <outputBaseDir>${project.build.directory}/site/models</outputBaseDir>
+                                </generator>
+                            </codeGenerators>
+                            <inspectDependencies>true</inspectDependencies>
+                        </configuration>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.opendaylight.controller</groupId>
+                        <artifactId>yang-jmx-generator-plugin</artifactId>
+                        <version>0.2.5-SNAPSHOT</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.opendaylight.yangtools</groupId>
+                        <artifactId>maven-sal-api-gen-plugin</artifactId>
+                        <version>${yangtools.version}</version>
+                        <type>jar</type>
+                    </dependency>
+                </dependencies>
             </plugin>
         </plugins>
     </build>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-broker-impl</artifactId>
+            <version>${sal-binding-api.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.opendaylight.openflowjava</groupId>
             <artifactId>openflow-protocol-api</artifactId>
             <groupId>org.opendaylight.openflowjava</groupId>
             <artifactId>openflow-protocol-spi</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.openflowjava</groupId>
+            <artifactId>openflow-protocol-impl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-api</artifactId>
+            <version>0.2.5-SNAPSHOT</version>
+        </dependency>
 
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
         <dependency>
-         <groupId>org.apache.commons</groupId>
-         <artifactId>commons-lang3</artifactId>
-         <version>3.1</version>
-       </dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.1</version>
+        </dependency>
         <dependency>
             <groupId>equinoxSDK381</groupId>
             <artifactId>org.eclipse.osgi</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-          <groupId>org.mockito</groupId>
+            <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>
         </dependency>
-        
+
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-log4j12</artifactId>
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/Activator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/Activator.java
deleted file mode 100644 (file)
index f809ddb..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md;
-
-import org.apache.felix.dm.Component;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
-import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
-import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.OpenflowPluginProvider;
-import org.osgi.framework.BundleContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Openflow protocol plugin Activator
- */
-public class Activator extends ComponentActivatorAbstractBase {
-    protected static final Logger logger = LoggerFactory.getLogger(Activator.class);
-
-    private OpenflowPluginProvider pluginProvider = new OpenflowPluginProvider();
-
-    /**
-     * Function called when the activator starts just after some initializations
-     * are done by the ComponentActivatorAbstractBase.
-     *
-     */
-    @Override
-    public void init() {
-        super.init();
-    }
-
-    /**
-     * Function called when the activator stops just before the cleanup done by
-     * ComponentActivatorAbstractBase
-     *
-     */
-    @Override
-    public void destroy() {
-        if (pluginProvider != null) {
-            pluginProvider.close();
-        }
-        super.destroy();
-    }
-
-    @Override
-    public void start(BundleContext arg0) {
-        logger.debug("start");
-        super.start(arg0);
-        pluginProvider.setContext(arg0);
-    }
-
-    /**
-     * Function that is used to communicate to dependency manager the list of
-     * known implementations for services inside a container
-     *
-     *
-     * @return An array containing all the CLASS objects that will be
-     *         instantiated in order to get an fully working implementation
-     *         Object
-     */
-    @Override
-    public Object[] getImplementations() {
-        Object[] res = {};
-        return res;
-    }
-
-    /**
-     * Function that is called when configuration of the dependencies is
-     * required.
-     *
-     * @param c
-     *            dependency manager Component object, used for configuring the
-     *            dependencies exported and imported
-     * @param imp
-     *            Implementation class that is being configured, needed as long
-     *            as the same routine can configure multiple implementations
-     * @param containerName
-     *            The containerName being configured, this allow also optional
-     *            per-container different behavior if needed, usually should not
-     *            be the case though.
-     */
-    @Override
-    public void configureInstance(Component c, Object imp, String containerName) {
-        // NOOP
-    }
-
-    /**
-     * Function that is used to communicate to dependency manager the list of
-     * known implementations for services that are container independent.
-     *
-     *
-     * @return An array containing all the CLASS objects that will be
-     *         instantiated in order to get an fully working implementation
-     *         Object
-     */
-    @Override
-    public Object[] getGlobalImplementations() {
-        Object[] res = { pluginProvider };
-        return res;
-    }
-
-    /**
-     * Function that is called when configuration of the dependencies is
-     * required.
-     *
-     * @param c
-     *            dependency manager Component object, used for configuring the
-     *            dependencies exported and imported
-     * @param imp
-     *            Implementation class that is being configured, needed as long
-     *            as the same routine can configure multiple implementations
-     */
-    @Override
-    public void configureGlobalInstance(Component c, Object imp) {
-         if (pluginProvider == imp) {
-            c.add(createServiceDependency().setService(BindingAwareBroker.class)
-                    .setCallbacks("setBroker", "unsetBroker").setRequired(true));
-            c.add(createServiceDependency().setService(SwitchConnectionProvider.class)
-                    .setCallbacks("setSwitchConnectionProvider", "unsetSwitchConnectionProvider").setRequired(true));
-            logger.debug("configuring Binding Aware Provider");
-        }
-    }
-
-}
index 9e8265a872c29cb24902e83c2ed5311139682770..42a8c67b5039b79144e41de8b38ceb1bc5f23535 100644 (file)
@@ -39,6 +39,9 @@ public class ErrorHandlerQueueImpl implements ErrorHandler {
             Exception error;
             try {
                 error = errorQueue.take();
+                if (error instanceof QueueShutdownItem) {
+                    break;
+                }
                 Throwable cause = error.getCause();
                 LOG.error(error.getMessage()+" -> "+cause.getMessage(), cause);
             } catch (InterruptedException e) {
@@ -65,7 +68,13 @@ public class ErrorHandlerQueueImpl implements ErrorHandler {
     }
 
     @Override
-    public void close() throws Exception {
-        //TODO: add special exception to queue and recognize it in run method
+    public void close() {
+        // add special exception to queue and recognize it in run method
+        errorQueue.add(new QueueShutdownItem());
+    }
+    
+    static class QueueShutdownItem extends Exception {
+        private static final long serialVersionUID = 1L;
+        // nothing
     }
 }
index 89d6ccd06a2c9c2f8192a5ba3821aa62addc63c3..629148f220a3c093dca0eb7837f05cb5b7ef8758 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -69,6 +70,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.JdkFutureAdapters;
+import com.google.common.util.concurrent.ListenableFuture;
 
 /**
  * @author mirehak
@@ -78,7 +82,7 @@ public class MDController implements IMDController, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(MDController.class);
 
-    private SwitchConnectionProvider switchConnectionProvider;
+    private Collection<SwitchConnectionProvider> switchConnectionProviders;
 
     private ConcurrentMap<TranslatorKey, Collection<IMDMessageTranslator<OfHeader, List<DataObject>>>> messageTranslators;
     private Map<Class<? extends DataObject>, Collection<PopListener<DataObject>>> popListeners;
@@ -87,6 +91,8 @@ public class MDController implements IMDController, AutoCloseable {
     final private int OF10 = OFConstants.OFP_VERSION_1_0;
     final private int OF13 = OFConstants.OFP_VERSION_1_3;
 
+    private ErrorHandlerQueueImpl errorHandler;
+
 
     /**
      * @return translator mapping
@@ -164,21 +170,11 @@ public class MDController implements IMDController, AutoCloseable {
     }
 
     /**
-     * @param switchConnectionProvider
-     *            the switchConnectionProvider to set
-     */
-    public void setSwitchConnectionProvider(SwitchConnectionProvider switchConnectionProvider) {
-        this.switchConnectionProvider = switchConnectionProvider;
-    }
-
-    /**
-     * @param switchConnectionProviderToUnset
-     *            the switchConnectionProvider to unset
+     * @param switchConnectionProviders
+     *            the switchConnectionProviders to set
      */
-    public void unsetSwitchConnectionProvider(SwitchConnectionProvider switchConnectionProviderToUnset) {
-        if (this.switchConnectionProvider == switchConnectionProviderToUnset) {
-            this.switchConnectionProvider = null;
-        }
+    public void setSwitchConnectionProviders(Collection<SwitchConnectionProvider> switchConnectionProviders) {
+        this.switchConnectionProviders = switchConnectionProviders;
     }
 
     /**
@@ -188,22 +184,25 @@ public class MDController implements IMDController, AutoCloseable {
      */
     public void start() {
         LOG.debug("starting ..");
-        LOG.debug("switchConnectionProvider: " + switchConnectionProvider);
+        LOG.debug("switchConnectionProvider: " + switchConnectionProviders);
         // setup handler
         SwitchConnectionHandlerImpl switchConnectionHandler = new SwitchConnectionHandlerImpl();
         switchConnectionHandler.setMessageSpy(messageSpyCounter);
 
-        ErrorHandlerQueueImpl errorHandler = new ErrorHandlerQueueImpl();
+        errorHandler = new ErrorHandlerQueueImpl();
         new Thread(errorHandler).start();
         
         switchConnectionHandler.setErrorHandler(errorHandler);
         switchConnectionHandler.init();
         
-        switchConnectionProvider.setSwitchConnectionHandler(switchConnectionHandler);
-
-        // configure and startup library servers
-        switchConnectionProvider.configure(getConnectionConfiguration());
-        Future<List<Boolean>> srvStarted = switchConnectionProvider.startup();
+        List<ListenableFuture<Boolean>> starterChain = new ArrayList<>();
+        for (SwitchConnectionProvider switchConnectionPrv : switchConnectionProviders) {
+            switchConnectionPrv.setSwitchConnectionHandler(switchConnectionHandler);
+            ListenableFuture<Boolean> isOnlineFuture = switchConnectionPrv.startup();
+            starterChain.add(isOnlineFuture);
+        }
+        
+        Future<List<Boolean>> srvStarted = Futures.allAsList(starterChain);
     }
 
     /**
@@ -224,9 +223,13 @@ public class MDController implements IMDController, AutoCloseable {
      */
     public void stop() {
         LOG.debug("stopping");
-        Future<List<Boolean>> srvStopped = switchConnectionProvider.shutdown();
+        List<ListenableFuture<Boolean>> stopChain = new ArrayList<>();
         try {
-            srvStopped.get(5000, TimeUnit.MILLISECONDS);
+            for (SwitchConnectionProvider switchConnectionPrv : switchConnectionProviders) {
+                ListenableFuture<Boolean> shutdown =  switchConnectionPrv.shutdown();
+                stopChain.add(shutdown);
+            }
+            Futures.allAsList(stopChain).get(5000, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.error(e.getMessage(), e);
         }
@@ -306,8 +309,11 @@ public class MDController implements IMDController, AutoCloseable {
         messageSpyCounter = null;
         messageTranslators = null;
         popListeners = null;
-        switchConnectionProvider.setSwitchConnectionHandler(null);
-        switchConnectionProvider = null;
+        for (SwitchConnectionProvider switchConnectionPrv : switchConnectionProviders) {
+            switchConnectionPrv.setSwitchConnectionHandler(null);
+        }
+        switchConnectionProviders = null;
         OFSessionUtil.releaseSessionManager();
+        errorHandler.close();
     }
 }
index 7db3eaea9fc0cd29bcd95953b2ef24fc5cf1f311..242348a659341e6de3ba7917313497ffe7262ece 100644 (file)
@@ -29,7 +29,7 @@ public class MessageCountCommandProvider implements CommandProvider, AutoCloseab
     private BundleContext ctx;
     private MessageCountDumper provider;
 
-    private ServiceRegistration commandRegistration;
+    private ServiceRegistration<?> commandRegistration;
     
     /**
      * @param ctx
index 1eeebadcf12e87b7e4b2f5fb32f47f9ddf423ced..6c7de9d5adff50eaaef1029c6eb7765f399ad386 100644 (file)
@@ -37,7 +37,7 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab
 
     private BundleContext context;
 
-    private SwitchConnectionProvider switchConnectionProvider;
+    private Collection<SwitchConnectionProvider> switchConnectionProviders;
 
     private MDController mdController;
     
@@ -48,21 +48,10 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab
     private SalRegistrationManager registrationManager;
     
     /**
-     * dependencymanager requirement 
-     * @param switchConnectionProviderArg
-     */
-    public void unsetSwitchConnectionProvider(SwitchConnectionProvider switchConnectionProviderArg) {
-        switchConnectionProvider = null;
-    }
-
-    /**
-     * dependencymanager requirement 
      * @param switchConnectionProvider
      */
-    public void setSwitchConnectionProvider(
-            SwitchConnectionProvider switchConnectionProvider) {
-        this.switchConnectionProvider = switchConnectionProvider;
-        registerProvider();
+    public void setSwitchConnectionProviders(Collection<SwitchConnectionProvider> switchConnectionProvider) {
+        this.switchConnectionProviders = switchConnectionProvider;
     }
 
     /**
@@ -75,7 +64,10 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab
     /**
      * dependencymanager requirement 
      * @param context
+     * 
+     * @deprecated we should stop relying on osgi to provide cli interface for messageCounter 
      */
+    @Deprecated
     public void setContext(BundleContext context) {
         this.context = context;
     }
@@ -87,7 +79,7 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab
         registrationManager = new SalRegistrationManager();
         registrationManager.onSessionInitiated(session);
         mdController = new MDController();
-        mdController.setSwitchConnectionProvider(switchConnectionProvider);
+        mdController.setSwitchConnectionProviders(switchConnectionProviders);
         mdController.setMessageSpyCounter(messageCountProvider);
         mdController.init();
         mdController.start();
@@ -134,7 +126,6 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab
      */
     public void setBroker(BindingAwareBroker broker) {
         this.broker = broker;
-        registerProvider();
     }
 
     /**
@@ -146,12 +137,17 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab
     }
 
     private boolean hasAllDependencies(){
-        if(this.broker != null && this.switchConnectionProvider != null) {
+        if(this.broker != null && this.switchConnectionProviders != null) {
             return true;
         }
         return false;
     }
-    private void registerProvider() {
+    
+    /**
+     * register providers for md-sal
+     */
+    public void registerProvider() {
+        //FIXME: is it needed
         if(hasAllDependencies()) {
             this.broker.registerProvider(this,context);
         }
diff --git a/openflowplugin/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/common/config/impl/rev140326/ConfigurableOpenFlowProviderModule.java b/openflowplugin/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/common/config/impl/rev140326/ConfigurableOpenFlowProviderModule.java
new file mode 100644 (file)
index 0000000..2cb919a
--- /dev/null
@@ -0,0 +1,67 @@
+/**
+* Generated file
+
+* Generated from: yang module name: openflow-provider-impl  yang module local name: openflow-provider-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Wed Apr 02 16:59:36 PDT 2014
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326;
+
+import org.opendaylight.openflowplugin.openflow.md.core.sal.OpenflowPluginProvider;
+import org.osgi.framework.BundleContext;
+
+/**
+*
+*/
+public final class ConfigurableOpenFlowProviderModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326.AbstractConfigurableOpenFlowProviderModule {
+    
+    private OpenflowPluginProvider pluginProvider;
+    private BundleContext bundleContext;
+    
+    /**
+     * @param identifier
+     * @param dependencyResolver
+     */
+    public ConfigurableOpenFlowProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
+    }
+
+    /**
+     * @param identifier
+     * @param dependencyResolver
+     * @param oldModule
+     * @param oldInstance
+     */
+    public ConfigurableOpenFlowProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+            ConfigurableOpenFlowProviderModule oldModule, java.lang.AutoCloseable oldInstance) {
+
+        super(identifier, dependencyResolver, oldModule, oldInstance);
+    }
+
+    @Override
+    protected void customValidation() {
+        // Add custom validation for module attributes here.
+    }
+
+    @Override
+    public java.lang.AutoCloseable createInstance() {
+        pluginProvider =  new OpenflowPluginProvider();
+        pluginProvider.setContext(bundleContext);
+        pluginProvider.setBroker(getBindingAwareBrokerDependency());
+        pluginProvider.setSwitchConnectionProviders(getOpenflowSwitchConnectionProviderDependency());
+        pluginProvider.registerProvider();
+        return pluginProvider;
+    }
+    
+    /**
+     * @param bundleContext the bundleContext to set, see {@link OpenflowPluginProvider#setContext(BundleContext)}
+     * 
+     * @deprecated we should avoid osgi specific stuff .. once, 
+     */
+    @Deprecated
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+}
diff --git a/openflowplugin/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/common/config/impl/rev140326/ConfigurableOpenFlowProviderModuleFactory.java b/openflowplugin/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/common/config/impl/rev140326/ConfigurableOpenFlowProviderModuleFactory.java
new file mode 100644 (file)
index 0000000..1631a22
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+* Generated file
+
+* Generated from: yang module name: openflow-provider-impl  yang module local name: openflow-provider-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Wed Apr 02 16:59:36 PDT 2014
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326;
+
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.osgi.framework.BundleContext;
+
+/**
+ * the only purpose of this overwritings is to deliver bundleContext from osgi to module
+ */
+public class ConfigurableOpenFlowProviderModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326.AbstractConfigurableOpenFlowProviderModuleFactory
+{
+    @Override
+    public ConfigurableOpenFlowProviderModule instantiateModule(
+            String instanceName, DependencyResolver dependencyResolver,
+            BundleContext bundleContext) {
+        ConfigurableOpenFlowProviderModule module = super.instantiateModule(instanceName, dependencyResolver, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
+    
+    @Override
+    public ConfigurableOpenFlowProviderModule instantiateModule(
+            String instanceName, DependencyResolver dependencyResolver,
+            ConfigurableOpenFlowProviderModule oldModule,
+            AutoCloseable oldInstance, BundleContext bundleContext) {
+        ConfigurableOpenFlowProviderModule module = super.instantiateModule(instanceName, dependencyResolver, oldModule,
+                        oldInstance, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
+}
diff --git a/openflowplugin/src/main/yang/openflow-plugin-cfg-impl.yang b/openflowplugin/src/main/yang/openflow-plugin-cfg-impl.yang
new file mode 100644 (file)
index 0000000..36827b7
--- /dev/null
@@ -0,0 +1,48 @@
+module openflow-provider-impl {
+       yang-version 1;
+    namespace "urn:opendaylight:params:xml:ns:yang:openflow:common:config:impl";
+    prefix "ofplugin-cfg-impl";
+
+    import config {prefix config; revision-date 2013-04-05;}
+    import openflow-provider {prefix openflow-provider;}
+    import openflow-switch-connection-provider {prefix openflow-switch-connection-provider;revision-date 2014-03-28;}
+    import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
+
+
+    description
+        "openflow-plugin-custom-config-impl";
+
+    revision "2014-03-26" {
+        description
+            "Initial revision";
+    }
+
+    identity openflow-provider-impl {
+        base config:module-type;
+        config:provided-service openflow-provider:openflow-provider;
+        config:java-name-prefix ConfigurableOpenFlowProvider;
+    }
+
+    augment "/config:modules/config:module/config:configuration" {
+        case openflow-provider-impl {
+            when "/config:modules/config:module/config:type = 'openflow-provider-impl'";
+
+            container binding-aware-broker {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity md-sal-binding:binding-broker-osgi-registry;
+                    }
+                }
+            }
+            list openflow-switch-connection-provider {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity openflow-switch-connection-provider:openflow-switch-connection-provider;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/openflowplugin/src/main/yang/openflow-plugin-cfg.yang b/openflowplugin/src/main/yang/openflow-plugin-cfg.yang
new file mode 100644 (file)
index 0000000..2848c29
--- /dev/null
@@ -0,0 +1,20 @@
+module openflow-provider {
+       yang-version 1;
+    namespace "urn:opendaylight:params:xml:ns:yang:openflow:common:config";
+    prefix "ofplugin-cfg";
+
+    import config {prefix config; revision-date 2013-04-05; }
+
+    description
+        "openflow-plugin-custom-config";
+
+    revision "2014-03-26" {
+        description
+            "Initial revision";
+    }
+
+    identity openflow-provider{
+        base config:service-type;
+        config:java-class "org.opendaylight.openflowplugin.openflow.md.core.sal.OpenflowPluginProvider";
+    }
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index c3e03d372494e46cc582fd7f7873b2db74f4a94e..14c3e2e8465df905ec331315c976370233f19656 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -51,6 +51,7 @@
       <xtend.dstdir>src/main/xtend-gen</xtend.dstdir>
       <jmxGeneratorPath>src/main/yang-gen-config</jmxGeneratorPath>
       <salGeneratorPath>src/main/yang-gen-sal</salGeneratorPath>
+      <maven.bundle.version>2.4.0</maven.bundle.version>
     </properties>
 
     <dependencyManagement>
                 </execution>
              </executions>
             </plugin>
+            <plugin>
+              <groupId>org.opendaylight.yangtools</groupId>
+              <artifactId>yang-maven-plugin</artifactId>
+              <version>0.6.2-SNAPSHOT</version>
+            </plugin>
+            <plugin>
+              <groupId>org.apache.felix</groupId>
+              <artifactId>maven-bundle-plugin</artifactId>
+              <version>${maven.bundle.version}</version>
+              <extensions>true</extensions>
+              <configuration>
+                <instructions>
+                  <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
+                </instructions>
+                <manifestLocation>${project.build.directory}/META-INF</manifestLocation>
+              </configuration>
+            </plugin>
           </plugins>
         </pluginManagement>
     </build>