Bug 8476 Add support for logical switch replication mode 09/57209/9
authorVictor Pickard <vpickard@redhat.com>
Tue, 16 May 2017 20:27:54 +0000 (16:27 -0400)
committerAnil Vishnoi <vishnoianil@gmail.com>
Tue, 25 Jul 2017 01:08:20 +0000 (01:08 +0000)
With OVS 2.6, the Logical Switch table, in the hardware_vtep schema, has
a new field, replication_mode. This bug will be used to add support to
netvirt, ovsdb, and genius for setting the replication_mode of logical
switches. The default will be for ODL to set the replication_mode
to "source_node" when creating logical switches.

Refer to [1] for more details on replication_mode.

[1] http://openvswitch.org/support/dist-docs/vtep.5.html

Try/catch block in place to handle case where schema
version does not support replication_mode.

Tested this with OVS 2.5, which does not support replication_mode.
Verified that logical switch is created.

Debug log will be generated when schema version does
not support replication_mode (same check as PhysicalSwitchUpdate).

Change-Id: I374ba52ff5517dacb6af498f34b7e58638f46463
Signed-off-by: Victor Pickard <vpickard@redhat.com>
hwvtepsouthbound/hwvtepsouthbound-api/src/main/yang/hwvtep.yang
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/LogicalSwitchUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/GlobalUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepLogicalSwitchUpdateCommand.java

index 00ec9aa5f844c69f3e357b166c0633ad3b36fe77..b1f3e97fd825c7850e1daeb35a2a09316ced5739 100644 (file)
@@ -369,6 +369,10 @@ module hwvtep {
             description "Per Logical Switch tunnel key";
             type string;
         }
+        leaf replication-mode {
+            description "Per Logical Switch replication mode";
+            type string;
+        }
     }
 
     grouping hwvtep-physical-port-attributes {
index 8b22d9ff68d110183fe6b4f653101a88d80b2f4b..018c0910124ce1614eb5a59e821bded0b7cc906d 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transact;
 
+import static org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil.schemaMismatchLog;
 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
 
 import java.util.Collection;
@@ -22,6 +23,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 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.lib.error.SchemaVersionMismatchException;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
@@ -83,6 +85,7 @@ public class LogicalSwitchUpdateCommand extends AbstractTransactCommand<LogicalS
             LogicalSwitch logicalSwitch = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), LogicalSwitch.class);
             setDescription(logicalSwitch, lswitch);
             setTunnelKey(logicalSwitch, lswitch);
+            setReplicationMode(logicalSwitch, lswitch);
             if (!operationalSwitchOptional.isPresent()) {
                 setName(logicalSwitch, lswitch, operationalSwitchOptional);
                 LOG.trace("execute: creating LogicalSwitch entry: {}", logicalSwitch);
@@ -127,6 +130,19 @@ public class LogicalSwitchUpdateCommand extends AbstractTransactCommand<LogicalS
         }
     }
 
+    private void setReplicationMode(LogicalSwitch logicalSwitch, LogicalSwitches inputSwitch) {
+        if (inputSwitch.getReplicationMode() != null) {
+            Set<String> mode = new HashSet<>();
+            mode.add(inputSwitch.getReplicationMode());
+            try {
+                logicalSwitch.setReplicationMode(mode);
+            }
+            catch (SchemaVersionMismatchException e) {
+                schemaMismatchLog("replication_mode", "Logical_Switch", e);
+            }
+        }
+    }
+
     @Override
     protected List<LogicalSwitches> getData(HwvtepGlobalAugmentation augmentation) {
         return augmentation.getLogicalSwitches();
index 9bb15b65a320f0094be7faafc6779b4ed550c6e9..a615c8dd8e38670a0d0f56d89a133ae1a6b4803d 100644 (file)
@@ -58,8 +58,10 @@ public class GlobalUpdateCommand extends AbstractTransactionCommand {
             hwvtepGlobalBuilder.setConnectionInfo(getConnectionInfo());
             NodeBuilder nodeBuilder = new NodeBuilder();
             nodeBuilder.setNodeId(getNodeId(hwvtepGlobal));
-            nodeBuilder.addAugmentation(HwvtepGlobalAugmentation.class, hwvtepGlobalBuilder.build());
+            HwvtepGlobalAugmentation hwvtepGlobalAugmentation = hwvtepGlobalBuilder.build();
+            nodeBuilder.addAugmentation(HwvtepGlobalAugmentation.class, hwvtepGlobalAugmentation);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, nodePath, nodeBuilder.build());
+            getOvsdbConnectionInstance().setHwvtepGlobalAugmentation(hwvtepGlobalAugmentation);
         }
     }
 
index 6bf757ea7f1a0e43f4fd45c50be2b90dc1cd0238..d9d21dfb61bdf57d687a0045f810a979109fabd6 100644 (file)
@@ -16,9 +16,11 @@ import java.util.Map.Entry;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSchemaConstants;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.UUID;
+import org.opendaylight.ovsdb.lib.notation.Version;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
@@ -34,10 +36,13 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 import com.google.common.base.Optional;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class HwvtepLogicalSwitchUpdateCommand extends AbstractTransactionCommand {
 
     private Map<UUID, LogicalSwitch> updatedLSRows;
+    private static final Logger LOG = LoggerFactory.getLogger(HwvtepLogicalSwitchUpdateCommand.class);
 
     public HwvtepLogicalSwitchUpdateCommand(HwvtepConnectionInstance key, TableUpdates updates, DatabaseSchema dbSchema) {
         super(key, updates, dbSchema);
@@ -75,6 +80,17 @@ public class HwvtepLogicalSwitchUpdateCommand extends AbstractTransactionCommand
         LogicalSwitchesBuilder lsBuilder = new LogicalSwitchesBuilder();
         lsBuilder.setLogicalSwitchUuid(new Uuid(lSwitch.getUuid().toString()));
         lsBuilder.setHwvtepNodeDescription(lSwitch.getDescription());
+        HwvtepGlobalAugmentation hwvtepGlobalAugmentation = getOvsdbConnectionInstance().getHwvtepGlobalAugmentation();
+        if (hwvtepGlobalAugmentation != null) {
+            Version minVersion = Version.fromString("1.6.0");
+            Version dbVersion = Version.fromString(hwvtepGlobalAugmentation.getDbVersion());
+            if (dbVersion.compareTo(minVersion) >= 0) {
+                if (lSwitch.getReplicationModeColumn().getData() != null && !lSwitch.getReplicationModeColumn().getData().isEmpty()) {
+                    lsBuilder.setReplicationMode(lSwitch.getReplicationModeColumn().getData().iterator().next());
+                }
+                LOG.debug("setReplicationMode to: {}", lSwitch.getReplicationModeColumn().getData().iterator().next());
+            }
+        }
         HwvtepNodeName hwvtepName = new HwvtepNodeName(lSwitch.getName());
         lsBuilder.setHwvtepNodeName(hwvtepName);
         lsBuilder.setKey(new LogicalSwitchesKey(hwvtepName));