Add ability to read and write protocols for bridge 52/16652/3
authorEd Warnicke <eaw@cisco.com>
Mon, 16 Mar 2015 15:55:49 +0000 (10:55 -0500)
committerEd Warnicke <eaw@cisco.com>
Tue, 17 Mar 2015 20:38:43 +0000 (15:38 -0500)
Change-Id: Ia76a3513ae99b82c86ce4749321276a210c92958
Signed-off-by: Ed Warnicke <eaw@cisco.com>
southbound/southbound-api/src/main/yang/ovsdb.yang
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundConstants.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundMapper.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/BridgeCreateCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbBridgeUpdateCommand.java

index 239b38b2c15096670abd1de67a28bf99724d268f..b0178c8823c346ac7e26f189bc6a5747b3f75b05 100644 (file)
@@ -51,6 +51,40 @@ module ovsdb {
            RFC 2579: Textual Conventions for SMIv2";
     }
 
+    identity ovsdb-bridge-protocol-base {
+        description "Base identity for all ovsdb-bridge-protocols";
+    }
+
+    identity ovsdb-bridge-protocol-openflow-10 {
+        description "Ovsdb bridge protocol OpenFlow 1.0";
+        base ovsdb-bridge-protocol-base;
+    }
+
+    identity ovsdb-bridge-protocol-openflow-11 {
+        description "Ovsdb bridge protocol OpenFlow 1.1";
+        base ovsdb-bridge-protocol-base;
+    }
+
+    identity ovsdb-bridge-protocol-openflow-12 {
+        description "Ovsdb bridge protocol OpenFlow 1.2";
+        base ovsdb-bridge-protocol-base;
+    }
+
+    identity ovsdb-bridge-protocol-openflow-13 {
+        description "Ovsdb bridge protocol OpenFlow 1.3";
+        base ovsdb-bridge-protocol-base;
+    }
+
+    identity ovsdb-bridge-protocol-openflow-14 {
+        description "Ovsdb bridge protocol OpenFlow 1.4";
+        base ovsdb-bridge-protocol-base;
+    }
+
+    identity ovsdb-bridge-protocol-openflow-15 {
+        description "Ovsdb bridge protocol OpenFlow 1.5";
+        base ovsdb-bridge-protocol-base;
+    }
+
     grouping ovsdb-bridge-attributes {
         leaf bridge-uuid {
             description "The unique identifier of the bridge";
@@ -61,6 +95,15 @@ module ovsdb {
             description "The name of the bridge";
             type ovsdb-bridge-name;
         }
+        list protocol-entry {
+            key "protocol";
+            leaf protocol {
+                description "Protocol bridge should seek to speak to its controller";
+                type identityref {
+                    base ovsdb-bridge-protocol-base;
+                }
+            }
+        }
 
         leaf datapath-id {
             description "Datapath-id of the bridge";
index b7ff86745839c58f97c262079278e6843f8554c5..5daaf5e0af6a0c60b4523652378939c92efe906f 100644 (file)
@@ -8,11 +8,28 @@
 package org.opendaylight.ovsdb.southbound;
 
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow11;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow12;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow13;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow14;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow15;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 
+import com.google.common.collect.ImmutableBiMap;
+
 public class SouthboundConstants {
     public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
     public static final String OVSDB_URI_PREFIX = "ovsdb";
     public static final String BRIDGE_URI_PREFIX = "bridge";
     public static final Integer DEFAULT_OVSDB_PORT = 6640;
+    public static final ImmutableBiMap<Class<? extends OvsdbBridgeProtocolBase>,String> OVSDB_PROTOCOL_MAP = new ImmutableBiMap.Builder<Class<? extends OvsdbBridgeProtocolBase>,String>()
+            .put(OvsdbBridgeProtocolOpenflow10.class,"OpenFlow10")
+            .put(OvsdbBridgeProtocolOpenflow11.class,"OpenFlow11")
+            .put(OvsdbBridgeProtocolOpenflow12.class,"OpenFlow12")
+            .put(OvsdbBridgeProtocolOpenflow13.class,"OpenFlow13")
+            .put(OvsdbBridgeProtocolOpenflow14.class,"OpenFlow14")
+            .put(OvsdbBridgeProtocolOpenflow15.class,"OpenFlow15")
+            .build();
 }
index f0ce344a4851b78c0beef2d4127cee74da3962f3..16455c1aa9be16e8cdd289b13340b5b7e74e7503 100644 (file)
@@ -11,6 +11,9 @@ import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.opendaylight.ovsdb.lib.OvsdbClient;
@@ -22,9 +25,13 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
+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.OvsdbBridgeName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolBase;
 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.OvsdbNodeAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntryBuilder;
 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.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
@@ -39,6 +46,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableBiMap;
 
 public class SouthboundMapper {
     private static final Logger LOG = LoggerFactory.getLogger(SouthboundMapper.class);
@@ -191,4 +199,32 @@ public class SouthboundMapper {
         }
         return datapath;
     }
+
+    public static Set<String> createOvsdbBridgeProtocols(OvsdbBridgeAugmentation omn) {
+        Set<String> protocols = new HashSet<String>();
+        if(omn.getProtocolEntry() != null && omn.getProtocolEntry().size() > 0) {
+            for(ProtocolEntry protocol : omn.getProtocolEntry()) {
+                if(SouthboundConstants.OVSDB_PROTOCOL_MAP.get(protocol.getProtocol()) != null) {
+                    protocols.add(SouthboundConstants.OVSDB_PROTOCOL_MAP.get(protocol.getProtocol()));
+                } else {
+                    throw new IllegalArgumentException("Unknown protocol " + protocol.getProtocol());
+                }
+            }
+        }
+        return protocols;
+    }
+
+    public static List<ProtocolEntry> createMdsalProtocols(Bridge bridge) {
+        Set<String> protocols = bridge.getProtocolsColumn().getData();
+        List<ProtocolEntry> protocolList = new ArrayList<ProtocolEntry>();
+        if(protocols != null && protocols.size() >0) {
+            ImmutableBiMap<String, Class<? extends OvsdbBridgeProtocolBase>> mapper = SouthboundConstants.OVSDB_PROTOCOL_MAP.inverse();
+            for(String protocol : protocols) {
+                if(protocol != null && mapper.get(protocol) != null) {
+                    protocolList.add(new ProtocolEntryBuilder().setProtocol((Class<? extends OvsdbBridgeProtocolBase>) mapper.get(protocol)).build());
+                }
+            }
+        }
+        return protocolList;
+    }
 }
index 89e517c90d4ea2b5a07f212ce2af3f62df9243a3..68b0ae0e99e6fcf17e28c706cbe416ec632d1dc3 100644 (file)
@@ -18,6 +18,7 @@ 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.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.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -46,6 +47,11 @@ public class BridgeCreateCommand implements TransactCommand {
             Bridge bridge = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Bridge.class);
             bridge.setName(ovsdbManagedNode.getBridgeName().getValue());
             String namedUuid = "Bridge_" + ovsdbManagedNode.getBridgeName().getValue();
+            bridge.setName(ovsdbManagedNode.getBridgeName().getValue());
+            if(SouthboundMapper.createOvsdbBridgeProtocols(ovsdbManagedNode) != null
+                    && SouthboundMapper.createOvsdbBridgeProtocols(ovsdbManagedNode).size() > 0){
+                bridge.setProtocols(SouthboundMapper.createOvsdbBridgeProtocols(ovsdbManagedNode));
+            }
             transaction.add(op.insert(bridge).withId(namedUuid));
 
             // OpenVSwitchPart
index e10b72a5c51d42436ebd44071b11411c6b41a610..f994e08af484626c232caba7f9dd4f647197a5e0 100644 (file)
@@ -64,6 +64,10 @@ public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
                 if(dpid != null) {
                     ovsdbManagedNodeBuilder.setDatapathId(dpid);
                 }
+                if(SouthboundMapper.createMdsalProtocols(bridge) != null
+                        && SouthboundMapper.createMdsalProtocols(bridge).size() > 0) {
+                    ovsdbManagedNodeBuilder.setProtocolEntry(SouthboundMapper.createMdsalProtocols(bridge));
+                }
                 ovsdbManagedNodeBuilder.setManagedBy(new OvsdbNodeRef(nodePath));
                 managedNodeBuilder.addAugmentation(OvsdbBridgeAugmentation.class, ovsdbManagedNodeBuilder.build());