X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=southbound%2Fsouthbound-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fovsdb%2Fsouthbound%2FOvsdbDataChangeListener.java;h=4db986d9606d94bdd8a3fb853e9082ee075f554e;hb=8a908569f4e8e19e7f03f08f97d0704f9ca46cc9;hp=14ecfc775581c6f0aed89354e22e2197be1017df;hpb=a1da9f8bb0e78fe7659ce77aa87d29bf46035efd;p=ovsdb.git diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbDataChangeListener.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbDataChangeListener.java index 14ecfc775..4db986d96 100644 --- a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbDataChangeListener.java +++ b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbDataChangeListener.java @@ -1,11 +1,21 @@ +/* + * 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.ovsdb.southbound; import java.net.UnknownHostException; -import java.util.HashSet; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener; 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; @@ -17,10 +27,12 @@ import org.opendaylight.ovsdb.southbound.ovsdb.transact.DataChangesManagedByOvsd import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactCommandAggregator; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo; 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.network.topology.Topology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -31,7 +43,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Predicates; import com.google.common.collect.Maps; -public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseable { +public class OvsdbDataChangeListener implements ClusteredDataChangeListener, AutoCloseable { private ListenerRegistration registration; private OvsdbConnectionManager cm; @@ -60,6 +72,19 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl public void onDataChanged( AsyncDataChangeEvent, DataObject> changes) { LOG.trace("onDataChanged: {}", changes); + for (Entry, DataObject> created : changes.getCreatedData().entrySet()) { + // TODO validate we have the correct kind of InstanceIdentifier + if (created.getValue() instanceof OvsdbNodeAugmentation) { + OvsdbNodeAugmentation ovsdbNode = (OvsdbNodeAugmentation)created.getValue(); + ConnectionInfo key = ovsdbNode.getConnectionInfo(); + InstanceIdentifier iid = cm.getInstanceIdentifier(key); + if ( iid != null) { + LOG.warn("Connection to device {} already exists. Plugin does not allow multiple connections " + + "to same device, hence dropping the request {}", key, ovsdbNode); + return; + } + } + } // Connect first if we have to: connect(changes); @@ -72,15 +97,20 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl // Finally disconnect if we need to disconnect(changes); + init(changes); + + LOG.trace("onDataChanged: exit"); } private void updateData( AsyncDataChangeEvent, DataObject> changes) { - for (OvsdbConnectionInstance connectionInstance : connectionInstancesFromChanges(changes)) { + for (Entry, OvsdbConnectionInstance> connectionInstanceEntry : + connectionInstancesFromChanges(changes).entrySet()) { + OvsdbConnectionInstance connectionInstance = connectionInstanceEntry.getValue(); connectionInstance.transact(new TransactCommandAggregator( new BridgeOperationalState(db, changes), new DataChangesManagedByOvsdbNodeEvent( - SouthboundMapper.createInstanceIdentifier(connectionInstance.getMDConnectionInfo()), + connectionInstance.getInstanceIdentifier(), changes))); } } @@ -111,7 +141,7 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl if (original.getValue() instanceof OvsdbNodeAugmentation) { try { cm.disconnect((OvsdbNodeAugmentation) original.getValue()); - cm.connect(value); + cm.connect((InstanceIdentifier) original.getKey(),value); } catch (UnknownHostException e) { LOG.warn("Failed to disconnect to ovsdbNode", e); } @@ -128,7 +158,8 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl // TODO validate we have the correct kind of InstanceIdentifier if (created.getValue() instanceof OvsdbNodeAugmentation) { try { - cm.connect((OvsdbNodeAugmentation) created.getValue()); + cm.connect((InstanceIdentifier) created.getKey(), + (OvsdbNodeAugmentation) created.getValue()); } catch (UnknownHostException e) { LOG.warn("Failed to connect to ovsdbNode", e); } @@ -136,45 +167,61 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl } } - public Set connectionInstancesFromChanges( + private void init( AsyncDataChangeEvent, DataObject> changes) { - Set result = new HashSet(); - result.addAll(connectionInstancesFromMap(changes.getCreatedData())); - result.addAll(connectionInstancesFromMap(changes.getUpdatedData())); - result.addAll(connectionInstancesFromMap( + for (Entry, DataObject> created : changes.getCreatedData().entrySet()) { + if (created.getValue() instanceof OvsdbNodeAugmentation) { + OvsdbNodeAugmentation ovsdbNode = (OvsdbNodeAugmentation)created.getValue(); + cm.init(ovsdbNode.getConnectionInfo()); + } + } + + } + + public Map,OvsdbConnectionInstance> connectionInstancesFromChanges( + AsyncDataChangeEvent, DataObject> changes) { + Map,OvsdbConnectionInstance> result = + new HashMap,OvsdbConnectionInstance>(); + result.putAll(connectionInstancesFromMap(changes.getCreatedData())); + result.putAll(connectionInstancesFromMap(changes.getUpdatedData())); + result.putAll(connectionInstancesFromMap( Maps.filterKeys(changes.getOriginalData(), Predicates.in(changes.getRemovedPaths())))); return result; } - public Set connectionInstancesFromMap(Map, DataObject> map) { + public Map,OvsdbConnectionInstance> connectionInstancesFromMap(Map, + DataObject> map) { Preconditions.checkNotNull(map); - Set result = new HashSet(); + Map,OvsdbConnectionInstance> result = + new HashMap,OvsdbConnectionInstance>(); for ( Entry, DataObject> created : map.entrySet()) { if (created.getValue() instanceof Node) { + OvsdbConnectionInstance client = null; LOG.debug("Received request for {}",created.getValue()); OvsdbBridgeAugmentation bridge = ((Node)created.getValue()).getAugmentation(OvsdbBridgeAugmentation.class); if (bridge != null) { - OvsdbConnectionInstance client = cm.getConnectionInstance(bridge); - if (client != null) { - LOG.debug("Found client for {}", created.getValue()); - result.add(client); - } else { - LOG.debug("Did not find client for {}",created.getValue()); - } + client = cm.getConnectionInstance(bridge); } else { OvsdbNodeAugmentation ovsNode = ((Node)created.getValue()).getAugmentation(OvsdbNodeAugmentation.class); if (ovsNode != null && ovsNode.getConnectionInfo() != null) { - OvsdbConnectionInstance client = cm.getConnectionInstance(ovsNode.getConnectionInfo()); - if (client != null) { - LOG.debug("Found client for {}", created.getValue()); - result.add(client); - } else { - LOG.debug("Did not find client for {}",created.getValue()); + client = cm.getConnectionInstance(ovsNode.getConnectionInfo()); + } else { + List terminationPoint = ((Node)created.getValue()).getTerminationPoint(); + if (!terminationPoint.isEmpty()) { + InstanceIdentifier nodeIid = SouthboundMapper. + createInstanceIdentifier(((Node)created.getValue()).getNodeId()); + client = cm.getConnectionInstance(nodeIid); } } } + if (client != null) { + LOG.debug("Found client for {}", created.getValue()); + result.put((InstanceIdentifier) created.getKey(), client); + } else { + LOG.debug("Did not find client for {}",created.getValue()); + } } } return result;