/* * 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.md.controller.topology.manager; import java.util.concurrent.ExecutionException; 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.DataModificationTransaction; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; 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.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.NotificationListener; import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FlowCapableTopologyProvider extends AbstractBindingAwareProvider implements AutoCloseable { private final static Logger LOG = LoggerFactory.getLogger(FlowCapableTopologyProvider.class); private Registration listenerRegistration; private Thread thread; /** * Gets called on start of a bundle. * * @param session */ @Override public synchronized void onSessionInitiated(final ProviderContext session) { final DataProviderService dataService = session.getSALService(DataProviderService.class); final NotificationProviderService notificationService = session.getSALService(NotificationProviderService.class); final String name = "flow:1"; final TopologyKey key = new TopologyKey(new TopologyId(name)); final InstanceIdentifier path = InstanceIdentifier .builder(NetworkTopology.class) .child(Topology.class, key) .build(); final OperationProcessor processor = new OperationProcessor(dataService); final FlowCapableTopologyExporter listener = new FlowCapableTopologyExporter(processor, path); this.listenerRegistration = notificationService.registerNotificationListener(listener); final DataModificationTransaction tx = dataService.beginTransaction(); tx.putOperationalData(path, new TopologyBuilder().setKey(key).build()); try { tx.commit().get(); } catch (InterruptedException | ExecutionException e) { LOG.warn("Initial topology export failed, continuing anyway", e); } thread = new Thread(processor); thread.setDaemon(true); thread.setName("FlowCapableTopologyExporter-" + name); thread.start(); } @Override public synchronized void close() throws InterruptedException { LOG.info("FlowCapableTopologyProvider stopped."); if (this.listenerRegistration != null) { try { this.listenerRegistration.close(); } catch (Exception e) { LOG.error("Failed to close listener registration", e); } listenerRegistration = null; } if (thread != null) { thread.interrupt(); thread.join(); thread = null; } } /** * Gets called during stop bundle * * @param context * The execution context of the bundle being stopped. */ @Override public void stopImpl(final BundleContext context) { try { this.close(); } catch (InterruptedException e) { LOG.error("Failed to stop provider", e); } } }