BUG-109: fix model and introduce provider 84/2184/2
authorRobert Varga <rovarga@cisco.com>
Fri, 25 Oct 2013 13:56:28 +0000 (15:56 +0200)
committerRobert Varga <rovarga@cisco.com>
Sat, 26 Oct 2013 15:15:25 +0000 (17:15 +0200)
Change-Id: I699a75d9ce4ef8a390eea6aedd22eae3390751a7
Signed-off-by: Robert Varga <rovarga@cisco.com>
topology/pom.xml
topology/tunnel-pcep-api/pom.xml
topology/tunnel-pcep-api/src/main/yang/topology-tunnel-pcep.yang
topology/tunnel-provider-pcep/.project [new file with mode: 0644]
topology/tunnel-provider-pcep/pom.xml [new file with mode: 0644]
topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/BundleActivator.java [new file with mode: 0644]
topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/NodeChangedListener.java [new file with mode: 0644]
topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/TunnelTopologyExporter.java [new file with mode: 0644]

index 8ec5799ff5e966706e28db2473ea8e18595b2843..5cf79ba43f5d4704b0f53c1218e0d0064803ea8c 100644 (file)
@@ -23,6 +23,7 @@
         <module>provider-pcep</module>
                <module>tunnel-api</module>
         <module>tunnel-pcep-api</module>
+        <module>tunnel-provider-pcep</module>
         <module>segment-routing</module>
     </modules>
 </project>
index 1962f35f1bf4eaa874a7ec85242eb57d0a98bdcc..1ea57a525329f39b08d88febba4d2308ef78c953 100644 (file)
@@ -86,7 +86,7 @@
                    <instructions>
                        <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
                        <Export-Package>
-                           org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.rev130820,
+                           org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.rev130820.*,
                        </Export-Package>
                    </instructions>
                </configuration>
index 1f14bdc8e8e3f99d9a172179001af91fea4512b4..e17563e6e78979dd3ce0848b67b4419f74ff22a9 100644 (file)
@@ -34,17 +34,6 @@ module topology-tunnel-pcep {
                reference "https://tools.ietf.org/html/draft-ietf-pce-stateful-pce-05#section-7.3";
        }
 
-       typedef operational-status {
-               type enumeration {
-                       enum down;
-                       enum up;
-                       enum active;
-                       enum going-down;
-                       enum going-up;
-               }
-               reference "https://tools.ietf.org/html/draft-ietf-pce-stateful-pce-05#section-7.3";
-       }
-
        grouping tunnel-pcep-type {
                container pcep-tunnel {
                        presence "indicates a link is a PCEP tunnel";
@@ -61,7 +50,7 @@ module topology-tunnel-pcep {
                }
 
                leaf operational-status {
-                       type operational-status;
+                       type pcep:operational-status;
                        config false;
                }
 
@@ -80,7 +69,7 @@ module topology-tunnel-pcep {
                }
 
                leaf operational-status {
-                       type operational-status;
+                       type pcep:operational-status;
                        config false;
                }
        }
diff --git a/topology/tunnel-provider-pcep/.project b/topology/tunnel-provider-pcep/.project
new file mode 100644 (file)
index 0000000..af7f519
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>topology-tunnel-provider-pcep</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+       </natures>
+</projectDescription>
diff --git a/topology/tunnel-provider-pcep/pom.xml b/topology/tunnel-provider-pcep/pom.xml
new file mode 100644 (file)
index 0000000..93b0696
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+       <parent>
+               <groupId>org.opendaylight.bgpcep</groupId>
+               <artifactId>topology-parent</artifactId>
+               <version>0.3.0-SNAPSHOT</version>
+       </parent>
+
+       <modelVersion>4.0.0</modelVersion>
+       <artifactId>topology-tunnel-provider-pcep</artifactId>
+       <description>PCEP Topology Provider</description>
+       <packaging>bundle</packaging>
+       <name>${project.artifactId}</name>
+       <prerequisites>
+               <maven>3.0.4</maven>
+       </prerequisites>
+
+       <dependencies>
+               <dependency>
+                       <groupId>${project.groupId}</groupId>
+                       <artifactId>topology-api</artifactId>
+            <version>${project.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>${project.groupId}</groupId>
+                       <artifactId>topology-pcep-api</artifactId>
+            <version>${project.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>${project.groupId}</groupId>
+                       <artifactId>topology-tunnel-api</artifactId>
+            <version>${project.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>${project.groupId}</groupId>
+                       <artifactId>topology-tunnel-pcep-api</artifactId>
+            <version>${project.version}</version>
+               </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-api</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>slf4j-api</artifactId>
+                       <version>${slf4j.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>${project.groupId}</groupId>
+                       <artifactId>mockito-configuration</artifactId>
+            <version>${project.version}</version>
+                       <scope>test</scope>
+        </dependency>
+       </dependencies>
+
+       <build>
+        <plugins>
+           <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>
+                       <Private-Package>
+                           org.opendaylight.bgpcep.topology.tunnel.provider.pcep
+                       </Private-Package>
+                       <Bundle-Activator>org.opendaylight.bgpcep.topology.tunnel.provider.pcep.BundleActivator</Bundle-Activator>
+                   </instructions>
+               </configuration>
+           </plugin>
+               </plugins>
+       </build>
+
+       <distributionManagement>
+               <site>
+                       <id>${project.artifactId}</id>
+                       <name>TOPOLOGY-PROVIDER-PCEP Module site</name>
+                       <url>${basedir}/target/site/${project.artifactId}</url>
+               </site>
+       </distributionManagement>
+
+</project>
diff --git a/topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/BundleActivator.java b/topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/BundleActivator.java
new file mode 100644 (file)
index 0000000..2a4a6fd
--- /dev/null
@@ -0,0 +1,22 @@
+package org.opendaylight.bgpcep.topology.tunnel.provider.pcep;
+
+import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
+import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+
+public final class BundleActivator extends AbstractBindingAwareProvider {
+       private static final Logger LOG = LoggerFactory.getLogger(BundleActivator.class);
+
+       @Override
+       public void onSessionInitiated(final ProviderContext session) {
+               final DataProviderService dps = Preconditions.checkNotNull(session.getSALService(DataProviderService.class));
+
+               // FIXME: migrate to config subsystem
+               final TunnelTopologyExporter tte = new TunnelTopologyExporter(dps, null);
+               tte.addTargetTopology(null);
+       }
+}
diff --git a/topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/NodeChangedListener.java b/topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/NodeChangedListener.java
new file mode 100644 (file)
index 0000000..3b2d409
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * 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.bgpcep.topology.tunnel.provider.pcep;
+
+import java.util.Map.Entry;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
+import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
+import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
+import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
+import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.pcc.Lsps;
+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.topology.Node;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+
+final class NodeChangedListener implements DataChangeListener {
+       private static final Logger LOG = LoggerFactory.getLogger(NodeChangedListener.class);
+       private final InstanceIdentifier<Topology> target;
+       private final DataProviderService dataProvider;
+
+       NodeChangedListener(final DataProviderService dataProvider, final InstanceIdentifier<Topology> target) {
+               this.dataProvider = Preconditions.checkNotNull(dataProvider);
+               this.target = Preconditions.checkNotNull(target);
+       }
+
+       private void remove(final DataModificationTransaction trans, final InstanceIdentifier<?> id) {
+               if (Node.class.equals(id.getTargetType())) {
+                       // FIXME: implement this
+               } else if (Lsps.class.equals(id.getTargetType())) {
+                       // FIXME: implement this
+               } else {
+                       LOG.debug("Ignoring changed instance {}", id);
+               }
+       }
+
+       private void create(final DataModificationTransaction trans, final InstanceIdentifier<?> id, final DataObject obj) {
+               // FIXME: implement this
+       }
+
+       @Override
+       public void onDataChanged(final DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
+               final DataModificationTransaction trans = dataProvider.beginTransaction();
+
+               for (final InstanceIdentifier<?> i : change.getRemovedOperationalData()) {
+                       remove(trans, i);
+               }
+
+               for (final Entry<InstanceIdentifier<?>, DataObject> e : change.getUpdatedOperationalData().entrySet()) {
+                       remove(trans, e.getKey());
+                       create(trans, e.getKey(), e.getValue());
+               }
+
+               for (final Entry<InstanceIdentifier<?>, DataObject> e : change.getCreatedOperationalData().entrySet()) {
+                       create(trans, e.getKey(), e.getValue());
+               }
+
+               final Future<RpcResult<TransactionStatus>> f = trans.commit();
+
+               // FIXME: change to a subscribtion once that is possible
+               try {
+                       f.get();
+               } catch (InterruptedException | ExecutionException e) {
+                       LOG.error("Failed to propagate a topology change, target topology became inconsistent", e);
+               }
+       }
+}
\ No newline at end of file
diff --git a/topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/TunnelTopologyExporter.java b/topology/tunnel-provider-pcep/src/main/java/org/opendaylight/bgpcep/topology/tunnel/provider/pcep/TunnelTopologyExporter.java
new file mode 100644 (file)
index 0000000..237d2a0
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * 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.bgpcep.topology.tunnel.provider.pcep;
+
+import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
+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.topology.Node;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import com.google.common.base.Preconditions;
+
+final class TunnelTopologyExporter {
+       private final DataProviderService dataProvider;
+       private final InstanceIdentifier<Node> srcTree;
+
+       TunnelTopologyExporter(final DataProviderService dataProvider, final InstanceIdentifier<Topology> sourceTopology) {
+               this.dataProvider = Preconditions.checkNotNull(dataProvider);
+               srcTree = Preconditions.checkNotNull(InstanceIdentifier.builder(sourceTopology).node(Node.class).toInstance());
+       }
+
+       ListenerRegistration<?> addTargetTopology(final InstanceIdentifier<Topology> tunnelTopology) {
+               return dataProvider.registerDataChangeListener(srcTree, new NodeChangedListener(dataProvider, tunnelTopology));
+       }
+}