Added routed rpcs to pcep-topology|tunnel-provider 36/4136/10
authorMaros Marsalek <mmarsale@cisco.com>
Thu, 9 Jan 2014 11:52:25 +0000 (12:52 +0100)
committerMaros Marsalek <mmarsale@cisco.com>
Mon, 20 Jan 2014 10:08:42 +0000 (11:08 +0100)
Also added integration(pax-exam) test to test the routing

Change-Id: I385f99ecc0fbb9c3cee0a555c87335f3080e2412
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
18 files changed:
commons/parent/pom.xml
integration-tests/pom.xml
integration-tests/src/test/java/org/opendaylight/protocol/integration/AbstractBundleTest.java
integration-tests/src/test/java/org/opendaylight/protocol/integration/TestHelper.java [new file with mode: 0644]
integration-tests/src/test/java/org/opendaylight/protocol/integration/pcep/AbstractPcepOsgiTest.java [new file with mode: 0644]
integration-tests/src/test/java/org/opendaylight/protocol/integration/pcep/PcepRpcServicesRoutingTest.java [new file with mode: 0644]
integration-tests/src/test/resources/config/controller.xml [new file with mode: 0644]
pcep/topology-api/pom.xml
pcep/topology-api/src/main/yang/network-topology-pcep.yang
pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java
pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyProgramming.java
pcep/tunnel-api/pom.xml
pcep/tunnel-api/src/main/yang/topology-tunnel-pcep-programming.yang
pcep/tunnel-provider-config/src/main/java/org/opendaylight/controller/config/yang/pcep/tunnel/provider/PCEPTunnelTopologyProviderModule.java
programming/topology-api/src/main/java/org/opendaylight/bgpcep/programming/topology/TopologyProgrammingUtil.java
programming/topology-api/src/main/yang/network-topology-programming.yang
topology/api/pom.xml
topology/api/src/main/yang/odl-network-topology.yang [new file with mode: 0644]

index a6a0f9466559c7d993b512110bebc827cc03d8d2..1dd74c7cdf7c35e7b3355446f7670fbd4158328d 100644 (file)
@@ -57,6 +57,7 @@
         <controller.config.version>0.2.3-SNAPSHOT</controller.config.version>
         <ietf.types.version>2010.09.24.2-SNAPSHOT</ietf.types.version>
         <ietf.topology.version>2013.10.21.0-SNAPSHOT</ietf.topology.version>
+        <yang-ext.version>2013.09.07.1-SNAPSHOT</yang-ext.version>
     </properties>
 
     <dependencyManagement>
                 <version>1.0-SNAPSHOT</version>
                 <scope>test</scope>
             </dependency>
+            <dependency>
+                <groupId>org.opendaylight.controller</groupId>
+                <artifactId>sal-binding-util</artifactId>
+                <version>1.0-SNAPSHOT</version>
+            </dependency>
 
             <!-- Models -->
             <dependency>
                 <artifactId>ietf-topology-ospf</artifactId>
                 <version>${ietf.topology.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.opendaylight.yangtools.model</groupId>
+                <artifactId>yang-ext</artifactId>
+                <version>${yang-ext.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
index 8cf38ea1c0eea5a903a61b8ac0fad9fcd1945dfb..640815a922f3f23bc613d217a64c48c23e0f09fc 100644 (file)
         <maven>3.0.4</maven>
     </prerequisites>
 
+    <repositories>
+        <repository>
+            <id>opendaylight-mirror</id>
+            <name>opendaylight-mirror</name>
+            <url>${nexusproxy}/groups/public/</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+                <updatePolicy>never</updatePolicy>
+            </releases>
+        </repository>
+    </repositories>
+
     <properties>
         <exam.version>3.3.0</exam.version>
         <url.version>1.6.0</url.version>
         <felix.version>4.2.1</felix.version>
+        <antlr.version>4.0</antlr.version>
+        <yang-concepts.version>0.1.1-SNAPSHOT</yang-concepts.version>
+        <xtend-lib-osgi.version>2.4.3</xtend-lib-osgi.version>
+        <logback-classic.version>1.0.9</logback-classic.version>
+        <moxy.controller.version>2.5.0</moxy.controller.version>
     </properties>
 
-    <dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.ops4j.pax.exam</groupId>
+                <artifactId>maven-paxexam-plugin</artifactId>
+                <version>1.2.4</version>
+                <executions>
+                    <execution>
+                        <id>generate-config</id>
+                        <goals>
+                            <goal>generate-depends-file</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+        <!--This plugin's configuration is used to store Eclipse
+            m2e settings only. It has no influence on the Maven build itself. -->
+            <plugin>
+                <groupId>org.eclipse.m2e</groupId>
+                <artifactId>lifecycle-mapping</artifactId>
+                <version>1.0.0</version>
+                <configuration>
+                    <lifecycleMappingMetadata>
+                        <pluginExecutions>
+                            <pluginExecution>
+                                <pluginExecutionFilter>
+                                    <groupId>
+                                        org.ops4j.pax.exam
+                                    </groupId>
+                                    <artifactId>
+                                        maven-paxexam-plugin
+                                    </artifactId>
+                                    <versionRange>
+                                        [1.2.4,)
+                                    </versionRange>
+                                    <goals>
+                                        <goal>
+                                            generate-depends-file
+                                        </goal>
+                                    </goals>
+                                </pluginExecutionFilter>
+                                <action>
+                                    <ignore></ignore>
+                                </action>
+                            </pluginExecution>
+                        </pluginExecutions>
+                    </lifecycleMappingMetadata>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+       <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.controller.thirdparty</groupId>
+            <artifactId>exificient</artifactId>
+            <version>0.9.2-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback-classic.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>logback-config</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-manager</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-netconf-connector</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>yang-jmx-generator</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>netconf-monitoring</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>netconf-impl</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>ietf-netconf-monitoring</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>yang-store-impl</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-persister-impl</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-persister-file-xml-adapter</artifactId>
+            <version>${controller.config.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.persistence</groupId>
+            <artifactId>org.eclipse.persistence.moxy</artifactId>
+            <version>${moxy.controller.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.persistence</groupId>
+            <artifactId>org.eclipse.persistence.core</artifactId>
+            <version>${moxy.controller.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+            <artifactId>antlr4-runtime-osgi-nohead</artifactId>
+            <version>${antlr.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>mockito-configuration</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>pcep-topology-api</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>bgp-parser-mock</artifactId>
+            <artifactId>pcep-tunnel-api</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>pcep-api</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>topology-api</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>programming-topology-api</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+                       <groupId>${project.groupId}</groupId>
+                       <artifactId>bgp-parser-mock</artifactId>
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>xml-apis</groupId>
+                    <artifactId>xml-apis</artifactId>
+                </exclusion>
+            </exclusions>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-util</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.controller</groupId>
         <dependency>
             <groupId>org.opendaylight.yangtools.thirdparty</groupId>
             <artifactId>xtend-lib-osgi</artifactId>
-            <version>2.4.3</version>
+            <version>${xtend-lib-osgi.version}</version>
             <scope>test</scope>
         </dependency>
 
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.framework</artifactId>
-            <version>${felix.version}</version>
+            <groupId>equinoxSDK381</groupId>
+            <artifactId>org.eclipse.osgi</artifactId>
+            <version>3.8.1.v20120830-144521</version>
             <scope>test</scope>
         </dependency>
         <dependency>
index ce52cf72f0971e97a71ad8595e33f075e3c5ed9a..eb2ce6b3d8c57652e7f85c2418ccbac3e168cfb9 100644 (file)
@@ -45,30 +45,26 @@ public abstract class AbstractBundleTest {
        private List<Option> coreBundles() {
                final List<Option> ret = new ArrayList<>();
 
-               ret.add(mavenBundle("ch.qos.logback", "logback-classic", "1.0.9"));
-               ret.add(mavenBundle("ch.qos.logback", "logback-core", "1.0.9"));
-               ret.add(mavenBundle("com.google.guava", "guava", "14.0.1"));
-               ret.add(mavenBundle("commons-codec", "commons-codec", "1.7"));
-               ret.add(mavenBundle("io.netty", "netty-buffer", "4.0.9.Final"));
-               ret.add(mavenBundle("io.netty", "netty-codec", "4.0.9.Final"));
-               ret.add(mavenBundle("io.netty", "netty-common", "4.0.9.Final"));
-               ret.add(mavenBundle("io.netty", "netty-transport", "4.0.9.Final"));
-               ret.add(mavenBundle("org.slf4j", "slf4j-api", "1.7.2"));
-
-               ret.add(mavenBundle("org.opendaylight.yangtools", "concepts", "0.6.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.yangtools", "yang-binding", "0.6.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.yangtools", "yang-common", "0.6.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.yangtools.model", "ietf-inet-types", "2010.09.24.2-SNAPSHOT"));
-
-               ret.add(mavenBundle("org.javassist", "javassist", "3.17.1-GA"));
-               ret.add(mavenBundle("org.opendaylight.controller", "config-api", "0.2.3-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.controller", "protocol-framework", "0.4.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.controller", "sal-common-api", "1.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.controller", "sal-binding-api", "1.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.controller", "sal-binding-broker-impl", "1.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.controller", "sal-binding-config", "1.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.controller", "sal-common", "1.0-SNAPSHOT"));
-               ret.add(mavenBundle("org.opendaylight.yangtools.thirdparty", "xtend-lib-osgi", "2.4.3"));
+               ret.add(mavenBundle("com.google.guava", "guava").versionAsInProject());
+               ret.add(mavenBundle("commons-codec", "commons-codec").versionAsInProject());
+
+               ret.add(TestHelper.getNettyBundles());
+               ret.add(TestHelper.getLoggingBundles());
+
+               ret.add(mavenBundle("org.opendaylight.yangtools", "concepts").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.yangtools", "yang-binding").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.yangtools", "yang-common").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.yangtools.model", "ietf-inet-types").versionAsInProject());
+
+               ret.add(mavenBundle("org.javassist", "javassist").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.controller", "config-api").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.controller", "protocol-framework").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.controller", "sal-common-api").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.controller", "sal-binding-api").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.controller", "sal-binding-broker-impl").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.controller", "sal-binding-config").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.controller", "sal-common").versionAsInProject());
+               ret.add(mavenBundle("org.opendaylight.yangtools.thirdparty", "xtend-lib-osgi").versionAsInProject());
 
                return ret;
        }
diff --git a/integration-tests/src/test/java/org/opendaylight/protocol/integration/TestHelper.java b/integration-tests/src/test/java/org/opendaylight/protocol/integration/TestHelper.java
new file mode 100644 (file)
index 0000000..4411190
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * 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.protocol.integration;
+
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.options.DefaultCompositeOption;
+import org.ops4j.pax.exam.util.PathUtils;
+
+import static org.ops4j.pax.exam.CoreOptions.frameworkProperty;
+import static org.ops4j.pax.exam.CoreOptions.junitBundles;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
+public class TestHelper {
+
+    public static final String CONTROLLER = "org.opendaylight.controller";
+    public static final String YANGTOOLS = "org.opendaylight.yangtools";
+    public static final String CONTROLLER_MODELS = "org.opendaylight.controller.model";
+    public static final String YANGTOOLS_MODELS = "org.opendaylight.yangtools.model";
+
+    public static Option mdSalCoreBundles() {
+        return new DefaultCompositeOption( //
+                mavenBundle(YANGTOOLS, "concepts").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS, "yang-binding").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS, "yang-common").versionAsInProject(), // //
+                mavenBundle(CONTROLLER, "sal-common").versionAsInProject(), // //
+                mavenBundle(CONTROLLER, "sal-common-api").versionAsInProject(), // //
+                mavenBundle(CONTROLLER, "sal-common-impl").versionAsInProject(), // //
+
+                mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(), //
+                mavenBundle("com.google.guava", "guava").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS + ".thirdparty", "xtend-lib-osgi").versionAsInProject() //
+        );
+    }
+
+    public static Option configMinumumBundles() {
+        return new DefaultCompositeOption(
+                mavenBundle("org.opendaylight.controller", "protocol-framework").versionAsInProject(), //
+                mavenBundle("org.opendaylight.bgpcep", "util").versionAsInProject(), //
+                mavenBundle("commons-codec", "commons-codec").versionAsInProject(),
+
+                mavenBundle(CONTROLLER, "config-api").versionAsInProject(), // //
+                mavenBundle(CONTROLLER, "config-manager").versionAsInProject(), // //
+                mavenBundle("commons-io", "commons-io").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "config-api").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "config-manager").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "yang-jmx-generator").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "yang-store-api").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "yang-store-impl").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "logback-config").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "config-persister-api").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "netconf-api").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "ietf-netconf-monitoring").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "ietf-netconf-monitoring-extension").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "netconf-monitoring").versionAsInProject(), //
+
+                mavenBundle(CONTROLLER, "netconf-client").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "netconf-util").versionAsInProject(), //
+                mavenBundle(CONTROLLER + ".thirdparty", "ganymed", "1.0-SNAPSHOT"), //
+                mavenBundle(CONTROLLER, "netconf-mapping-api").versionAsInProject(), //
+
+                mavenBundle(CONTROLLER, "config-persister-impl").versionAsInProject(), //
+
+                getNettyBundles(), //
+
+                mavenBundle("org.opendaylight.controller.thirdparty", "exificient").versionAsInProject(), //
+
+                mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.xerces", "2.11.0_1"),
+                mavenBundle("org.eclipse.birt.runtime.3_7_1", "org.apache.xml.resolver", "1.2.0"),
+
+                mavenBundle(CONTROLLER, "config-netconf-connector").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "netconf-impl").versionAsInProject(), //
+
+                mavenBundle(CONTROLLER, "config-persister-file-xml-adapter").versionAsInProject().noStart(),
+                mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.moxy").versionAsInProject(),
+                mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.core").versionAsInProject());
+
+    }
+
+    public static DefaultCompositeOption getNettyBundles() {
+        return new DefaultCompositeOption(
+                mavenBundle("io.netty", "netty-handler").versionAsInProject(), //
+                mavenBundle("io.netty", "netty-codec").versionAsInProject(), //
+                mavenBundle("io.netty", "netty-buffer").versionAsInProject(), //
+                mavenBundle("io.netty", "netty-transport").versionAsInProject(), //
+                mavenBundle("io.netty", "netty-common").versionAsInProject());
+    }
+
+    public static DefaultCompositeOption getLoggingBundles() {
+        return new DefaultCompositeOption(
+                mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(), //
+                mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(), //
+                mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject());
+    }
+
+    public static Option bindingAwareSalBundles() {
+        return new DefaultCompositeOption( //
+                mavenBundle(CONTROLLER, "sal-binding-api").versionAsInProject(), // //
+                mavenBundle(CONTROLLER, "sal-binding-config").versionAsInProject(), //
+                mavenBundle(CONTROLLER, "sal-binding-broker-impl").versionAsInProject(), // //
+                mavenBundle(CONTROLLER, "sal-binding-util").versionAsInProject(), // //
+                mavenBundle("org.javassist", "javassist").versionAsInProject(), // //
+                mavenBundle(CONTROLLER, "sal-common-util").versionAsInProject(), // //
+
+                mavenBundle(YANGTOOLS, "yang-data-api").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS, "yang-data-impl").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS, "yang-model-api").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS, "yang-model-util").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS, "yang-parser-api").versionAsInProject(), //
+                mavenBundle(YANGTOOLS, "yang-parser-impl").versionAsInProject(),
+
+                mavenBundle(YANGTOOLS, "binding-generator-spi").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS, "binding-model-api").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS, "binding-generator-util").versionAsInProject(), //
+                mavenBundle(YANGTOOLS, "yang-parser-impl").versionAsInProject(), //
+                mavenBundle(YANGTOOLS, "binding-type-provider").versionAsInProject(), //
+                mavenBundle(YANGTOOLS, "binding-generator-api").versionAsInProject(), mavenBundle(YANGTOOLS,
+                        "binding-generator-spi").versionAsInProject(), //
+                mavenBundle(YANGTOOLS, "binding-generator-impl").versionAsInProject(),
+
+                mavenBundle(CONTROLLER, "sal-core-api").versionAsInProject().update(), //
+                mavenBundle(CONTROLLER, "sal-broker-impl").versionAsInProject(), // //
+                mavenBundle(CONTROLLER, "sal-core-spi").versionAsInProject().update(), //
+
+                mavenBundle(YANGTOOLS + ".thirdparty", "antlr4-runtime-osgi-nohead").versionAsInProject(), // //
+
+                systemProperty("netconf.tcp.address").value("0.0.0.0"), //
+                systemProperty("netconf.tcp.port").value("18383"), //
+                systemProperty("netconf.tcp.client.address").value("127.0.0.1"), //
+                systemProperty("netconf.tcp.client.port").value("18383"), //
+                systemProperty("netconf.config.persister.active").value("1"), //
+                systemProperty("netconf.config.persister.1.storageAdapterClass").value(
+                        "org.opendaylight.controller.config.persist.storage.file.xml.XmlFileStorageAdapter"), //
+                systemProperty("netconf.config.persister.1.properties.fileStorage").value(
+                        PathUtils.getBaseDir() + "/src/test/resources/config/controller.xml"), //
+                systemProperty("netconf.config.persister.1.properties.numberOfBackups").value("1") //
+                // systemProperty("yangstore.blacklist").value(".*controller.model.*")
+        );
+
+    }
+
+    public static Option flowCapableModelBundles() {
+        return new DefaultCompositeOption( //
+                mavenBundle(CONTROLLER_MODELS, "model-flow-base").versionAsInProject(), // //
+                mavenBundle(CONTROLLER_MODELS, "model-flow-service").versionAsInProject(), // //
+                mavenBundle(CONTROLLER_MODELS, "model-inventory").versionAsInProject() //
+        );
+
+    }
+
+    public static Option baseModelBundles() {
+        return new DefaultCompositeOption( //
+                mavenBundle(YANGTOOLS_MODELS, "yang-ext").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS_MODELS, "ietf-inet-types").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS_MODELS, "ietf-yang-types").versionAsInProject(), // //
+                mavenBundle(YANGTOOLS_MODELS, "opendaylight-l2-types").versionAsInProject(), // //
+                mavenBundle(CONTROLLER_MODELS, "model-inventory").versionAsInProject());
+    }
+
+    public static Option junitAndMockitoBundles() {
+        return new DefaultCompositeOption(
+        // Repository required to load harmcrest (OSGi-fied version).
+        // Mockito
+                mavenBundle("org.mockito", "mockito-all", "1.9.5"), junitBundles(),
+
+                /*
+                 * Felix has implicit boot delegation enabled by default. It
+                 * conflicts with Mockito: java.lang.LinkageError: loader
+                 * constraint violation in interface itable initialization: when
+                 * resolving method
+                 * "org.osgi.service.useradmin.User$$EnhancerByMockitoWithCGLIB$$dd2f81dc
+                 * .
+                 * newInstance(Lorg/mockito/cglib/proxy/Callback;)Ljava/lang/Object
+                 * ;" the class loader (instance of
+                 * org/mockito/internal/creation/jmock/SearchingClassLoader) of
+                 * the current class, org/osgi/service/useradmin/
+                 * User$$EnhancerByMockitoWithCGLIB$$dd2f81dc, and the class
+                 * loader (instance of org/apache/felix/framework/
+                 * BundleWiringImpl$BundleClassLoaderJava5) for interface
+                 * org/mockito/cglib/proxy/Factory have different Class objects
+                 * for the type org/mockito/cglib/ proxy/Callback used in the
+                 * signature
+                 *
+                 * So we disable the bootdelegation. this property has no effect
+                 * on the other OSGi implementation.
+                 */
+                frameworkProperty("felix.bootdelegation.implicit").value("false"));
+    }
+}
diff --git a/integration-tests/src/test/java/org/opendaylight/protocol/integration/pcep/AbstractPcepOsgiTest.java b/integration-tests/src/test/java/org/opendaylight/protocol/integration/pcep/AbstractPcepOsgiTest.java
new file mode 100644 (file)
index 0000000..bba823f
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * 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.protocol.integration.pcep;
+
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.protocol.integration.TestHelper;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.RpcService;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.options.DefaultCompositeOption;
+import org.ops4j.pax.exam.util.Filter;
+import org.osgi.framework.BundleContext;
+
+import javax.inject.Inject;
+import java.util.Collection;
+import java.util.Collections;
+
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
+public class AbstractPcepOsgiTest {
+       @Inject
+       @Filter(timeout=60*1000)
+       BindingAwareBroker broker;
+       @Inject
+       BundleContext bundleContext;
+
+       public BindingAwareBroker getBroker() {
+               return broker;
+       }
+
+       public void setBroker(BindingAwareBroker broker) {
+               this.broker = broker;
+       }
+
+       public BundleContext getBundleContext() {
+               return bundleContext;
+       }
+
+       public void setBundleContext(BundleContext bundleContext) {
+               this.bundleContext = bundleContext;
+       }
+
+       @Configuration
+       public Option[] config() {
+               return options(TestHelper.getLoggingBundles(), //
+
+                               pcepModules(), //
+                               systemProperty("osgi.bundles.defaultStartLevel").value("4"),
+
+                               TestHelper.mdSalCoreBundles(),
+
+                               TestHelper.bindingAwareSalBundles(),
+                               TestHelper.configMinumumBundles(),
+                               TestHelper.baseModelBundles(),
+                               TestHelper.flowCapableModelBundles(),
+                TestHelper.junitAndMockitoBundles());
+       }
+
+       private Option pcepModules() {
+               return new DefaultCompositeOption(mavenBundle("org.opendaylight.yangtools.model", "ietf-topology").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "pcep-topology-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "pcep-tunnel-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "pcep-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "topology-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "topology-tunnel-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "programming-topology-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "programming-tunnel-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "concepts").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "util").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "rsvp-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "programming-api").versionAsInProject());
+       }
+
+       abstract class AbstractTestProvider implements BindingAwareProvider {
+
+               @Override
+               public Collection<? extends RpcService> getImplementations() {
+                       return Collections.emptySet();
+               }
+
+               @Override
+               public Collection<? extends ProviderFunctionality> getFunctionality() {
+                       return Collections.emptySet();
+               }
+
+               @Override
+               public void onSessionInitialized(BindingAwareBroker.ConsumerContext session) {}
+
+       }
+
+       TopologyKey getTopologyId(String id) {
+               return new TopologyKey(new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId(id));
+       }
+}
diff --git a/integration-tests/src/test/java/org/opendaylight/protocol/integration/pcep/PcepRpcServicesRoutingTest.java b/integration-tests/src/test/java/org/opendaylight/protocol/integration/pcep/PcepRpcServicesRoutingTest.java
new file mode 100644 (file)
index 0000000..052b778
--- /dev/null
@@ -0,0 +1,323 @@
+/*
+ * 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.protocol.integration.pcep;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer;
+import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.topology.rev140113.NetworkTopologyContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.topology.rev140113.NetworkTopologyRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.NetworkTopologyPcepProgrammingService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.NetworkTopologyPcepService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.programming.rev131030.PcepCreateP2pTunnelInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.programming.rev131030.PcepCreateP2pTunnelInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.programming.rev131030.PcepDestroyTunnelInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.programming.rev131030.PcepDestroyTunnelInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.programming.rev131030.TopologyTunnelPcepProgrammingService;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+
+import java.lang.reflect.Method;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(org.ops4j.pax.exam.spi.reactors.PerClass.class)
+public class PcepRpcServicesRoutingTest extends AbstractPcepOsgiTest {
+
+       @Test
+       public void testRoutedRpcNetworkTopologyPcepService() throws Exception {
+               final NetworkTopologyPcepService pcepService1 = mock(NetworkTopologyPcepService.class, "First pcep Service");
+               final NetworkTopologyPcepService pcepService2 = mock(NetworkTopologyPcepService.class, "Second pcep Service");
+
+               assertNotNull(getBroker());
+
+               final InstanceIdentifier<Topology> topology =
+                               InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(getTopologyId("Topo1"))).toInstance();
+
+               BindingAwareProvider provider1 = new AbstractTestProvider() {
+
+                       @Override
+                       public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) {
+                               assertNotNull(session);
+                               BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepService> firstReg = session.addRoutedRpcImplementation(NetworkTopologyPcepService.class, pcepService1);
+                               assertNotNull("Registration should not be null", firstReg);
+                               assertSame(pcepService1, firstReg.getInstance());
+
+                               firstReg.registerPath(NetworkTopologyContext.class, topology);
+                       }
+               };
+
+               broker.registerProvider(provider1, getBundleContext());
+
+               final InstanceIdentifier<Topology> topology2 =
+                               InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(getTopologyId("Topo2"))).toInstance();
+
+               BindingAwareProvider provider2 = new AbstractTestProvider() {
+
+                       @Override
+                       public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) {
+                               assertNotNull(session);
+                               BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepService> secondReg = session.addRoutedRpcImplementation(NetworkTopologyPcepService.class, pcepService2);
+                               secondReg.registerPath(NetworkTopologyContext.class, topology2);
+                       }
+               };
+
+               broker.registerProvider(provider2, getBundleContext());
+
+               BindingAwareConsumer consumer = new BindingAwareConsumer() {
+                       @Override
+                       public void onSessionInitialized(final BindingAwareBroker.ConsumerContext session) {
+                               NetworkTopologyPcepService consumerPcepService = session.getRpcService(NetworkTopologyPcepService.class);
+
+                               assertNotNull(consumerPcepService);
+                               assertNotSame(pcepService1, consumerPcepService);
+                               assertNotSame(pcepService2, consumerPcepService);
+
+                               testAddLspRpce(consumerPcepService);
+                               testEnsureLspRpce(consumerPcepService);
+                       }
+
+                       private void testAddLspRpce(NetworkTopologyPcepService consumerPcepService) {
+                               AddLspInput addLspInput = getInputForRpc(topology, AddLspInputBuilder.class, AddLspInput.class);
+                               consumerPcepService.addLsp(addLspInput);
+
+                               verify(pcepService1).addLsp(addLspInput);
+                               verifyZeroInteractions(pcepService2);
+
+                               addLspInput = getInputForRpc(topology2, AddLspInputBuilder.class, AddLspInput.class);
+
+                               consumerPcepService.addLsp(addLspInput);
+
+                               verifyZeroInteractions(pcepService1);
+                               verify(pcepService2).addLsp(addLspInput);
+                       }
+
+                       private void testEnsureLspRpce(NetworkTopologyPcepService consumerPcepService) {
+                               EnsureLspOperationalInput ensureInput = getInputForRpc(topology, EnsureLspOperationalInputBuilder.class, EnsureLspOperationalInput.class);
+
+                               consumerPcepService.ensureLspOperational(ensureInput);
+
+                               verify(pcepService1).ensureLspOperational(ensureInput);
+                               verifyZeroInteractions(pcepService2);
+
+                               ensureInput = getInputForRpc(topology2, EnsureLspOperationalInputBuilder.class, EnsureLspOperationalInput.class);
+
+                               consumerPcepService.ensureLspOperational(ensureInput);
+
+                               verifyZeroInteractions(pcepService1);
+                               verify(pcepService2).ensureLspOperational(ensureInput);
+                       }
+               };
+               broker.registerConsumer(consumer, getBundleContext());
+       }
+
+       private static <T> T getInputForRpc(final InstanceIdentifier<Topology> topology, Class<?> builderClass,
+                       Class<T> builtObjectClass) {
+               try {
+                       Object builderInstance = builderClass.newInstance();
+                       Method method = builderClass.getMethod("setNetworkTopologyRef", NetworkTopologyRef.class);
+                       method.invoke(builderInstance, new NetworkTopologyRef(topology));
+                       return builtObjectClass.cast(builderClass.getMethod("build").invoke(builderInstance));
+               } catch (Exception e) {
+                       throw new RuntimeException("Unable to create instance from " + builderClass, e);
+               }
+       }
+
+       @Test
+       public void testRoutedRpcNetworkTopologyPcepProgrammingService() throws Exception {
+               final NetworkTopologyPcepProgrammingService pcepService1 = mock(NetworkTopologyPcepProgrammingService.class, "First pcep program Service");
+               final NetworkTopologyPcepProgrammingService pcepService2 = mock(NetworkTopologyPcepProgrammingService.class, "Second pcep program Service");
+
+               assertNotNull(getBroker());
+
+               final InstanceIdentifier<Topology> topology =
+                               InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(getTopologyId("Topo1"))).toInstance();
+
+               BindingAwareProvider provider1 = new AbstractTestProvider() {
+
+                       @Override
+                       public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) {
+                               assertNotNull(session);
+                               BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepProgrammingService> firstReg = session.addRoutedRpcImplementation(NetworkTopologyPcepProgrammingService.class, pcepService1);
+                               assertNotNull("Registration should not be null", firstReg);
+                               assertSame(pcepService1, firstReg.getInstance());
+
+                               firstReg.registerPath(NetworkTopologyContext.class, topology);
+                       }
+               };
+
+               broker.registerProvider(provider1, getBundleContext());
+
+               final InstanceIdentifier<Topology> topology2 =
+                               InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(getTopologyId("Topo2"))).toInstance();
+
+               BindingAwareProvider provider2 = new AbstractTestProvider() {
+
+                       @Override
+                       public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) {
+                               assertNotNull(session);
+                               BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepProgrammingService> secondReg = session.addRoutedRpcImplementation(NetworkTopologyPcepProgrammingService.class, pcepService2);
+                               secondReg.registerPath(NetworkTopologyContext.class, topology2);
+                       }
+               };
+
+               broker.registerProvider(provider2, getBundleContext());
+
+               BindingAwareConsumer consumer = new BindingAwareConsumer() {
+                       @Override
+                       public void onSessionInitialized(final BindingAwareBroker.ConsumerContext session) {
+                               NetworkTopologyPcepProgrammingService consumerPcepService = session.getRpcService(NetworkTopologyPcepProgrammingService.class);
+
+                               assertNotNull(consumerPcepService);
+                               assertNotSame(pcepService1, consumerPcepService);
+                               assertNotSame(pcepService2, consumerPcepService);
+
+                               testSubmitAddLspRpc(consumerPcepService);
+                               testSubmitUpdateLspRpc(consumerPcepService);
+                       }
+
+                       private void testSubmitAddLspRpc(NetworkTopologyPcepProgrammingService consumerPcepService) {
+                               SubmitAddLspInput addLspInput = getInputForRpc(topology, SubmitAddLspInputBuilder.class, SubmitAddLspInput.class);
+                               consumerPcepService.submitAddLsp(addLspInput);
+
+                               verify(pcepService1).submitAddLsp(addLspInput);
+                               verifyZeroInteractions(pcepService2);
+
+                               addLspInput = getInputForRpc(topology2, SubmitAddLspInputBuilder.class, SubmitAddLspInput.class);
+
+                               consumerPcepService.submitAddLsp(addLspInput);
+
+                               verifyZeroInteractions(pcepService1);
+                               verify(pcepService2).submitAddLsp(addLspInput);
+                       }
+
+                       private void testSubmitUpdateLspRpc(NetworkTopologyPcepProgrammingService consumerPcepService) {
+                               SubmitUpdateLspInput submitLspInput = getInputForRpc(topology, SubmitUpdateLspInputBuilder.class, SubmitUpdateLspInput.class);
+                               consumerPcepService.submitUpdateLsp(submitLspInput);
+
+                               verify(pcepService1).submitUpdateLsp(submitLspInput);
+                               verifyZeroInteractions(pcepService2);
+
+                               submitLspInput = getInputForRpc(topology2, SubmitUpdateLspInputBuilder.class, SubmitUpdateLspInput.class);
+
+                               consumerPcepService.submitUpdateLsp(submitLspInput);
+
+                               verifyZeroInteractions(pcepService1);
+                               verify(pcepService2).submitUpdateLsp(submitLspInput);
+                       }
+               };
+               broker.registerConsumer(consumer, getBundleContext());
+       }
+
+       @Test
+       public void testRoutedRpcTopologyTunnelPcepProgrammingService() throws Exception {
+               final TopologyTunnelPcepProgrammingService pcepService1 = mock(TopologyTunnelPcepProgrammingService.class, "First pcep program Service");
+               final TopologyTunnelPcepProgrammingService pcepService2 = mock(TopologyTunnelPcepProgrammingService.class, "Second pcep program Service");
+
+               assertNotNull(getBroker());
+
+               final InstanceIdentifier<Topology> topology =
+                               InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(getTopologyId("Topo1"))).toInstance();
+
+               BindingAwareProvider provider1 = new AbstractTestProvider() {
+
+                       @Override
+                       public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) {
+                               assertNotNull(session);
+                               BindingAwareBroker.RoutedRpcRegistration<TopologyTunnelPcepProgrammingService> firstReg = session.addRoutedRpcImplementation(TopologyTunnelPcepProgrammingService.class, pcepService1);
+                               assertNotNull("Registration should not be null", firstReg);
+                               assertSame(pcepService1, firstReg.getInstance());
+
+                               firstReg.registerPath(NetworkTopologyContext.class, topology);
+                       }
+               };
+
+               broker.registerProvider(provider1, getBundleContext());
+
+               final InstanceIdentifier<Topology> topology2 =
+                               InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(getTopologyId("Topo2"))).toInstance();
+
+               BindingAwareProvider provider2 = new AbstractTestProvider() {
+
+                       @Override
+                       public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) {
+                               assertNotNull(session);
+                               BindingAwareBroker.RoutedRpcRegistration<TopologyTunnelPcepProgrammingService> secondReg = session.addRoutedRpcImplementation(TopologyTunnelPcepProgrammingService.class, pcepService2);
+                               secondReg.registerPath(NetworkTopologyContext.class, topology2);
+                       }
+               };
+
+               broker.registerProvider(provider2, getBundleContext());
+
+               BindingAwareConsumer consumer = new BindingAwareConsumer() {
+                       @Override
+                       public void onSessionInitialized(final BindingAwareBroker.ConsumerContext session) {
+                               TopologyTunnelPcepProgrammingService consumerPcepService = session.getRpcService(TopologyTunnelPcepProgrammingService.class);
+
+                               assertNotNull(consumerPcepService);
+                               assertNotSame(pcepService1, consumerPcepService);
+                               assertNotSame(pcepService2, consumerPcepService);
+
+                               testCreateP2pTunnel(consumerPcepService);
+                               testDestroyP2pTunnel(consumerPcepService);
+                       }
+
+                       private void testCreateP2pTunnel(TopologyTunnelPcepProgrammingService consumerPcepService) {
+                               PcepCreateP2pTunnelInput addLspInput = getInputForRpc(topology, PcepCreateP2pTunnelInputBuilder.class, PcepCreateP2pTunnelInput.class);
+                               consumerPcepService.pcepCreateP2pTunnel(addLspInput);
+
+                               verify(pcepService1).pcepCreateP2pTunnel(addLspInput);
+                               verifyZeroInteractions(pcepService2);
+
+                               addLspInput =getInputForRpc(topology2, PcepCreateP2pTunnelInputBuilder.class, PcepCreateP2pTunnelInput.class);
+
+                               consumerPcepService.pcepCreateP2pTunnel(addLspInput);
+
+                               verifyZeroInteractions(pcepService1);
+                               verify(pcepService2).pcepCreateP2pTunnel(addLspInput);
+                       }
+
+                       private void testDestroyP2pTunnel(TopologyTunnelPcepProgrammingService consumerPcepService) {
+                               PcepDestroyTunnelInput addLspInput = getInputForRpc(topology, PcepDestroyTunnelInputBuilder.class, PcepDestroyTunnelInput.class);
+                               consumerPcepService.pcepDestroyTunnel(addLspInput);
+
+                               verify(pcepService1).pcepDestroyTunnel(addLspInput);
+                               verifyZeroInteractions(pcepService2);
+
+                               addLspInput = getInputForRpc(topology2, PcepDestroyTunnelInputBuilder.class, PcepDestroyTunnelInput.class);
+
+                               consumerPcepService.pcepDestroyTunnel(addLspInput);
+
+                               verifyZeroInteractions(pcepService1);
+                               verify(pcepService2).pcepDestroyTunnel(addLspInput);
+                       }
+               };
+               broker.registerConsumer(consumer, getBundleContext());
+       }
+
+}
diff --git a/integration-tests/src/test/resources/config/controller.xml b/integration-tests/src/test/resources/config/controller.xml
new file mode 100644 (file)
index 0000000..a1ba487
--- /dev/null
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persisted-snapshots>
+    <snapshots>
+        <snapshot>
+            <required-capabilities>
+                <capability>urn:opendaylight:l2:types?module=opendaylight-l2-types&amp;revision=2013-08-27</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&amp;revision=2013-10-28</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&amp;revision=2013-10-28</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:controller:config?module=config&amp;revision=2013-04-05</capability>
+                <capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>
+                <capability>urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&amp;revision=2010-10-04</capability>
+                <capability>urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&amp;revision=2013-06-17</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&amp;revision=2013-10-28</capability>
+                <capability>urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&amp;revision=2010-09-24</capability>
+                <capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability>
+                <capability>urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&amp;revision=2010-09-24</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&amp;revision=2013-10-28</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&amp;revision=2013-07-16</capability>
+                <capability>urn:opendaylight:yang:extension:yang-ext?module=yang-ext&amp;revision=2013-07-09</capability>
+                <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&amp;revision=2013-10-28</capability>
+            </required-capabilities>
+            <configuration>
+
+                <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+                    <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+                        <module>
+                            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+                                prefix:schema-service-singleton
+                            </type>
+                            <name>yang-schema-service</name>
+                        </module>
+                        <module>
+                            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+                                prefix:hash-map-data-store
+                            </type>
+                            <name>hash-map-data-store</name>
+                        </module>
+                        <module>
+                            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+                                prefix:dom-broker-impl
+                            </type>
+                            <name>dom-broker</name>
+                            <data-store xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+                                <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+                                    dom:dom-data-store
+                                </type>
+                                <name>ref_hash-map-data-store</name>
+                            </data-store>
+                        </module>
+                        <module>
+                            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                prefix:binding-broker-impl
+                            </type>
+                            <name>binding-broker-impl</name>
+                            <notification-service
+                                    xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+                                    binding:binding-notification-service
+                                </type>
+                                <name>ref_binding-notification-broker</name>
+                            </notification-service>
+                            <data-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+                                    binding:binding-data-broker
+                                </type>
+                                <name>ref_binding-data-broker</name>
+                            </data-broker>
+                        </module>
+                        <module>
+                            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                prefix:runtime-generated-mapping
+                            </type>
+                            <name>runtime-mapping-singleton</name>
+                        </module>
+                        <module>
+                            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                prefix:binding-notification-broker
+                            </type>
+                            <name>binding-notification-broker</name>
+                        </module>
+                        <module>
+                            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                prefix:binding-data-broker
+                            </type>
+                            <name>binding-data-broker</name>
+                            <dom-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+                                    dom:dom-broker-osgi-registry
+                                </type>
+                                <name>ref_dom-broker</name>
+                            </dom-broker>
+                            <mapping-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                    binding:binding-dom-mapping-service
+                                </type>
+                                <name>ref_runtime-mapping-singleton</name>
+                            </mapping-service>
+                        </module>
+                    </modules>
+
+                    <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+                        <service>
+                            <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+                                dom:schema-service
+                            </type>
+                            <instance>
+                                <name>ref_yang-schema-service</name>
+                                <provider>
+                                    /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service']
+                                </provider>
+                            </instance>
+                        </service>
+                        <service>
+                            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+                                binding:binding-notification-service
+                            </type>
+                            <instance>
+                                <name>ref_binding-notification-broker</name>
+                                <provider>
+                                    /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker']
+                                </provider>
+                            </instance>
+                        </service>
+                        <service>
+                            <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+                                dom:dom-data-store
+                            </type>
+                            <instance>
+                                <name>ref_hash-map-data-store</name>
+                                <provider>
+                                    /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store']
+                                </provider>
+                            </instance>
+                        </service>
+                        <service>
+                            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+                                binding:binding-broker-osgi-registry
+                            </type>
+                            <instance>
+                                <name>ref_binding-broker-impl</name>
+                                <provider>
+                                    /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl']
+                                </provider>
+                            </instance>
+                        </service>
+                        <service>
+                            <type xmlns:binding-impl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+                                binding-impl:binding-dom-mapping-service
+                            </type>
+                            <instance>
+                                <name>ref_runtime-mapping-singleton</name>
+                                <provider>
+                                    /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton']
+                                </provider>
+                            </instance>
+                        </service>
+                        <service>
+                            <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+                                dom:dom-broker-osgi-registry
+                            </type>
+                            <instance>
+                                <name>ref_dom-broker</name>
+                                <provider>/config/modules/module[name='dom-broker-impl']/instance[name='dom-broker']
+                                </provider>
+                            </instance>
+                        </service>
+                        <service>
+                            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+                                binding:binding-data-broker
+                            </type>
+                            <instance>
+                                <name>ref_binding-data-broker</name>
+                                <provider>
+                                    /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker']
+                                </provider>
+                            </instance>
+                        </service>
+                    </services>
+                </data>
+
+            </configuration>
+        </snapshot>
+
+    </snapshots>
+</persisted-snapshots>
index 49e83199c316015967be18c068fbb6a533ad0a47..cf36ebed035ca78919cacd112beed6199c7deb70 100644 (file)
                 <configuration>
                     <instructions>
                         <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
+                        <Import-Package>
+                            *,
+                            org.opendaylight.yangtools.yang.binding.annotations,
+                        </Import-Package>
                     </instructions>
                 </configuration>
             </plugin>
index 9a8130983cf02f1e0505c8b62fa199371df5b959..5c0bfd1c08d58c57e2bebd0dc902f8e8449efdcc 100644 (file)
@@ -6,6 +6,7 @@ module network-topology-pcep {
 
     import ietf-inet-types { prefix inet; revision-date 2010-09-24; }
     import network-topology { prefix nt; revision-date 2013-10-21; }
+    import odl-network-topology { prefix ont; revision-date 2014-01-13; }
     import pcep-types { prefix pcep; revision-date 2013-10-05; }
     import pcep-ietf-stateful { prefix stateful; revision-date 2013-12-22; }
 
@@ -165,6 +166,7 @@ module network-topology-pcep {
 
     rpc add-lsp {
         input {
+            uses ont:network-topology-reference;
             uses add-lsp-args;
         }
         output {
@@ -178,6 +180,7 @@ module network-topology-pcep {
 
     rpc remove-lsp {
         input {
+            uses ont:network-topology-reference;
             uses remove-lsp-args;
         }
         output {
@@ -202,6 +205,7 @@ module network-topology-pcep {
 
     rpc update-lsp {
         input {
+            uses ont:network-topology-reference;
             uses update-lsp-args;
         }
         output {
@@ -226,6 +230,7 @@ module network-topology-pcep {
             operational status.";
 
         input {
+            uses ont:network-topology-reference;
             uses ensure-lsp-operational-args;
         }
         output {
index 0f0ade3b400241498ae77b1b4e008161a10ebf4e..965319d962e18f5fecd704127a99898865cf3687 100644 (file)
@@ -16,10 +16,11 @@ import java.util.concurrent.ExecutionException;
 
 import org.opendaylight.bgpcep.programming.spi.InstructionScheduler;
 import org.opendaylight.bgpcep.topology.DefaultTopologyReference;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
 import org.opendaylight.protocol.pcep.PCEPDispatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.topology.rev140113.NetworkTopologyContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.NetworkTopologyPcepProgrammingService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.NetworkTopologyPcepService;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
@@ -30,14 +31,17 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Preconditions;
 
 public final class PCEPTopologyProvider extends DefaultTopologyReference implements AutoCloseable {
+
        private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologyProvider.class);
-       private final RpcRegistration<NetworkTopologyPcepProgrammingService> network;
-       private final RpcRegistration<NetworkTopologyPcepService> element;
+       private final BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepProgrammingService> network;
+       private final BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepService> element;
        private final ServerSessionManager manager;
        private final Channel channel;
 
-       private PCEPTopologyProvider(final Channel channel, final InstanceIdentifier<Topology> topology, final ServerSessionManager manager,
-                       final RpcRegistration<NetworkTopologyPcepService> element, final RpcRegistration<NetworkTopologyPcepProgrammingService> network) {
+       private PCEPTopologyProvider(final Channel channel, final InstanceIdentifier<Topology> topology,
+                       final ServerSessionManager manager,
+                       final BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepService> element,
+                       final BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepProgrammingService> network) {
                super(topology);
                this.channel = Preconditions.checkNotNull(channel);
                this.manager = Preconditions.checkNotNull(manager);
@@ -54,8 +58,13 @@ public final class PCEPTopologyProvider extends DefaultTopologyReference impleme
                final ChannelFuture f = dispatcher.createServer(address, manager);
                f.get();
 
-               final RpcRegistration<NetworkTopologyPcepService> element = rpcRegistry.addRpcImplementation(NetworkTopologyPcepService.class, new TopologyRPCs(manager));
-               final RpcRegistration<NetworkTopologyPcepProgrammingService> network = rpcRegistry.addRpcImplementation(NetworkTopologyPcepProgrammingService.class, new TopologyProgramming(scheduler, manager));
+               final BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepService> element = rpcRegistry.addRoutedRpcImplementation(
+                               NetworkTopologyPcepService.class, new TopologyRPCs(manager));
+               element.registerPath(NetworkTopologyContext.class, topology);
+
+               final BindingAwareBroker.RoutedRpcRegistration<NetworkTopologyPcepProgrammingService> network = rpcRegistry.addRoutedRpcImplementation(
+                               NetworkTopologyPcepProgrammingService.class, new TopologyProgramming(scheduler, manager));
+               network.registerPath(NetworkTopologyContext.class, topology);
 
                return new PCEPTopologyProvider(f.channel(), topology, manager, element, network);
        }
index 9bfa64ee097f57be09e4c961711e93265fc2ff76..491a29ef6372bd8a0d75e67b497b7a4489678c8f 100644 (file)
@@ -106,7 +106,9 @@ final class TopologyProgramming implements NetworkTopologyPcepProgrammingService
                b.setResult(AbstractInstructionExecutor.schedule(scheduler, new AbstractInstructionExecutor(input) {
                        @Override
                        protected ListenableFuture<OperationResult> invokeOperation() {
-                               return TopologyProgramming.this.manager.realEnsureLspOperational(new EnsureLspOperationalInputBuilder(input).build());
+                               EnsureLspOperationalInputBuilder ensureLspOperationalInputBuilder = new EnsureLspOperationalInputBuilder();
+                               ensureLspOperationalInputBuilder.fieldsFrom(input);
+                               return TopologyProgramming.this.manager.realEnsureLspOperational(ensureLspOperationalInputBuilder.build());
                        }
                }));
 
index 92101d0912a7b11908dafb83313cb5c34be85f02..e87b389cf87beecb824fd23ffc33469462f8cb2a 100644 (file)
                 <configuration>
                     <instructions>
                         <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
+                        <Import-Package>
+                            *,
+                            org.opendaylight.yangtools.yang.binding.annotations,
+                            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.programming.rev131102,
+                        </Import-Package>
                     </instructions>
                 </configuration>
             </plugin>
index d2bd3c3473b01e234eb775b4118b747f499fa867..0650cbc5cf70b53bd4eb7a289cc92d3e1c857de1 100644 (file)
@@ -4,7 +4,7 @@ module topology-tunnel-pcep-programming {
         prefix "ttpp";
 
        import pcep-types { prefix pcep; revision-date 2013-10-05; }
-        import topology-tunnel-programming { prefix ttp; revision-date 2013-09-30; }
+       import topology-tunnel-programming { prefix ttp; revision-date 2013-09-30; }
        import topology-tunnel-p2p { prefix p2p; revision-date 2013-08-19; }
        import topology-tunnel-pcep { prefix ptp; revision-date 2013-08-20; }
 
index 3da54abbaa06d8cb5cb6022c718ba6883374c5f4..c41d93b21f69896f5171cd6bf803cad6b8a0d9a7 100644 (file)
@@ -20,10 +20,13 @@ import org.opendaylight.bgpcep.pcep.tunnel.provider.PCEPTunnelTopologyProvider;
 import org.opendaylight.bgpcep.pcep.tunnel.provider.TunnelProgramming;
 import org.opendaylight.bgpcep.topology.DefaultTopologyReference;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.topology.rev140113.NetworkTopologyContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.NetworkTopologyPcepService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.programming.rev131030.TopologyTunnelPcepProgrammingService;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 /**
@@ -52,8 +55,12 @@ public final class PCEPTunnelTopologyProviderModule extends org.opendaylight.con
                final PCEPTunnelTopologyProvider ttp = PCEPTunnelTopologyProvider.create(getDataProviderDependency(), getSourceTopologyDependency().getInstanceIdentifier(), getTopologyId());
                final NetworkTopologyPcepService ntps = getRpcRegistryDependency().getRpcService(NetworkTopologyPcepService.class);
                final TunnelProgramming tp = new TunnelProgramming(getSchedulerDependency(), getDataProviderDependency(), ntps);
-               final RpcRegistration<TopologyTunnelPcepProgrammingService> reg =
-                               getRpcRegistryDependency().addRpcImplementation(TopologyTunnelPcepProgrammingService.class, tp);
+
+               final BindingAwareBroker.RoutedRpcRegistration<TopologyTunnelPcepProgrammingService> reg =
+                               getRpcRegistryDependency().addRoutedRpcImplementation(TopologyTunnelPcepProgrammingService.class, tp);
+               final InstanceIdentifier<Topology> topology =
+                               InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(getTopologyId())).toInstance();
+               reg.registerPath(NetworkTopologyContext.class, topology);
 
                final class TunnelTopologyReferenceCloseable extends DefaultTopologyReference implements AutoCloseable {
                        public TunnelTopologyReferenceCloseable(final InstanceIdentifier<Topology> instanceIdentifier) {
index 575e230cc7a6f83baf2a2dafd79a67ce3bdc4600..069c9db32ef0f0c75447d1c0d1e61cb57425abbb 100644 (file)
@@ -8,9 +8,7 @@
 package org.opendaylight.bgpcep.programming.topology;
 
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.programming.rev131102.TopologyInstructionInput;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 import com.google.common.base.Preconditions;
@@ -23,8 +21,9 @@ public final class TopologyProgrammingUtil {
 
        }
 
+       @SuppressWarnings("unchecked")
        public static InstanceIdentifier<Topology> topologyForInput(final TopologyInstructionInput input) {
-               Preconditions.checkNotNull(input.getTopologyId());
-               return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(input.getTopologyId())).toInstance();
+               Preconditions.checkNotNull(input.getNetworkTopologyRef());
+               return (InstanceIdentifier<Topology>) input.getNetworkTopologyRef().getValue();
        }
 }
index 83305476801e6b455e7209ca4255730cd8f39009..f29a5749b0461bfd577d71694e643c089b5ae6fe 100644 (file)
@@ -4,6 +4,7 @@ module network-topology-programming {
        prefix "tp";
 
        import network-topology { prefix nt; revision-date 2013-10-21; }
+       import odl-network-topology { prefix ont; revision-date 2014-01-13; }
        import programming { prefix pgm; revision-date 2013-09-30; }
 
        organization "Cisco Systems, Inc.";
@@ -28,11 +29,7 @@ module network-topology-programming {
 
        grouping topology-instruction-input {
                uses pgm:submit-instruction-input;
-
-               leaf topology-id {
-                       type nt:topology-id;
-                       mandatory true;
-               }
+               uses ont:network-topology-reference;
        }
 
        grouping topology-instruction-output {
index 45a23c945e13ef9b5cc11b8975cd4609fe52954e..192eb19d0322b219d7974cf3f3c0789456d987ee 100644 (file)
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools.model</groupId>
+            <artifactId>yang-ext</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.yangtools.model</groupId>
             <artifactId>ietf-inet-types</artifactId>
 
     <build>
         <plugins>
+            <plugin>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yang-maven-plugin</artifactId>
+            </plugin>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
diff --git a/topology/api/src/main/yang/odl-network-topology.yang b/topology/api/src/main/yang/odl-network-topology.yang
new file mode 100644 (file)
index 0000000..93e25b1
--- /dev/null
@@ -0,0 +1,48 @@
+module odl-network-topology {
+       yang-version 1;
+       namespace "urn:opendaylight:params:xml:ns:yang:network:topology";
+       prefix "ont";
+
+       import ietf-inet-types { prefix inet; revision-date 2010-09-24; }
+       import network-topology { prefix nt; revision-date 2013-10-21; }
+       import yang-ext {prefix ext; revision-date "2013-07-09"; }
+
+       organization "Cisco Systems, Inc.";
+       contact "Robert Varga <rovarga@cisco.com>";
+
+       description
+               "Augments IETF network topology model to define routing RPC
+               extensions.";
+
+       revision "2014-01-13" {
+               description
+                       "Initial revision.";
+               reference "";
+       }
+
+       identity network-topology-context {
+               description
+                       "Identity used to mark the network topology context.
+                       This is useful for example binding RPCs to a particular
+                       network topology instance.";
+       }
+
+       typedef network-topology-ref {
+               type instance-identifier;
+               ext:context-reference "network-topology-context";
+       }
+
+       grouping network-topology-reference {
+               leaf network-topology-ref {
+                       type network-topology-ref;
+                       mandatory true;
+                       // Workaround for yangtools
+                       ext:context-reference "network-topology-context";
+               }
+       }
+
+       augment "/nt:network-topology/nt:topology" {
+               ext:context-instance "network-topology-context";
+       }
+}
+