Add bridge fails on older OVS versions (< v1.10) 60/19260/3
authorSharad Mishra <sharad.d.mishra@intel.com>
Tue, 28 Apr 2015 08:45:21 +0000 (01:45 -0700)
committerSharad Mishra <sharad.d.mishra@intel.com>
Tue, 28 Apr 2015 16:27:07 +0000 (09:27 -0700)
To recreate -

Run "ovs-vsctl add-br br0" on OVS 1.9 or lower.
The above command fails with SchemaVersionMismatchException.

Change-Id: Iee3adda5252e50e17c493373f74ee26e928f524f
Signed-off-by: Sharad Mishra <sharad.d.mishra@intel.com>
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundMapper.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/ProtocolRemovedCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/ProtocolUpdateCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbBridgeUpdateCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbPortUpdateCommand.java

index 1e85708f1459aa07e615b1f2643d22095416ddc5..46c7b43884365247a268fb90e057979c8b34ea6f 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Set;
 
 import org.opendaylight.ovsdb.lib.OvsdbClient;
 import org.opendaylight.ovsdb.lib.OvsdbConnectionInfo;
+import org.opendaylight.ovsdb.lib.error.SchemaVersionMismatchException;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
@@ -285,7 +286,12 @@ public class SouthboundMapper {
     }
 
     public static List<ProtocolEntry> createMdsalProtocols(Bridge bridge) {
-        Set<String> protocols = bridge.getProtocolsColumn().getData();
+        Set<String> protocols = null;
+        try {
+            protocols = bridge.getProtocolsColumn().getData();
+        } catch (SchemaVersionMismatchException e) {
+            LOG.warn("protocols not supported by this version of ovsdb", e);
+        }
         List<ProtocolEntry> protocolList = new ArrayList<ProtocolEntry>();
         if (protocols != null && protocols.size() > 0) {
             ImmutableBiMap<String, Class<? extends OvsdbBridgeProtocolBase>> mapper =
index 557c79842bdf58e238dc5862ad91211283573cc0..b6d17826dbea3af9954f45a8e76b7662eb6c48d7 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.ovsdb.lib.error.SchemaVersionMismatchException;
 import org.opendaylight.ovsdb.lib.notation.Mutator;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
@@ -15,12 +16,15 @@ 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.ovsdb.bridge.attributes.ProtocolEntry;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 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.collect.Sets;
 
 public class ProtocolRemovedCommand extends AbstractTransactCommand {
 
+    private static final Logger LOG = LoggerFactory.getLogger(ProtocolRemovedCommand.class);
     private Set<InstanceIdentifier<ProtocolEntry>> removed;
     private Map<InstanceIdentifier<ProtocolEntry>, ProtocolEntry> operationalProtocolEntries;
     private Map<InstanceIdentifier<OvsdbBridgeAugmentation>, OvsdbBridgeAugmentation> updatedBridges;
@@ -48,8 +52,12 @@ public class ProtocolRemovedCommand extends AbstractTransactCommand {
                     String protocolString = SouthboundConstants.OVSDB_PROTOCOL_MAP.get(protocolEntry.getProtocol());
                     if (protocolString != null) {
                         bridge.setProtocols(Sets.newHashSet(protocolString));
-                        transaction.add(op.mutate(bridge).addMutation(bridge.getProtocolsColumn().getSchema(),
-                                Mutator.DELETE, bridge.getProtocolsColumn().getData()));
+                        try {
+                            transaction.add(op.mutate(bridge).addMutation(bridge.getProtocolsColumn().getSchema(),
+                                    Mutator.DELETE,bridge.getProtocolsColumn().getData()));
+                        } catch (SchemaVersionMismatchException e) {
+                            LOG.warn("protocol is not supported by this version of ovsdb", e);
+                        }
                     }
                 }
             }
index da336a636d6aeba2b67dec62779a93f7772dbec6..a98f1fe8cc58acf93eaa1742970aa1a9dcef1a98 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.ovsdb.lib.error.SchemaVersionMismatchException;
 import org.opendaylight.ovsdb.lib.notation.Mutator;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
@@ -15,12 +16,15 @@ 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.ovsdb.bridge.attributes.ProtocolEntry;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 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.collect.Sets;
 
 public class ProtocolUpdateCommand extends AbstractTransactCommand {
 
+    private static final Logger LOG = LoggerFactory.getLogger(ProtocolUpdateCommand.class);
     private Map<InstanceIdentifier<ProtocolEntry>, ProtocolEntry> protocols;
     private Map<InstanceIdentifier<OvsdbBridgeAugmentation>, OvsdbBridgeAugmentation> bridges;
 
@@ -55,12 +59,15 @@ public class ProtocolUpdateCommand extends AbstractTransactCommand {
                     if (protocolString != null) {
                         Bridge bridge = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Bridge.class);
                         bridge.setName(ovsdbBridge.getBridgeName().getValue());
-                        bridge.setProtocols(Sets.newHashSet(protocolString));
-                        transaction.add(op.mutate(bridge)
-                                .addMutation(bridge.getProtocolsColumn().getSchema(),
+                        try {
+                            bridge.setProtocols(Sets.newHashSet(protocolString));
+                            transaction.add(op.mutate(bridge).addMutation(bridge.getProtocolsColumn().getSchema(),
                                         Mutator.INSERT,bridge.getProtocolsColumn().getData())
                                 .where(bridge.getNameColumn().getSchema().opEqual(bridge.getNameColumn().getData()))
                                 .build());
+                        } catch (SchemaVersionMismatchException e) {
+                            LOG.warn("protocol not supported by this version of ovsdb", e);
+                        }
                     }
                 }
             }
index e17ce0b740610dd01e6cf2f372014b277ec42dff..5958156a60aa007b4a73b4d82f2d640be8a08345 100644 (file)
@@ -13,6 +13,7 @@ import org.apache.commons.lang3.math.NumberUtils;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.ovsdb.lib.error.SchemaVersionMismatchException;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
@@ -162,19 +163,23 @@ public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
                 new ArrayList<InstanceIdentifier<ProtocolEntry>>();
         Bridge oldBridge = oldBridgeRows.get(bridge.getUuid());
 
-        if (oldBridge != null && oldBridge.getProtocolsColumn() != null) {
-            for (String protocol: oldBridge.getProtocolsColumn().getData()) {
-                if (bridge.getProtocolsColumn() == null
-                        || !bridge.getProtocolsColumn().getData().contains(protocol)) {
-                    Class<? extends OvsdbBridgeProtocolBase> proto =
-                            SouthboundConstants.OVSDB_PROTOCOL_MAP.inverse().get(protocol);
-                    InstanceIdentifier<ProtocolEntry> iid = bridgeIid
-                            .augmentation(OvsdbBridgeAugmentation.class)
-                            .child(ProtocolEntry.class,
-                                    new ProtocolEntryKey(proto));
-                    result.add(iid);
+        try {
+            if (oldBridge != null && oldBridge.getProtocolsColumn() != null) {
+                for (String protocol : oldBridge.getProtocolsColumn().getData()) {
+                    if (bridge.getProtocolsColumn() == null || !bridge.getProtocolsColumn().getData()
+                                .contains(protocol)) {
+                        Class<? extends OvsdbBridgeProtocolBase> proto = SouthboundConstants.OVSDB_PROTOCOL_MAP
+                                .inverse().get(protocol);
+                        InstanceIdentifier<ProtocolEntry> iid = bridgeIid
+                                .augmentation(OvsdbBridgeAugmentation.class)
+                                .child(ProtocolEntry.class,
+                                        new ProtocolEntryKey(proto));
+                        result.add(iid);
+                    }
                 }
             }
+        } catch (SchemaVersionMismatchException e) {
+            LOG.warn("protocol not supported by this version of ovsdb", e);
         }
         return result;
     }
@@ -185,7 +190,7 @@ public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
         try {
             node = transaction.read(LogicalDatastoreType.OPERATIONAL, connectionIid).checkedGet();
         } catch (final ReadFailedException e) {
-            LOG.debug("Read Operational/DS for Node fail! {}", connectionIid, e);
+            LOG.warn("Read Operational/DS for Node fail! {}", connectionIid, e);
         }
         return node;
     }
@@ -353,7 +358,7 @@ public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
                         }
                     }
                 } catch (Exception e) {
-                    LOG.debug("Error getting local ip address {}", e);
+                    LOG.warn("Error getting local ip address {}", e);
                 }
             }
         }
index 5cc504a5dcf85b556cb85a0b9b5eb1a946a75f02..c9d0e2024fba62c2399a2ee7247570b38016a386 100644 (file)
@@ -19,6 +19,7 @@ import java.util.Set;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.ovsdb.lib.error.ColumnSchemaNotFoundException;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.Column;
 import org.opendaylight.ovsdb.lib.notation.UUID;
@@ -333,8 +334,12 @@ public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
             final String bridge,
             final OvsdbTerminationPointAugmentationBuilder ovsdbTerminationPointBuilder) {
 
-        Set<Long> ofPortRequests = interf
-                .getOpenFlowPortRequestColumn().getData();
+        Set<Long> ofPortRequests = null;
+        try {
+            ofPortRequests = interf.getOpenFlowPortRequestColumn().getData();
+        } catch (ColumnSchemaNotFoundException e) {
+            LOG.warn("Cannot find openflow column", e);
+        }
         if (ofPortRequests != null && !ofPortRequests.isEmpty()) {
             Iterator<Long> ofPortRequestsIter = ofPortRequests.iterator();
             int ofPort = ofPortRequestsIter.next().intValue();