Initial write for bridge. 83/16283/7
authorEd Warnicke <eaw@cisco.com>
Thu, 26 Feb 2015 15:06:30 +0000 (08:06 -0700)
committerEd Warnicke <eaw@cisco.com>
Tue, 17 Mar 2015 18:16:39 +0000 (13:16 -0500)
This code does an initial write of a bridge.
It also introduces a simplifying framework for
handling writes to ovsdb in the southbound plugin.

Change-Id: I7aa370b7ce9b976febd87478e1e6ff96c17ba8a4
Signed-off-by: Ed Warnicke <eaw@cisco.com>
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionInstance.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionManager.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbManagedNodeDataChangeListener.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundUtil.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/BridgeCreateCommand.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/DataChangesManagedByOvsdbNodeEvent.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactCommand.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactCommandAggregator.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactInvoker.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactInvokerImpl.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactUtils.java [new file with mode: 0644]

index 9ea46ce03f8c10933ef3e56e150be08ff11c7802..e278a677d34c70b31064c75d06548140bea26b1b 100644 (file)
@@ -7,10 +7,13 @@
  */
 package org.opendaylight.ovsdb.southbound;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.ovsdb.lib.EchoServiceCallbackFilters;
 import org.opendaylight.ovsdb.lib.LockAquisitionCallback;
 import org.opendaylight.ovsdb.lib.LockStolenCallback;
@@ -30,8 +33,14 @@ import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
 import org.opendaylight.ovsdb.lib.schema.TableSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
+import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactCommand;
+import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactCommandAggregator;
+import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactInvoker;
+import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactInvokerImpl;
 import org.opendaylight.ovsdb.southbound.transactions.md.OvsdbNodeCreateCommand;
 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,6 +52,7 @@ public class OvsdbConnectionInstance implements OvsdbClient {
     private OvsdbClient client;
     private OvsdbClientKey key;
     private TransactionInvoker txInvoker;
+    private Map<DatabaseSchema,TransactInvoker> transactInvokers = new HashMap<DatabaseSchema,TransactInvoker>();
     private MonitorCallBack callback;
 
     OvsdbConnectionInstance(OvsdbClientKey key,OvsdbClient client,TransactionInvoker txInvoker) {
@@ -53,6 +63,12 @@ public class OvsdbConnectionInstance implements OvsdbClient {
         registerCallBack();
     }
 
+    public void transact(TransactCommand command) {
+        for(TransactInvoker transactInvoker: transactInvokers.values()) {
+            transactInvoker.invoke(command);
+        }
+    }
+
     private void registerCallBack() {
         this.callback = new OvsdbMonitorCallback(key,txInvoker);
         try {
@@ -61,6 +77,7 @@ public class OvsdbConnectionInstance implements OvsdbClient {
                 for (String database : databases) {
                     DatabaseSchema dbSchema = getSchema(database).get();
                     if(dbSchema != null) {
+                        transactInvokers.put(dbSchema, new TransactInvokerImpl(this,dbSchema));
                         monitorAllTables(database, dbSchema);
                     } else {
                         LOG.warn("No schema reported for database {} for key {}",database,key);
index 7946d03404e09851d3afa2395b1ecbd5c0a6cac0..a9c391ae791d385135f0edea66a1e3f184b11455 100644 (file)
@@ -27,9 +27,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re
 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.OvsdbNodeRef;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.CheckedFuture;
 
@@ -97,34 +99,12 @@ public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoClos
     }
 
     public OvsdbConnectionInstance getConnectionInstance(OvsdbBridgeAttributes mn) {
-        Preconditions.checkNotNull(mn);
-        try {
-            OvsdbNodeRef ref = mn.getManagedBy();
-            if(ref != null) {
-                ReadOnlyTransaction transaction = db.newReadOnlyTransaction();
-                CheckedFuture<?, ReadFailedException> nf = transaction.read(LogicalDatastoreType.OPERATIONAL, ref.getValue());
-                transaction.close();
-                Object obj = nf.get();
-                if(obj instanceof Node) {
-                    OvsdbNodeAugmentation ovsdbNode = ((Node)obj).getAugmentation(OvsdbNodeAugmentation.class);
-                    if(ovsdbNode !=null) {
-                        return getConnectionInstance(ovsdbNode);
-                    } else {
-                        LOG.warn("OvsdbManagedNode {} claims to be managed by {} but that OvsdbNode does not exist",mn,ref.getValue());
-                        return null;
-                    }
-                } else {
-                    LOG.warn("Mysteriously got back a thing which is *not* a topology Node: {}",obj);
-                    return null;
-                }
-            } else {
-                LOG.warn("Cannot find client for OvsdbManagedNode without a specified ManagedBy {}",mn);
-                return null;
-            }
-         } catch (Exception e) {
-             LOG.warn("Failed to get OvsdbNode that manages OvsdbManagedNode {}",mn, e);
-             return null;
-         }
+        Optional<OvsdbNodeAugmentation> optional = SouthboundUtil.getManagingNode(db, mn);
+        if(optional.isPresent()) {
+            return getConnectionInstance(optional.get());
+        } else {
+            return null;
+        }
     }
 
     public OvsdbConnectionInstance getConnectionInstance(Node node) {
index 52944d2423b5308a2a616151a39ad05439e2fd9a..3b81497b17bda8a6ab5e81a0c137f0399cb94fac 100644 (file)
@@ -14,7 +14,8 @@ 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.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.ovsdb.lib.OvsdbClient;
+import org.opendaylight.ovsdb.southbound.ovsdb.transact.DataChangesManagedByOvsdbNodeEvent;
+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.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;
@@ -54,9 +55,13 @@ public class OvsdbManagedNodeDataChangeListener implements DataChangeListener, A
            // TODO validate we have the correct kind of InstanceIdentifier
            if(created.getValue() instanceof OvsdbBridgeAugmentation) {
                LOG.debug("Received request to create {}",created.getValue());
-               OvsdbClient client = cm.getClient((OvsdbBridgeAugmentation)created.getValue());
+               OvsdbConnectionInstance client = cm.getConnectionInstance((OvsdbBridgeAugmentation)created.getValue());
                if(client != null) {
                    LOG.debug("Found client for {}", created.getValue());
+                   client.transact(new TransactCommandAggregator(
+                           new DataChangesManagedByOvsdbNodeEvent(
+                                   SouthboundMapper.createInstanceIdentifier(client.getKey()),
+                                   changes)));
                } else {
                    LOG.debug("Did not find client for {}",created.getValue());
                }
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundUtil.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundUtil.java
new file mode 100644 (file)
index 0000000..21b8580
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * 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.ovsdb.southbound;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAttributes;
+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.OvsdbNodeRef;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.CheckedFuture;
+
+public class SouthboundUtil {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SouthboundUtil.class);
+
+
+    public static Optional<OvsdbNodeAugmentation> getManagingNode(DataBroker db,OvsdbBridgeAttributes mn) {
+        Preconditions.checkNotNull(mn);
+        try {
+            OvsdbNodeRef ref = mn.getManagedBy();
+            if(ref != null && ref.getValue() != null) {
+                ReadOnlyTransaction transaction = db.newReadOnlyTransaction();
+                @SuppressWarnings("unchecked") // Note: erasure makes this safe in combination with the typecheck below
+                InstanceIdentifier<Node> path = (InstanceIdentifier<Node>) ref.getValue();
+                CheckedFuture<Optional<Node>, ReadFailedException> nf = transaction.read(LogicalDatastoreType.OPERATIONAL, path);
+                transaction.close();
+                Optional<Node> optional = nf.get();
+                if(optional != null && optional.isPresent() && optional.get() instanceof Node) {
+                    OvsdbNodeAugmentation ovsdbNode = optional.get().getAugmentation(OvsdbNodeAugmentation.class);
+                    if(ovsdbNode !=null) {
+                        return Optional.of(ovsdbNode);
+                    } else {
+                        LOG.warn("OvsdbManagedNode {} claims to be managed by {} but that OvsdbNode does not exist",mn,ref.getValue());
+                        return Optional.absent();
+                    }
+                } else {
+                    LOG.warn("Mysteriously got back a thing which is *not* a topology Node: {}",optional);
+                    return Optional.absent();
+                }
+            } else {
+                LOG.warn("Cannot find client for OvsdbManagedNode without a specified ManagedBy {}",mn);
+                return Optional.absent();
+            }
+         } catch (Exception e) {
+             LOG.warn("Failed to get OvsdbNode that manages OvsdbManagedNode {}",mn, e);
+             return Optional.absent();
+         }
+    }
+}
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/BridgeCreateCommand.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/BridgeCreateCommand.java
new file mode 100644 (file)
index 0000000..89e517c
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * 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.ovsdb.southbound.ovsdb.transact;
+
+import static org.opendaylight.ovsdb.lib.operations.Operations.op;
+
+import java.util.Map;
+
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.ovsdb.lib.notation.Mutator;
+import org.opendaylight.ovsdb.lib.notation.UUID;
+import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
+import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
+import org.opendaylight.ovsdb.schema.openvswitch.Bridge;
+import org.opendaylight.ovsdb.schema.openvswitch.OpenVSwitch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.Sets;
+
+public class BridgeCreateCommand implements TransactCommand {
+    private AsyncDataChangeEvent<InstanceIdentifier<?>, OvsdbBridgeAugmentation> changes;
+    private static final Logger LOG = LoggerFactory.getLogger(BridgeCreateCommand.class);
+
+
+    public BridgeCreateCommand(AsyncDataChangeEvent<InstanceIdentifier<?>, OvsdbBridgeAugmentation> changes) {
+        this.changes = changes;
+    }
+
+    @Override
+    public void execute(TransactionBuilder transaction) {
+        Map<InstanceIdentifier<Node>, OvsdbBridgeAugmentation> created = TransactUtils.extractOvsdbManagedNodeCreate(changes);
+        for(OvsdbBridgeAugmentation ovsdbManagedNode: created.values()) {
+            LOG.debug("Received request to create ovsdb bridge name: {} uuid: {}",
+                        ovsdbManagedNode.getBridgeName(),
+                        ovsdbManagedNode.getBridgeUuid());
+            // Bridge part
+            Bridge bridge = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Bridge.class);
+            bridge.setName(ovsdbManagedNode.getBridgeName().getValue());
+            String namedUuid = "Bridge_" + ovsdbManagedNode.getBridgeName().getValue();
+            transaction.add(op.insert(bridge).withId(namedUuid));
+
+            // OpenVSwitchPart
+            OpenVSwitch ovs = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), OpenVSwitch.class);
+            ovs.setBridges(Sets.newHashSet(new UUID(namedUuid)));
+            transaction.add(op.mutate(ovs).addMutation(ovs.getBridgesColumn().getSchema(),
+                    Mutator.INSERT,
+                    ovs.getBridgesColumn().getData())
+                    );
+        }
+    }
+
+}
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/DataChangesManagedByOvsdbNodeEvent.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/DataChangesManagedByOvsdbNodeEvent.java
new file mode 100644 (file)
index 0000000..cd07033
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * 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.ovsdb.southbound.ovsdb.transact;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class DataChangesManagedByOvsdbNodeEvent implements
+        AsyncDataChangeEvent<InstanceIdentifier<?>, OvsdbBridgeAugmentation> {
+    //primary fields
+    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> event;
+    private InstanceIdentifier<?> iid;
+
+    // local caches of computed data
+    private Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> createdData = null;
+    private Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> updatedData = null;
+    private Set<InstanceIdentifier<?>> removedPaths = null;
+    private Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> originalData;
+
+    public DataChangesManagedByOvsdbNodeEvent(InstanceIdentifier<?> iid, AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> event) {
+        this.iid = iid;
+        this.event = event;
+    }
+
+    private Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> filter(Map<InstanceIdentifier<?>, DataObject> data) {
+        Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> result = new HashMap<InstanceIdentifier<?>, OvsdbBridgeAugmentation>();
+        for(Entry<InstanceIdentifier<?>, DataObject> created: data.entrySet()) {
+            if(created.getValue() != null
+                    && created.getValue() instanceof OvsdbBridgeAugmentation
+                    && ((OvsdbBridgeAugmentation)created.getValue()).getManagedBy() != null
+                    && ((OvsdbBridgeAugmentation)created.getValue()).getManagedBy().getValue() != null
+                    && ((OvsdbBridgeAugmentation)created.getValue()).getManagedBy().getValue().equals(iid)) {
+                result.put(created.getKey(),((OvsdbBridgeAugmentation)created.getValue()));
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> getCreatedData() {
+        if(this.createdData == null) {
+            this.createdData = filter(event.getCreatedData());
+        }
+        return this.createdData;
+    }
+
+    @Override
+    public Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> getUpdatedData() {
+        if(this.updatedData == null) {
+            this.updatedData = filter(event.getUpdatedData());
+        }
+        return this.updatedData;
+    }
+
+    @Override
+    public Set<InstanceIdentifier<?>> getRemovedPaths() {
+        if(this.removedPaths != null) {
+            this.removedPaths = new HashSet<InstanceIdentifier<?>>();
+            for(InstanceIdentifier<?> path: event.getRemovedPaths()) {
+                DataObject original = this.event.getOriginalData().get(path);
+                if(original != null
+                        && original instanceof OvsdbBridgeAugmentation
+                        && ((OvsdbBridgeAugmentation)original).getManagedBy().equals(this.iid)) {
+                    this.removedPaths.add(path);
+                }
+            }
+        }
+        return this.removedPaths;
+    }
+
+    @Override
+    public Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> getOriginalData() {
+        if(this.originalData == null) {
+            this.originalData = filter(event.getOriginalData());
+        }
+        return this.originalData;
+    }
+
+    @Override
+    public OvsdbBridgeAugmentation getOriginalSubtree() {
+        if(this.event.getOriginalSubtree() instanceof OvsdbBridgeAugmentation) {
+            return (OvsdbBridgeAugmentation)this.event.getOriginalSubtree();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public OvsdbBridgeAugmentation getUpdatedSubtree() {
+        if(this.event.getUpdatedSubtree() instanceof OvsdbBridgeAugmentation) {
+            return (OvsdbBridgeAugmentation)this.event.getUpdatedSubtree();
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactCommand.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactCommand.java
new file mode 100644 (file)
index 0000000..c720ba9
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * 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.ovsdb.southbound.ovsdb.transact;
+
+import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
+
+public interface TransactCommand {
+
+    public void execute(TransactionBuilder transaction);
+
+}
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactCommandAggregator.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactCommandAggregator.java
new file mode 100644 (file)
index 0000000..2bc99bc
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * 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.ovsdb.southbound.ovsdb.transact;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class TransactCommandAggregator implements TransactCommand {
+
+    private List<TransactCommand> commands = new ArrayList<TransactCommand>();
+    private AsyncDataChangeEvent<InstanceIdentifier<?>, OvsdbBridgeAugmentation> changes;
+
+    public TransactCommandAggregator(AsyncDataChangeEvent<InstanceIdentifier<?>, OvsdbBridgeAugmentation> changes) {
+        this.changes=changes;
+        commands.add(new BridgeCreateCommand(changes));
+    }
+
+    @Override
+    public void execute(TransactionBuilder transaction) {
+        for(TransactCommand command:commands) {
+            command.execute(transaction);
+        }
+    }
+}
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactInvoker.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactInvoker.java
new file mode 100644 (file)
index 0000000..ea88ff7
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * 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.ovsdb.southbound.ovsdb.transact;
+
+public interface TransactInvoker {
+    public void invoke(TransactCommand command);
+}
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactInvokerImpl.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactInvokerImpl.java
new file mode 100644 (file)
index 0000000..66031ca
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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.ovsdb.southbound.ovsdb.transact;
+
+import java.util.List;
+
+import org.opendaylight.ovsdb.lib.operations.OperationResult;
+import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
+import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
+import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class TransactInvokerImpl implements TransactInvoker {
+    private static final Logger LOG = LoggerFactory.getLogger(BridgeCreateCommand.class);
+    private OvsdbConnectionInstance connectionInstance;
+    private DatabaseSchema dbSchema;
+
+    public TransactInvokerImpl(OvsdbConnectionInstance connectionInstance, DatabaseSchema dbSchema) {
+        this.connectionInstance =connectionInstance;
+        this.dbSchema = dbSchema;
+    }
+
+    @Override
+    public void invoke(TransactCommand command) {
+        TransactionBuilder tb = new TransactionBuilder(connectionInstance, dbSchema);
+        command.execute(tb);
+        ListenableFuture<List<OperationResult>> result = tb.execute();
+        try {
+            List<OperationResult> got = result.get();
+            LOG.debug("Results of create bridge request",got);
+        } catch (Exception e){
+            LOG.warn("Transact execution exception: ",e);
+        }
+    }
+
+}
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactUtils.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactUtils.java
new file mode 100644 (file)
index 0000000..124837d
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * 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.ovsdb.southbound.ovsdb.transact;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TransactUtils {
+    private static final Logger LOG = LoggerFactory.getLogger(TransactUtils.class);
+
+    public static Map<InstanceIdentifier<Node>,OvsdbBridgeAugmentation> extractOvsdbManagedNodeCreate(
+            AsyncDataChangeEvent<InstanceIdentifier<?>, OvsdbBridgeAugmentation> changes) {
+        return extractOvsdbManagedNode(changes.getCreatedData());
+    }
+
+    public static Map<InstanceIdentifier<Node>,OvsdbBridgeAugmentation> extractOvsdbManagedNode(
+            AsyncDataChangeEvent<InstanceIdentifier<?>, OvsdbBridgeAugmentation> changes) {
+        return extractOvsdbManagedNode(changes.getUpdatedData());
+    }
+
+    public static Set<InstanceIdentifier<Node>> extractOvsdbManagedNodeRemoved(AsyncDataChangeEvent<InstanceIdentifier<?>, OvsdbBridgeAugmentation> changes) {
+        Set<InstanceIdentifier<Node>> result = new HashSet<InstanceIdentifier<Node>>();
+        for(InstanceIdentifier<?> iid : changes.getRemovedPaths()) {
+            if(iid.getTargetType().equals(OvsdbBridgeAugmentation.class)) {
+                @SuppressWarnings("unchecked") // Actually checked above
+                InstanceIdentifier<Node> iidn = (InstanceIdentifier<Node>)iid;
+                result.add(iidn);
+            }
+        }
+        return result;
+    }
+
+
+    public static Map<InstanceIdentifier<Node>,OvsdbBridgeAugmentation> extractOvsdbManagedNode(
+            Map<InstanceIdentifier<?>, OvsdbBridgeAugmentation> changes) {
+        Map<InstanceIdentifier<Node>,OvsdbBridgeAugmentation> result = new HashMap<InstanceIdentifier<Node>,OvsdbBridgeAugmentation>();
+        for( Entry<InstanceIdentifier<?>, OvsdbBridgeAugmentation> created : changes.entrySet()) {
+            OvsdbBridgeAugmentation value = created.getValue();
+            Class<?> type = created.getKey().getTargetType();
+            if(type.equals(OvsdbBridgeAugmentation.class)) {
+                @SuppressWarnings("unchecked") // Actually checked above
+                InstanceIdentifier<Node> iid = (InstanceIdentifier<Node>) created.getKey();
+                OvsdbBridgeAugmentation ovsdbManagedNode = (OvsdbBridgeAugmentation) value;
+                result.put(iid, ovsdbManagedNode);
+            }
+        }
+        return result;
+    }
+
+}