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";
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";
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();
}
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;
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;
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);
}
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;
+ }
}
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;
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
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());