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.Manager;
+import org.opendaylight.ovsdb.schema.openvswitch.OpenVSwitch;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeBase;
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.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.ovsdb.bridge.attributes.ControllerEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryBuilder;
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.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfoBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagerEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagerEntryBuilder;
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;
public class SouthboundMapper {
private static final Logger LOG = LoggerFactory.getLogger(SouthboundMapper.class);
+ private static final String N_CONNECTIONS_STR = "n_connections";
private static NodeId createNodeId(OvsdbConnectionInstance client) {
NodeKey key = client.getInstanceIdentifier().firstKeyOf(Node.class, NodeKey.class);
}
public static InstanceIdentifier<Node> createInstanceIdentifier(NodeId nodeId) {
- InstanceIdentifier<Node> nodePath = InstanceIdentifier
+ return InstanceIdentifier
.create(NetworkTopology.class)
.child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
.child(Node.class,new NodeKey(nodeId));
- return nodePath;
}
public static InstanceIdentifier<Node> createInstanceIdentifier(OvsdbConnectionInstance client,Bridge bridge) {
}
public static String createDatapathType(OvsdbBridgeAugmentation mdsalbridge) {
- String datapathtype = new String(SouthboundConstants.DATAPATH_TYPE_MAP.get(DatapathTypeSystem.class));
+ String datapathtype = SouthboundConstants.DATAPATH_TYPE_MAP.get(DatapathTypeSystem.class);
- if (mdsalbridge.getDatapathType() != null) {
- if (SouthboundConstants.DATAPATH_TYPE_MAP.get(mdsalbridge.getDatapathType()) != null) {
- datapathtype = SouthboundConstants.DATAPATH_TYPE_MAP.get(mdsalbridge.getDatapathType());
- } else {
- throw new IllegalArgumentException("Unknown datapath type "
- + SouthboundConstants.DATAPATH_TYPE_MAP.get(mdsalbridge.getDatapathType()));
+ if (mdsalbridge.getDatapathType() != null && !mdsalbridge.getDatapathType().equals(DatapathTypeBase.class)) {
+ datapathtype = SouthboundConstants.DATAPATH_TYPE_MAP.get(mdsalbridge.getDatapathType());
+ if (datapathtype == null) {
+ throw new IllegalArgumentException("Unknown datapath type " + mdsalbridge.getDatapathType().getName());
}
}
return datapathtype;
}
public static Set<String> createOvsdbBridgeProtocols(OvsdbBridgeAugmentation ovsdbBridgeNode) {
- Set<String> protocols = new HashSet<String>();
+ Set<String> protocols = new HashSet<>();
if (ovsdbBridgeNode.getProtocolEntry() != null && ovsdbBridgeNode.getProtocolEntry().size() > 0) {
for (ProtocolEntry protocol : ovsdbBridgeNode.getProtocolEntry()) {
if (SouthboundConstants.OVSDB_PROTOCOL_MAP.get(protocol.getProtocol()) != null) {
try {
protocols = bridge.getProtocolsColumn().getData();
} catch (SchemaVersionMismatchException e) {
- LOG.warn("protocols not supported by this version of ovsdb", e);
+ // We don't care about the exception stack trace here
+ LOG.warn("protocols not supported by this version of ovsdb: {}", e.getMessage());
}
- List<ProtocolEntry> protocolList = new ArrayList<ProtocolEntry>();
+ List<ProtocolEntry> protocolList = new ArrayList<>();
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());
+ setProtocol(mapper.get(protocol)).build());
}
}
}
LOG.debug("createControllerEntries Bridge: {}\n, updatedControllerRows: {}",
bridge, updatedControllerRows);
final Set<UUID> controllerUUIDs = bridge.getControllerColumn().getData();
- final List<ControllerEntry> controllerEntries = new ArrayList<ControllerEntry>();
+ final List<ControllerEntry> controllerEntries = new ArrayList<>();
for (UUID controllerUUID : controllerUUIDs ) {
final Controller controller = updatedControllerRows.get(controllerUUID);
addControllerEntries(controllerEntries, controller);
LOG.debug("createControllerEntries Bridge 2: {}\n, updatedControllerRows: {}",
bridgeNode, updatedControllerRows);
- final List<ControllerEntry> controllerEntriesCreated = new ArrayList<ControllerEntry>();
+ final List<ControllerEntry> controllerEntriesCreated = new ArrayList<>();
final OvsdbBridgeAugmentation ovsdbBridgeAugmentation =
bridgeNode.getAugmentation(OvsdbBridgeAugmentation.class);
if (ovsdbBridgeAugmentation == null) {
public static Map<UUID, Controller> createOvsdbController(OvsdbBridgeAugmentation omn,DatabaseSchema dbSchema) {
List<ControllerEntry> controllerEntries = omn.getControllerEntry();
- Map<UUID,Controller> controllerMap = new HashMap<UUID,Controller>();
+ Map<UUID,Controller> controllerMap = new HashMap<>();
if (controllerEntries != null && !controllerEntries.isEmpty()) {
for (ControllerEntry controllerEntry : controllerEntries) {
String controllerNamedUUID = "Controller_" + getRandomUUID();
connectionInfoBuilder.setRemotePort(connectionInfo.getRemotePort());
return connectionInfoBuilder.build();
}
+
+ /**
+ * Create the {@link ManagerEntry} list given an OVSDB {@link OpenVSwitch}
+ * and {@link Manager} rows.
+ *
+ * @param ovsdbNode the {@link OpenVSwitch} to update
+ * @param updatedManagerRows the list of {@link Manager} managers with updates
+ * @return list of {@link ManagerEntry} entries
+ */
+ public static List<ManagerEntry> createManagerEntries(OpenVSwitch ovsdbNode,
+ Map<UUID, Manager> updatedManagerRows) {
+
+ LOG.debug("createManagerEntries OpenVSwitch: {}\n, updatedManagerRows: {}",
+ ovsdbNode, updatedManagerRows);
+ final Set<UUID> managerUUIDs = ovsdbNode.getManagerOptionsColumn().getData();
+ final List<ManagerEntry> managerEntries = new ArrayList<>();
+ for (UUID managerUUID : managerUUIDs ) {
+ final Manager manager = updatedManagerRows.get(managerUUID);
+ addManagerEntries(managerEntries, manager);
+ }
+ LOG.debug("managerEntries: {}", managerEntries);
+ return managerEntries;
+ }
+
+ /**
+ * Create the {@link ManagerEntry} list given an MDSAL {@link Node} ovsdbNode
+ * and {@link Manager} rows.
+ *
+ * @param ovsdbNode the {@link Node} to update
+ * @param updatedManagerRows the list of {@link Manager} managers with updates
+ * @return list of {@link ManagerEntry} entries
+ */
+ public static List<ManagerEntry> createManagerEntries(Node ovsdbNode,
+ Map<Uri, Manager> updatedManagerRows) {
+
+ LOG.debug("createManagerEntries based on OVSDB Node: {}\n, updatedManagerRows: {}",
+ ovsdbNode, updatedManagerRows);
+ final List<ManagerEntry> managerEntriesCreated = new ArrayList<>();
+ final OvsdbNodeAugmentation ovsdbNodeAugmentation =
+ ovsdbNode.getAugmentation(OvsdbNodeAugmentation.class);
+ if (ovsdbNodeAugmentation == null) {
+ return managerEntriesCreated;
+ }
+
+ final List<ManagerEntry> managerEntries = ovsdbNodeAugmentation.getManagerEntry();
+ if (managerEntries != null) {
+ for (ManagerEntry managerEntry : managerEntries) {
+ final Manager manager = updatedManagerRows.get(managerEntry.getTarget());
+ addManagerEntries(managerEntriesCreated, manager);
+ }
+ }
+ LOG.debug("managerEntries: {}", managerEntriesCreated);
+ return managerEntriesCreated;
+ }
+
+ /**
+ * Add the OVSDB {@link Manager} updates to the MDSAL {@link ManagerEntry} list.
+ *
+ * @param managerEntries the list of {@link ManagerEntry} to update
+ * @param manager the updated OVSDB {@link Manager}
+ */
+ public static void addManagerEntries(List<ManagerEntry> managerEntries,
+ final Manager manager) {
+
+ if (manager != null && manager.getTargetColumn() != null) {
+ long numberOfConnections = 0;
+ final String targetString = manager.getTargetColumn().getData();
+
+ final Map<String, String> statusAttributeMap = manager.getStatusColumn().getData();
+ if (statusAttributeMap.containsKey(N_CONNECTIONS_STR)) {
+ String numberOfConnectionValueStr = statusAttributeMap.get(N_CONNECTIONS_STR);
+ numberOfConnections = Integer.parseInt(numberOfConnectionValueStr);
+ } else {
+ final boolean isConnected = manager.getIsConnectedColumn().getData();
+ if (isConnected) {
+ numberOfConnections = 1;
+ }
+ }
+ managerEntries.add(new ManagerEntryBuilder()
+ .setTarget(new Uri(targetString))
+ .setNumberOfConnections(numberOfConnections)
+ .setConnected(manager.getIsConnectedColumn().getData()).build());
+ }
+ }
+
+ public static InstanceIdentifier<Node> getInstanceIdentifier(OpenVSwitch ovs) {
+ InstanceIdentifier<Node> iid = null;
+ if (ovs.getExternalIdsColumn() != null
+ && ovs.getExternalIdsColumn().getData() != null
+ && ovs.getExternalIdsColumn().getData().containsKey(SouthboundConstants.IID_EXTERNAL_ID_KEY)) {
+ String iidString = ovs.getExternalIdsColumn().getData().get(SouthboundConstants.IID_EXTERNAL_ID_KEY);
+ iid = (InstanceIdentifier<Node>) SouthboundUtil.deserializeInstanceIdentifier(iidString);
+ } else {
+ String nodeString = SouthboundConstants.OVSDB_URI_PREFIX + "://" + SouthboundConstants.UUID + "/"
+ + ovs.getUuid().toString();
+ NodeId nodeId = new NodeId(new Uri(nodeString));
+ NodeKey nodeKey = new NodeKey(nodeId);
+ iid = InstanceIdentifier.builder(NetworkTopology.class)
+ .child(Topology.class,new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
+ .child(Node.class,nodeKey)
+ .build();
+ }
+ return iid;
+ }
}