b9bcaeaed6f0b8c9cfb1a85130a2ca907b2e1925
[netvirt.git] / openstack / sfc-translator / impl / src / main / java / org / opendaylight / netvirt / openstack / sfc / translator / OvsdbMdsalHelper.java
1 /*
2  * Copyright (c) 2016 Brocade Communications Systems, 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 package org.opendaylight.netvirt.openstack.sfc.translator;
9
10 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
11 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
12 import org.opendaylight.netvirt.utils.mdsal.utils.MdsalUtils;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds;
19 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
26 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 import java.util.List;
31
32 /**
33  * Utility methods to read OpenDaylight OVSDB models.
34  */
35 public class OvsdbMdsalHelper {
36     private static final Logger LOG = LoggerFactory.getLogger(SfcMdsalHelper.class);
37     private static final String OVSDB_TOPOLOGY_ID = "ovsdb:1";
38     private static final InstanceIdentifier<Topology> topologyPath
39             = InstanceIdentifier.create(NetworkTopology.class)
40             .child(Topology.class, new TopologyKey(new TopologyId(OVSDB_TOPOLOGY_ID)));
41
42     private final DataBroker dataBroker;
43     private final MdsalUtils mdsalUtils;
44
45     public OvsdbMdsalHelper(DataBroker dataBroker) {
46         this.dataBroker = dataBroker;
47         mdsalUtils = new MdsalUtils(this.dataBroker);
48     }
49
50     public Topology getOvsdbTopologyTree() {
51         LOG.info("Reading OVSDB Topolog Tree (ovsdb:1)");
52         return mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, topologyPath);
53     }
54
55     public OvsdbPortMetadata getOvsdbPortMetadata(Uuid ingressPort) {
56         LOG.info("Extract ovsdb port details for neutron port {}", ingressPort.getValue());
57         Topology ovsdbTopology = mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, topologyPath);
58         return getOvsdbPortMetadata(ingressPort, ovsdbTopology);
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 " +
93                                 "for the termination point {}",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 }