*/
package org.opendaylight.l2switch.loopremover;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareConsumer;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
-import org.opendaylight.controller.sal.binding.api.NotificationService;
import org.opendaylight.l2switch.loopremover.flow.InitialFlowWriter;
import org.opendaylight.l2switch.loopremover.topology.NetworkGraphImpl;
import org.opendaylight.l2switch.loopremover.topology.NetworkGraphService;
import org.opendaylight.l2switch.loopremover.topology.TopologyLinkDataChangeHandler;
+import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.loop.remover.config.rev140528.LoopRemoverConfig;
import org.opendaylight.yangtools.concepts.Registration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-/**
- */
-public class LoopRemoverProvider extends AbstractBindingAwareConsumer
- implements AutoCloseable {
+public class LoopRemoverProvider {
+ private static final Logger LOG = LoggerFactory.getLogger(LoopRemoverProvider.class);
- private final static Logger _logger = LoggerFactory.getLogger(LoopRemoverProvider.class);
- private Registration listenerRegistration = null, invListenerReg = null;
- private TopologyLinkDataChangeHandler topologyLinkDataChangeHandler;
+ private final DataBroker dataService;
+ private final SalFlowService salFlowService;
+ private final LoopRemoverConfig loopRemoverConfig;
- /**
- * Setup the loop remover.
- *
- * @param consumerContext The context of the L2Switch.
- */
- @Override
- public void onSessionInitialized(BindingAwareBroker.ConsumerContext consumerContext) {
- // Setup FlowWriterService
- DataBroker dataService = consumerContext.<DataBroker>getSALService(DataBroker.class);
- NetworkGraphService networkGraphService = new NetworkGraphImpl();
- SalFlowService salFlowService = consumerContext.getRpcService(SalFlowService.class);
- NotificationService notificationService = consumerContext.<NotificationService>getSALService(NotificationService.class);
+ private Registration listenerRegistration;
+ private Registration topoNodeListnerReg;
+ private TopologyLinkDataChangeHandler topologyLinkDataChangeHandler;
- //Write initial flows
- InitialFlowWriter initialFlowWriter = new InitialFlowWriter(salFlowService);
- invListenerReg = notificationService.registerNotificationListener(initialFlowWriter);
+ public LoopRemoverProvider(final DataBroker dataBroker, final SalFlowService salFlowService,
+ final LoopRemoverConfig config) {
+ this.dataService = dataBroker;
+ this.salFlowService = salFlowService;
+ this.loopRemoverConfig = config;
+ }
- // Register Topology DataChangeListener
- this.topologyLinkDataChangeHandler = new TopologyLinkDataChangeHandler(dataService, networkGraphService);
- listenerRegistration = topologyLinkDataChangeHandler.registerAsDataChangeListener();
+ public void init() {
+ //Write initial flows
+ if (loopRemoverConfig.getIsInstallLldpFlow()) {
+ LOG.info("LoopRemover will install an lldp flow");
+ InitialFlowWriter initialFlowWriter = new InitialFlowWriter(salFlowService);
+ initialFlowWriter.setFlowTableId(loopRemoverConfig.getLldpFlowTableId());
+ initialFlowWriter.setFlowPriority(loopRemoverConfig.getLldpFlowPriority());
+ initialFlowWriter.setFlowIdleTimeout(loopRemoverConfig.getLldpFlowIdleTimeout());
+ initialFlowWriter.setFlowHardTimeout(loopRemoverConfig.getLldpFlowHardTimeout());
+ topoNodeListnerReg = initialFlowWriter.registerAsDataChangeListener(dataService);
+ }
- }
+ // Register Topology DataChangeListener
+ NetworkGraphService networkGraphService = new NetworkGraphImpl();
+ this.topologyLinkDataChangeHandler = new TopologyLinkDataChangeHandler(dataService, networkGraphService);
+ topologyLinkDataChangeHandler.setGraphRefreshDelay(loopRemoverConfig.getGraphRefreshDelay().toJava());
+ topologyLinkDataChangeHandler.setTopologyId(loopRemoverConfig.getTopologyId());
+ listenerRegistration = topologyLinkDataChangeHandler.registerAsDataChangeListener();
- /**
- * Cleanup the loop remover
- */
- @Override
- public void close() throws Exception {
- if(listenerRegistration != null) {
- listenerRegistration.close();
+ LOG.info("LoopRemover initialized.");
}
- if(invListenerReg != null) {
- invListenerReg.close();
+
+ public void close() throws Exception {
+ if (listenerRegistration != null) {
+ listenerRegistration.close();
+ }
+ if (topoNodeListnerReg != null) {
+ topoNodeListnerReg.close();
+ }
+ LOG.info("LoopRemover (instance {}) torn down.", this);
}
- }
}