2 * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. 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
8 package org.opendaylight.vpnservice.interfacemgr.renderer.ovs.utilities;
10 import com.google.common.collect.Maps;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils;
16 import org.opendaylight.vpnservice.mdsalutil.NwConstants;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.*;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.*;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntry;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.*;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
34 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.utilities.*;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
44 import java.util.ArrayList;
45 import java.util.List;
48 public class SouthboundUtils {
49 private static final Logger LOG = LoggerFactory.getLogger(SouthboundUtils.class);
51 public static final String BFD_PARAM_ENABLE = "enable";
52 public static final String BFD_PARAM_INTERVAL = "min_tx";
54 public static final String BFD_OP_STATE = "state";
55 public static final String BFD_STATE_UP = "up";
57 public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
59 public static void addPortToBridge(InstanceIdentifier<?> bridgeIid, Interface iface,
60 OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
61 String portName, DataBroker dataBroker, List<ListenableFuture<Void>> futures) {
62 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
63 IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class);
64 if (ifTunnel != null) {
65 addTunnelPortToBridge(ifTunnel, bridgeIid, iface, bridgeAugmentation, bridgeName, portName, dataBroker, tx);
67 futures.add(tx.submit());
71 * add all tunnels ports corresponding to the bridge to the topology config DS
73 public static void addAllPortsToBridge(BridgeEntry bridgeEntry, DataBroker dataBroker,
74 InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
75 OvsdbBridgeAugmentation bridgeNew,
76 WriteTransaction writeTransaction){
77 String bridgeName = bridgeNew.getBridgeName().getValue();
78 LOG.debug("adding all ports to bridge: {}", bridgeName);
79 List<BridgeInterfaceEntry> bridgeInterfaceEntries = bridgeEntry.getBridgeInterfaceEntry();
80 for (BridgeInterfaceEntry bridgeInterfaceEntry : bridgeInterfaceEntries) {
81 String portName = bridgeInterfaceEntry.getInterfaceName();
82 InterfaceKey interfaceKey = new InterfaceKey(portName);
83 Interface iface = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker);
84 IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class);
85 if (ifTunnel != null) {
86 addTunnelPortToBridge(ifTunnel, bridgeIid, iface, bridgeNew, bridgeName, portName, dataBroker, writeTransaction);
91 public static void addBridge(InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
92 OvsdbBridgeAugmentation bridgeAugmentation,
93 DataBroker dataBroker, List<ListenableFuture<Void>> futures){
94 LOG.debug("adding bridge: {}", bridgeAugmentation.getBridgeName());
95 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
96 NodeId nodeId = InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)).getNodeId();
97 NodeBuilder bridgeNodeBuilder = new NodeBuilder();
98 bridgeNodeBuilder.setNodeId(nodeId);
99 bridgeNodeBuilder.addAugmentation(OvsdbBridgeAugmentation.class, bridgeAugmentation);
100 tx.put(LogicalDatastoreType.CONFIGURATION, createNodeInstanceIdentifier(nodeId), bridgeNodeBuilder.build(), true);
101 futures.add(tx.submit());
104 public static void deleteBridge(InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
105 DataBroker dataBroker, List<ListenableFuture<Void>> futures){
106 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
107 NodeId nodeId = InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)).getNodeId();
108 tx.delete(LogicalDatastoreType.CONFIGURATION, createNodeInstanceIdentifier(nodeId));
109 futures.add(tx.submit());
112 private static void addVlanPortToBridge(InstanceIdentifier<?> bridgeIid, IfL2vlan ifL2vlan, IfTunnel ifTunnel,
113 OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
114 String portName, DataBroker dataBroker, WriteTransaction t) {
115 if(ifL2vlan.getVlanId() != null) {
116 addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, ifL2vlan.getVlanId().getValue(), null, null,
121 private static void addTunnelPortToBridge(IfTunnel ifTunnel, InstanceIdentifier<?> bridgeIid, Interface iface,
122 OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
123 String portName, DataBroker dataBroker, WriteTransaction t) {
125 LOG.debug("adding tunnel port {} to bridge {}",portName, bridgeName);
127 if (ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeGre.class) ||
128 ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeMplsOverGre.class)) {
129 type = InterfaceTypeGre.class;
130 } else if (ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) {
131 type = InterfaceTypeVxlan.class;
135 LOG.warn("Unknown Tunnel Type obtained while creating interface: {}", iface);
140 IfL2vlan ifL2vlan = iface.getAugmentation(IfL2vlan.class);
141 if (ifL2vlan != null && ifL2vlan.getVlanId() != null) {
142 vlanId = ifL2vlan.getVlanId().getValue();
145 Map<String, String> options = Maps.newHashMap();
146 options.put("key", "flow");
148 IpAddress localIp = ifTunnel.getTunnelSource();
149 options.put("local_ip", localIp.getIpv4Address().getValue());
151 IpAddress remoteIp = ifTunnel.getTunnelDestination();
152 options.put("remote_ip", remoteIp.getIpv4Address().getValue());
154 addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, vlanId, type, options, ifTunnel, t);
157 // Update is allowed only for tunnel monitoring attributes
158 public static void updateBfdParamtersForTerminationPoint(InstanceIdentifier<?> bridgeIid, IfTunnel ifTunnel, String portName,
159 WriteTransaction transaction){
160 if( !ifTunnel.isInternal() && ifTunnel.getTunnelInterfaceType().equals(TunnelTypeVxlan.class) ) {
161 InstanceIdentifier<TerminationPoint> tpIid = createTerminationPointInstanceIdentifier(
162 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), portName);
163 LOG.debug("update bfd parameters for interface {}", tpIid);
164 OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
165 List<InterfaceBfd> bfdParams = getBfdParams(ifTunnel);
166 tpAugmentationBuilder.setInterfaceBfd(bfdParams);
168 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
169 tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
170 tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
172 transaction.merge(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
176 private static void addTerminationPoint(InstanceIdentifier<?> bridgeIid, OvsdbBridgeAugmentation bridgeNode, String bridgeName, String portName, int vlanId, Class type,
177 Map<String, String> options, IfTunnel ifTunnel, WriteTransaction t) {
178 InstanceIdentifier<TerminationPoint> tpIid = createTerminationPointInstanceIdentifier(
179 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), portName);
180 OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
182 tpAugmentationBuilder.setName(portName);
185 tpAugmentationBuilder.setInterfaceType(type);
188 if (options != null) {
189 List<Options> optionsList = new ArrayList<Options>();
190 for (Map.Entry<String, String> entry : options.entrySet()) {
191 OptionsBuilder optionsBuilder = new OptionsBuilder();
192 optionsBuilder.setKey(new OptionsKey(entry.getKey()));
193 optionsBuilder.setOption(entry.getKey());
194 optionsBuilder.setValue(entry.getValue());
195 optionsList.add(optionsBuilder.build());
197 tpAugmentationBuilder.setOptions(optionsList);
201 tpAugmentationBuilder.setVlanMode(OvsdbPortInterfaceAttributes.VlanMode.Access);
202 tpAugmentationBuilder.setVlanTag(new VlanId(vlanId));
206 if( !ifTunnel.isInternal() && ifTunnel.getTunnelInterfaceType().equals(TunnelTypeVxlan.class) ) {
207 List<InterfaceBfd> bfdParams = getBfdParams(ifTunnel);
208 tpAugmentationBuilder.setInterfaceBfd(bfdParams);
211 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
212 tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
213 tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
215 t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
219 private static List<InterfaceBfd> getBfdParams(IfTunnel ifTunnel) {
220 List<InterfaceBfd> bfdParams = new ArrayList<>();
221 bfdParams.add(getIfBfdObj(BFD_PARAM_ENABLE,
222 Boolean.toString(ifTunnel.isMonitorEnabled())));
223 bfdParams.add(getIfBfdObj(BFD_PARAM_INTERVAL,
224 ifTunnel.getMonitorInterval().toString()));
228 private static InterfaceBfd getIfBfdObj(String key, String value) {
229 InterfaceBfdBuilder bfdBuilder = new InterfaceBfdBuilder();
230 bfdBuilder.setBfdKey(key).
231 setKey(new InterfaceBfdKey(key)).setBfdValue(value);
232 return bfdBuilder.build();
235 private static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(Node node,
237 InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
238 .create(NetworkTopology.class)
239 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
240 .child(Node.class,node.getKey())
241 .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName)));
243 LOG.debug("Termination point InstanceIdentifier generated : {}", terminationPointPath);
244 return terminationPointPath;
247 public static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(NodeKey nodekey,
249 InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
250 .create(NetworkTopology.class)
251 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
252 .child(Node.class,nodekey)
253 .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName)));
255 LOG.debug("Termination point InstanceIdentifier generated : {}",terminationPointPath);
256 return terminationPointPath;
259 public static InstanceIdentifier<Node> createNodeInstanceIdentifier(NodeId nodeId) {
260 return InstanceIdentifier
261 .create(NetworkTopology.class)
262 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
263 .child(Node.class,new NodeKey(nodeId));