/* * Copyright (c) 2015 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.openflowplugin.applications.topology.manager; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; 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.NodeId; 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.TopologyKey; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class DataTreeChangeListenerImpl implements DataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(DataTreeChangeListenerImpl.class); private static final long STARTUP_LOOP_TICK = 500L; private static final int STARTUP_LOOP_MAX_RETRIES = 8; protected final ListenerRegistration listenerRegistration; protected OperationProcessor operationProcessor; static final InstanceIdentifier II_TO_TOPOLOGY = InstanceIdentifier.create(NetworkTopology.class) .child(Topology.class, new TopologyKey(new TopologyId(FlowCapableTopologyProvider.TOPOLOGY_ID))); @SuppressWarnings("checkstyle:IllegalCatch") public DataTreeChangeListenerImpl(final OperationProcessor operationProcessor, final DataBroker dataBroker, final InstanceIdentifier ii) { final DataTreeIdentifier identifier = DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, ii); final SimpleTaskRetryLooper looper = new SimpleTaskRetryLooper(STARTUP_LOOP_TICK, STARTUP_LOOP_MAX_RETRIES); try { listenerRegistration = looper.loopUntilNoException( () -> dataBroker.registerDataTreeChangeListener(identifier, DataTreeChangeListenerImpl.this)); } catch (Exception e) { LOG.error("Data listener registration failed!"); throw new IllegalStateException("TopologyManager startup fail! TM bundle needs restart.", e); } this.operationProcessor = operationProcessor; } @Override public void close() { listenerRegistration.close(); } void sendToTransactionChain(final T node, final InstanceIdentifier iiToTopologyNode) { operationProcessor.enqueueOperation( manager -> manager.mergeToTransaction(LogicalDatastoreType.OPERATIONAL, iiToTopologyNode, node, true)); } InstanceIdentifier provideIIToTopologyNode( final NodeId nodeIdInTopology) { org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology .NodeKey nodeKeyInTopology = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network .topology.topology.NodeKey( nodeIdInTopology); return II_TO_TOPOLOGY.builder() .child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network .topology.topology.Node.class, nodeKeyInTopology).build(); } NodeId provideTopologyNodeId(final InstanceIdentifier iiToNodeInInventory) { final NodeKey inventoryNodeKey = iiToNodeInInventory.firstKeyOf(Node.class); if (inventoryNodeKey != null) { return new NodeId(inventoryNodeKey.getId().getValue()); } return null; } }