/** * Copyright (c) 2014 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.controller.frm.reconil; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; /** * forwardingrules-manager * org.opendaylight.controller.frm * * FlowNode Reconciliation Provider registers the FlowNodeReconilListener * and it holds all needed services for FlowNodeReconcilListener. * * @author Vaclav Demcak * * Created: Jun 13, 2014 */ public class FlowNodeReconcilProvider implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(FlowNodeReconcilProvider.class); private SalFlowService salFlowService; private SalMeterService salMeterService; private SalGroupService salGroupService; private DataBroker dataService; /* DataChangeListener */ private DataChangeListener flowNodeReconcilListener; private ListenerRegistration flowNodeReconcilListenerRegistration; public void init (final DataBroker dataService) { LOG.info("FRM Flow Node Config Reconcil Provider initialization."); this.dataService = Preconditions.checkNotNull(dataService, "DataProviderService can not be null !"); } public void start( final RpcConsumerRegistry rpcRegistry ) { Preconditions.checkArgument(rpcRegistry != null, "RpcConcumerRegistry can not be null !"); this.salFlowService = Preconditions.checkNotNull(rpcRegistry.getRpcService(SalFlowService.class), "RPC SalFlowService not found."); this.salMeterService = Preconditions.checkNotNull(rpcRegistry.getRpcService(SalMeterService.class), "RPC SalMeterService not found."); this.salGroupService = Preconditions.checkNotNull(rpcRegistry.getRpcService(SalGroupService.class), "RPC SalGroupService not found."); /* Build Path */ InstanceIdentifier flowCapableNodeIdent = InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class); /* ReconcilNotificationListener registration */ this.flowNodeReconcilListener = new FlowNodeReconcilListener(FlowNodeReconcilProvider.this); this.flowNodeReconcilListenerRegistration = this.dataService.registerDataChangeListener( LogicalDatastoreType.OPERATIONAL, flowCapableNodeIdent, flowNodeReconcilListener, DataChangeScope.BASE); LOG.info("FRM Flow Node Config Reconcil Provider started."); } @Override public void close() { LOG.info("FRM Flow Node Config Reconcil Provider stopped."); if (flowNodeReconcilListenerRegistration != null) { try { flowNodeReconcilListenerRegistration.close(); } catch (Exception e) { String errMsg = "Error by stop FRM Flow Node Config Reconcil Provider."; LOG.error(errMsg, e); throw new IllegalStateException(errMsg, e); } finally { flowNodeReconcilListenerRegistration = null; } } } public DataChangeListener getFlowNodeReconcilListener() { return flowNodeReconcilListener; } public DataBroker getDataService() { return dataService; } public SalFlowService getSalFlowService() { return salFlowService; } public SalMeterService getSalMeterService() { return salMeterService; } public SalGroupService getSalGroupService() { return salGroupService; } }