2 * Copyright (c) 2017 Red Hat, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.netvirt.sfc.translator;
11 import java.util.List;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
32 * Utility methods to read OpenDaylight OVSDB models.
34 public class OvsdbMdsalHelper {
35 private static final Logger LOG = LoggerFactory.getLogger(SfcMdsalHelper.class);
36 private static final String OVSDB_TOPOLOGY_ID = "ovsdb:1";
37 private static final InstanceIdentifier<Topology> TOPOLOGY_PATH
38 = InstanceIdentifier.create(NetworkTopology.class)
39 .child(Topology.class, new TopologyKey(new TopologyId(OVSDB_TOPOLOGY_ID)));
41 private final DataBroker dataBroker;
42 private final MdsalUtils mdsalUtils;
44 public OvsdbMdsalHelper(DataBroker dataBroker) {
45 this.dataBroker = dataBroker;
46 mdsalUtils = new MdsalUtils(this.dataBroker);
49 public Topology getOvsdbTopologyTree() {
50 LOG.info("Reading OVSDB Topolog Tree (ovsdb:1)");
51 return mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, TOPOLOGY_PATH);
54 public OvsdbPortMetadata getOvsdbPortMetadata(Uuid ingressPort) {
55 LOG.info("Extract ovsdb port details for neutron port {}", ingressPort.getValue());
56 Topology ovsdbTopology = mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, TOPOLOGY_PATH);
57 return getOvsdbPortMetadata(ingressPort, ovsdbTopology);
60 public OvsdbPortMetadata getOvsdbPortMetadata(Uuid ingressPort, Topology ovsdbTopology) {
61 LOG.debug("Extract ovsdb port details for neutron port {} from Topology {}",
62 ingressPort.getValue(), ovsdbTopology);
63 OvsdbPortMetadata ovsdbPortMetadata = new OvsdbPortMetadata();
64 OvsdbBridgeAugmentation bridgeAugmentation = null;
65 if (ovsdbTopology != null) {
66 List<Node> nodes = ovsdbTopology.getNode();
67 for (Node node : nodes) {
68 if (node.getTerminationPoint() != null) {
69 for (TerminationPoint tp : node.getTerminationPoint()) {
70 OvsdbTerminationPointAugmentation tpAugmentation
71 = tp.getAugmentation(OvsdbTerminationPointAugmentation.class);
72 List<InterfaceExternalIds> externalIds = tpAugmentation.getInterfaceExternalIds();
73 if (externalIds != null) {
74 for (InterfaceExternalIds externalId : externalIds) {
75 if (externalId.getExternalIdValue().equals(ingressPort.getValue())) {
76 LOG.info("OVSDB port found for neutron port {} : {}", ingressPort, tpAugmentation);
77 ovsdbPortMetadata.setOvsdbPort(tpAugmentation);
81 if (ovsdbPortMetadata.getOvsdbPort() != null) {
87 if (ovsdbPortMetadata.getOvsdbPort() != null) {
88 bridgeAugmentation = node.getAugmentation(OvsdbBridgeAugmentation.class);
89 if (bridgeAugmentation != null) {
90 ovsdbPortMetadata.setOvsdbBridgeNode(bridgeAugmentation);
92 LOG.warn("Brige augmentation is not present for the termination point {}",
93 ovsdbPortMetadata.getOvsdbPort());
99 OvsdbNodeRef ovsdbNode = bridgeAugmentation.getManagedBy();
100 if (ovsdbNode != null) {
101 NodeKey ovsdbNodeKey = ovsdbNode.getValue().firstKeyOf(Node.class);
102 for (Node node : nodes) {
103 if (node.getKey().equals(ovsdbNodeKey)) {
104 OvsdbNodeAugmentation nodeAugmentation = node.getAugmentation(OvsdbNodeAugmentation.class);
105 ovsdbPortMetadata.setOvsdbNode(nodeAugmentation);
110 LOG.warn("Ovsdb Node not found for ovsdb bridge {}",bridgeAugmentation);
114 LOG.warn("OVSDB Operational topology not avaialble.");
116 LOG.info("Neutron port's {} respective Ovsdb metadata {}", ingressPort, ovsdbPortMetadata);
117 return ovsdbPortMetadata;
120 public static String getOvsdbPortName(OvsdbTerminationPointAugmentation ovsdbPort) {
121 return ovsdbPort.getName();
124 public static String getNodeIpAddress(OvsdbNodeAugmentation ovsdbNode) {
125 //Currently we support only ipv4
126 return ovsdbNode.getConnectionInfo().getRemoteIp().getIpv4Address().getValue();
129 public static String getNodeKey(InstanceIdentifier<?> node) {
130 return node.firstKeyOf(Node.class).getNodeId().getValue();