<module>provider-pcep</module>
<module>tunnel-api</module>
<module>tunnel-pcep-api</module>
+ <module>tunnel-provider-pcep</module>
<module>segment-routing</module>
</modules>
</project>
<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>
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";
}
leaf operational-status {
- type operational-status;
+ type pcep:operational-status;
config false;
}
}
leaf operational-status {
- type operational-status;
+ type pcep:operational-status;
config false;
}
}
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+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);
+ }
+}
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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));
+ }
+}