*/
package org.opendaylight.md.controller.topology.manager;
+import java.util.concurrent.ExecutionException;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
-import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
-import org.opendaylight.yangtools.concepts.Registration;
+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.TopologyId;
+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.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.NotificationListener;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
public class FlowCapableTopologyProvider extends AbstractBindingAwareProvider implements AutoCloseable {
private final static Logger LOG = LoggerFactory.getLogger(FlowCapableTopologyProvider.class);
+ private ListenerRegistration<NotificationListener> listenerRegistration;
+ private Thread thread;
- private DataProviderService dataService;
-
- public DataProviderService getDataService() {
- return this.dataService;
- }
+ /**
+ * Gets called on start of a bundle.
+ *
+ * @param session
+ */
+ @Override
+ public synchronized void onSessionInitiated(final ProviderContext session) {
+ final DataBroker dataBroker = session.getSALService(DataBroker.class);
+ final NotificationProviderService notificationService = session.getSALService(NotificationProviderService.class);
- public void setDataService(final DataProviderService dataService) {
- this.dataService = dataService;
- }
+ final String name = "flow:1";
+ final TopologyKey key = new TopologyKey(new TopologyId(name));
+ final InstanceIdentifier<Topology> path = InstanceIdentifier
+ .create(NetworkTopology.class)
+ .child(Topology.class, key);
- private NotificationProviderService notificationService;
+ final OperationProcessor processor = new OperationProcessor(dataBroker);
+ final FlowCapableTopologyExporter listener = new FlowCapableTopologyExporter(processor, path);
+ this.listenerRegistration = notificationService.registerNotificationListener(listener);
- public NotificationProviderService getNotificationService() {
- return this.notificationService;
- }
+ final ReadWriteTransaction tx = dataBroker.newReadWriteTransaction();
+ tx.put(LogicalDatastoreType.OPERATIONAL, path, new TopologyBuilder().setKey(key).build(), true);
+ try {
+ tx.submit().get();
+ } catch (InterruptedException | ExecutionException e) {
+ LOG.warn("Initial topology export failed, continuing anyway", e);
+ }
- public void setNotificationService(final NotificationProviderService notificationService) {
- this.notificationService = notificationService;
+ thread = new Thread(processor);
+ thread.setDaemon(true);
+ thread.setName("FlowCapableTopologyExporter-" + name);
+ thread.start();
}
- private final FlowCapableTopologyExporter exporter = new FlowCapableTopologyExporter();
- private Registration<NotificationListener> listenerRegistration;
-
@Override
- public void close() {
-
- FlowCapableTopologyProvider.LOG.info("FlowCapableTopologyProvider stopped.");
- dataService = null;
- notificationService = null;
+ public synchronized void close() throws InterruptedException {
+ LOG.info("FlowCapableTopologyProvider stopped.");
if (this.listenerRegistration != null) {
try {
this.listenerRegistration.close();
} catch (Exception e) {
- throw new IllegalStateException("Exception during close of listener registration.",e);
+ LOG.error("Failed to close listener registration", e);
}
+ listenerRegistration = null;
+ }
+ if (thread != null) {
+ thread.interrupt();
+ thread.join();
+ thread = null;
}
- }
-
- /**
- * Gets called on start of a bundle.
- *
- * @param session
- */
- @Override
- public void onSessionInitiated(final ProviderContext session) {
- dataService = session.getSALService(DataProviderService.class);
- notificationService = session.getSALService(NotificationProviderService.class);
- this.exporter.setDataService(dataService);
- this.exporter.start();
- this.listenerRegistration = notificationService.registerNotificationListener(this.exporter);
- ;
}
/**
* Gets called during stop bundle
*
- * @param context
- * The execution context of the bundle being stopped.
+ * @param context The execution context of the bundle being stopped.
*/
@Override
public void stopImpl(final BundleContext context) {
- this.close();
+ try {
+ this.close();
+ } catch (InterruptedException e) {
+ LOG.error("Failed to stop provider", e);
+ }
}
}