Break out ControllerUpdate and Remove into seperate commands 71/18071/2
authorEd Warnicke <eaw@cisco.com>
Thu, 9 Apr 2015 15:24:05 +0000 (08:24 -0700)
committerSam Hague <shague@redhat.com>
Fri, 10 Apr 2015 11:51:03 +0000 (11:51 +0000)
In addition, they now have the necessary logic to handle
Updates as well as Creates.

Change-Id: I414c3a73e75ea89c2fb7f644a19ed429016391ca
Signed-off-by: Ed Warnicke <eaw@cisco.com>
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/BridgeCreateCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/BridgeRemovedCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/ControllerRemovedCommand.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/ControllerUpdateCommand.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TransactCommandAggregator.java

index 17f79664009bcec0e6ab8a4472ef36ffc2bf1066..86591538a61347e1b6a34e79a54fda08406c8dc4 100644 (file)
@@ -18,7 +18,6 @@ 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.Controller;
 import org.opendaylight.ovsdb.schema.openvswitch.Interface;
 import org.opendaylight.ovsdb.schema.openvswitch.Port;
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
@@ -85,14 +84,6 @@ public class BridgeCreateCommand extends AbstractTransactCommand {
                     && SouthboundMapper.createOvsdbBridgeProtocols(ovsdbManagedNode).size() > 0) {
                 bridge.setProtocols(SouthboundMapper.createOvsdbBridgeProtocols(ovsdbManagedNode));
             }
-            Map<UUID,Controller> controllerMap = SouthboundMapper.createOvsdbController(
-                    ovsdbManagedNode, transaction.getDatabaseSchema());
-            for (Entry<UUID,Controller> entry: controllerMap.entrySet()) {
-                transaction.add(op.insert(entry.getValue()).withId(entry.getKey().toString()));
-            }
-            if (!controllerMap.isEmpty()) {
-                bridge.setController(controllerMap.keySet());
-            }
             bridge.setPorts(Sets.newHashSet(new UUID(portNamedUuid)));
 
             // Set the iid external_id
index 964d419efd22cb9b93a697218a81de3f7565edb2..f43fadcba1038916a1cee638bb1feb1b8ad8c747 100644 (file)
@@ -7,6 +7,7 @@ import java.util.Set;
 
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.ovsdb.lib.notation.Mutator;
+import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/ControllerRemovedCommand.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/ControllerRemovedCommand.java
new file mode 100644 (file)
index 0000000..54405c2
--- /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 java.util.Set;
+
+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.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.ovsdb.bridge.attributes.ControllerEntry;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Sets;
+
+public class ControllerRemovedCommand extends AbstractTransactCommand {
+
+    public ControllerRemovedCommand(BridgeOperationalState state,
+            AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
+        super(state, changes);
+    }
+
+    @Override
+    public void execute(TransactionBuilder transaction) {
+        Set<InstanceIdentifier<ControllerEntry>> removed =
+                TransactUtils.extractRemoved(getChanges(),ControllerEntry.class);
+        Map<InstanceIdentifier<ControllerEntry>, ControllerEntry> operationalControllerEntries
+            = TransactUtils.extractOriginal(getChanges(),ControllerEntry.class);
+        Map<InstanceIdentifier<OvsdbBridgeAugmentation>, OvsdbBridgeAugmentation> updatedBridges
+            = TransactUtils.extractCreatedOrUpdatedOrRemoved(getChanges(),OvsdbBridgeAugmentation.class);
+        for (InstanceIdentifier<ControllerEntry> controllerIid : removed) {
+            InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid =
+                    controllerIid.firstIdentifierOf(OvsdbBridgeAugmentation.class);
+            OvsdbBridgeAugmentation ovsdbBridge = updatedBridges.get(bridgeIid);
+            Optional<ControllerEntry> controllerEntryOptional = getOperationalState().getControllerEntry(controllerIid);
+            if (ovsdbBridge != null && controllerEntryOptional.isPresent()) {
+                ControllerEntry controllerEntry = controllerEntryOptional.get();
+                Bridge bridge = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Bridge.class);
+                bridge.setController(Sets.newHashSet(new UUID(controllerEntry.getControllerUuid().getValue())));
+                transaction.add(op.mutate(bridge).addMutation(bridge.getControllerColumn().getSchema(),
+                        Mutator.DELETE, bridge.getControllerColumn().getData()));
+            }
+        }
+
+
+    }
+
+}
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/ControllerUpdateCommand.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/ControllerUpdateCommand.java
new file mode 100644 (file)
index 0000000..d8c365f
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * 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 java.util.Map.Entry;
+
+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.Controller;
+import org.opendaylight.ovsdb.southbound.SouthboundMapper;
+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.ovsdb.bridge.attributes.ControllerEntry;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Sets;
+
+public class ControllerUpdateCommand extends AbstractTransactCommand {
+
+
+    public ControllerUpdateCommand(BridgeOperationalState state,
+            AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
+        super(state, changes);
+    }
+
+    @Override
+    public void execute(TransactionBuilder transaction) {
+        Map<InstanceIdentifier<ControllerEntry>, ControllerEntry> controllers =
+                TransactUtils.extractCreatedOrUpdated(getChanges(), ControllerEntry.class);
+        Map<InstanceIdentifier<OvsdbBridgeAugmentation>, OvsdbBridgeAugmentation> bridges =
+                TransactUtils.extractCreatedOrUpdated(getChanges(), OvsdbBridgeAugmentation.class);
+        for (Entry<InstanceIdentifier<ControllerEntry>, ControllerEntry> entry: controllers.entrySet()) {
+            Optional<ControllerEntry> operationalControllerEntryOptional =
+                    getOperationalState().getControllerEntry(entry.getKey());
+            if (!operationalControllerEntryOptional.isPresent()) {
+                InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid =
+                        entry.getKey().firstIdentifierOf(OvsdbBridgeAugmentation.class);
+                Optional<OvsdbBridgeAugmentation> bridgeOptional =
+                        getOperationalState().getOvsdbBridgeAugmentation(bridgeIid);
+                OvsdbBridgeAugmentation ovsdbBridge = null;
+                if (bridgeOptional.isPresent()) {
+                    ovsdbBridge = bridgeOptional.get();
+                } else {
+                    ovsdbBridge = bridges.get(bridgeIid);
+                }
+                if (ovsdbBridge != null
+                        && ovsdbBridge.getBridgeName() != null
+                        && entry.getValue() != null
+                        && entry.getValue().getTarget() != null) {
+                    Controller controller =
+                            TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Controller.class);
+                    controller.setTarget(entry.getValue().getTarget().getValue());
+                    String controllerNamedUuidString = SouthboundMapper.getRandomUUID();
+                    UUID controllerNamedUuid = new UUID(controllerNamedUuidString);
+                    transaction.add(op.insert(controller).withId(controllerNamedUuidString));
+
+                    Bridge bridge = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Bridge.class);
+                    bridge.setName(ovsdbBridge.getBridgeName().getValue());
+                    bridge.setController(Sets.newHashSet(controllerNamedUuid));
+                    transaction.add(op.mutate(bridge)
+                            .addMutation(bridge.getControllerColumn().getSchema(), Mutator.INSERT,
+                                    bridge.getControllerColumn().getData())
+                            .where(bridge.getNameColumn().getSchema().opEqual(bridge.getNameColumn().getData()))
+                            .build());
+                }
+            }
+        }
+
+    }
+
+}
index 20d6e260304bfa5bb60f38a96d4b5f50ed74194f..117634fbb1b37f29ac75bf0f68654fea1d45d8bd 100644 (file)
@@ -27,6 +27,8 @@ public class TransactCommandAggregator implements TransactCommand {
         this.changes = changes;
         commands.add(new BridgeCreateCommand(state,changes));
         commands.add(new OpenVSwitchBridgeAddCommand());
+        commands.add(new ControllerUpdateCommand(state,changes));
+        commands.add(new ControllerRemovedCommand(state,changes));
         commands.add(new BridgeRemovedCommand(state,changes));
         commands.add(new TerminationPointCreateCommand(state,changes));
         commands.add(new TerminationPointDeleteCommand(state, changes));