Port sfc-translator to new netvirt.
[netvirt.git] / vpnservice / sfc / translator / src / main / java / org / opendaylight / netvirt / sfc / translator / OvsdbMdsalHelper.java
1 /*
2  * Copyright (c) 2017 Red Hat, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.netvirt.sfc.translator;
10
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;
30
31 /**
32  * Utility methods to read OpenDaylight OVSDB models.
33  */
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)));
40
41     private final DataBroker dataBroker;
42     private final MdsalUtils mdsalUtils;
43
44     public OvsdbMdsalHelper(DataBroker dataBroker) {
45         this.dataBroker = dataBroker;
46         mdsalUtils = new MdsalUtils(this.dataBroker);
47     }
48
49     public Topology getOvsdbTopologyTree() {
50         LOG.info("Reading OVSDB Topolog Tree (ovsdb:1)");
51         return mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, TOPOLOGY_PATH);
52     }
53
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);
58     }
59
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);
78                                     break;
79                                 }
80                             }
81                             if (ovsdbPortMetadata.getOvsdbPort() != null) {
82                                 break;
83                             }
84                         }
85                     }
86                 }
87                 if (ovsdbPortMetadata.getOvsdbPort() != null) {
88                     bridgeAugmentation = node.getAugmentation(OvsdbBridgeAugmentation.class);
89                     if (bridgeAugmentation != null) {
90                         ovsdbPortMetadata.setOvsdbBridgeNode(bridgeAugmentation);
91                     } else {
92                         LOG.warn("Brige augmentation is not present for the termination point {}",
93                             ovsdbPortMetadata.getOvsdbPort());
94                         return null;
95                     }
96                     break;
97                 }
98             }
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);
106                         break;
107                     }
108                 }
109             } else {
110                 LOG.warn("Ovsdb Node not found for ovsdb bridge {}",bridgeAugmentation);
111             }
112
113         } else {
114             LOG.warn("OVSDB Operational topology not avaialble.");
115         }
116         LOG.info("Neutron port's {} respective Ovsdb metadata {}", ingressPort, ovsdbPortMetadata);
117         return ovsdbPortMetadata;
118     }
119
120     public static String getOvsdbPortName(OvsdbTerminationPointAugmentation ovsdbPort) {
121         return ovsdbPort.getName();
122     }
123
124     public static String getNodeIpAddress(OvsdbNodeAugmentation ovsdbNode) {
125         //Currently we support only ipv4
126         return ovsdbNode.getConnectionInfo().getRemoteIp().getIpv4Address().getValue();
127     }
128
129     public static String getNodeKey(InstanceIdentifier<?> node) {
130         return node.firstKeyOf(Node.class).getNodeId().getValue();
131     }
132 }