Merge "L2 Gw create changes related to ITM Tunnels creation in neutronvpn module"
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / renderer / hwvtep / utilities / SouthboundUtils.java
1 /*
2  * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr.renderer.hwvtep.utilities;
9
10 import com.google.common.base.Optional;
11
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.IfmConstants;
16 import org.opendaylight.vpnservice.interfacemgr.IfmUtil;
17 import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.EncapsulationTypeVxlanOverIpv4;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentationBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorRef;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.TunnelsBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.TunnelsKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.tunnel.attributes.*;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.monitor.profiles.MonitorProfile;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
45 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49 import java.util.ArrayList;
50 import java.util.List;
51
52 public class SouthboundUtils {
53     private static final Logger LOG = LoggerFactory.getLogger(SouthboundUtils.class);
54     public static final String HWVTEP_TOPOLOGY = "hwvtep:1";
55     public static final TopologyId HWVTEP_TOPOLOGY_ID = new TopologyId(new Uri(HWVTEP_TOPOLOGY));
56     public static final String TEP_PREFIX = "vxlan_over_ipv4:";
57     public static final String BFD_OP_STATE = "state";
58     public static final String BFD_STATE_UP = "up";
59     // BFD parameters
60     static final String BFD_PARAM_ENABLE = "enable";
61     static final String BFD_PARAM_MIN_RX = "min_rx";
62     static final String BFD_PARAM_MIN_TX = "min_tx";
63     static final String BFD_PARAM_DECAY_MIN_RX = "decay_min_rx";
64     static final String BFD_PARAM_FORWARDING_IF_RX = "forwarding_if_rx";
65     static final String BFD_PARAM_CPATH_DOWN = "cpath_down";
66     static final String BFD_PARAM_CHECK_TNL_KEY = "check_tnl_key";
67
68     // BFD Local/Remote Configuration parameters
69     static final String BFD_CONFIG_BFD_DST_MAC = "bfd_dst_mac";
70     static final String BFD_CONFIG_BFD_DST_IP = "bfd_dst_ip";
71
72     // bfd params
73     private static final String BFD_MIN_RX_VAL = "1000";
74     private static final String BFD_MIN_TX_VAL = "100";
75     private static final String BFD_DECAY_MIN_RX_VAL = "200";
76     private static final String BFD_FORWARDING_IF_RX_VAL = "true";
77     private static final String BFD_CPATH_DOWN_VAL = "false";
78     private static final String BFD_CHECK_TNL_KEY_VAL = "false";
79
80     public static InstanceIdentifier<Node> createPhysicalSwitchInstanceIdentifier(String psNodeIdString) {
81         NodeId physicalSwitchNodeId = new NodeId(psNodeIdString);
82         InstanceIdentifier<Node> psNodeId = InstanceIdentifier
83                 .create(NetworkTopology.class)
84                 .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
85                 .child(Node.class,new NodeKey(physicalSwitchNodeId));
86         return psNodeId;
87     }
88
89     public static InstanceIdentifier<Node> createGlobalNodeInstanceIdentifier(DataBroker dataBroker, String physicalSwitchNodeId) {
90         InstanceIdentifier<Node> psNodeId = InstanceIdentifier
91                 .create(NetworkTopology.class)
92                 .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
93                 .child(Node.class,new NodeKey(new NodeId(physicalSwitchNodeId)));
94         Optional<Node> physicalSwitchOptional =
95                 IfmUtil.read(LogicalDatastoreType.OPERATIONAL, psNodeId, dataBroker);
96         if (!physicalSwitchOptional.isPresent()) {
97             LOG.debug("physical switch is not present for {}", physicalSwitchNodeId);
98             return null;
99         }
100         Node physicalSwitch = physicalSwitchOptional.get();
101         PhysicalSwitchAugmentation physicalSwitchAugmentation = physicalSwitch.getAugmentation(PhysicalSwitchAugmentation.class);
102         return (InstanceIdentifier<Node>) physicalSwitchAugmentation.getManagedBy().getValue();
103     }
104
105     public static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(NodeKey nodekey,
106                                                                                                 String portName){
107         InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
108                 .create(NetworkTopology.class)
109                 .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
110                 .child(Node.class,nodekey)
111                 .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName)));
112
113         LOG.debug("Termination point InstanceIdentifier generated : {}",terminationPointPath);
114         return terminationPointPath;
115     }
116
117     public static InstanceIdentifier<TerminationPoint> createTEPInstanceIdentifier
118             (InstanceIdentifier<Node> nodeIid,  IpAddress ipAddress) {
119         TerminationPointKey localTEP = SouthboundUtils.getTerminationPointKey(ipAddress.getIpv4Address().getValue());
120         return createInstanceIdentifier(nodeIid, localTEP);
121     }
122
123     public static InstanceIdentifier<TerminationPoint> createInstanceIdentifier(InstanceIdentifier<Node> nodeIid,
124                                                                                 TerminationPointKey tpKey) {
125         return nodeIid.child(TerminationPoint.class, tpKey);
126     }
127
128     public static InstanceIdentifier<Tunnels> createTunnelsInstanceIdentifier(InstanceIdentifier<Node> nodeId, IpAddress localIP, IpAddress remoteIp) {
129         InstanceIdentifier<TerminationPoint> localTEPInstanceIdentifier =
130                 createTEPInstanceIdentifier(nodeId, localIP);
131         InstanceIdentifier<TerminationPoint> remoteTEPInstanceIdentifier =
132                 createTEPInstanceIdentifier(nodeId, remoteIp);
133
134         TunnelsKey tunnelsKey = new TunnelsKey(new HwvtepPhysicalLocatorRef(localTEPInstanceIdentifier),
135                 new HwvtepPhysicalLocatorRef(remoteTEPInstanceIdentifier));
136         return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
137                 .child(Node.class, new NodeKey(nodeId.firstKeyOf(Node.class))).augmentation(PhysicalSwitchAugmentation.class)
138                 .child(Tunnels.class, tunnelsKey).build();
139     }
140
141     public static InstanceIdentifier<Tunnels> createTunnelsInstanceIdentifier(InstanceIdentifier<Node> nodeId,
142                                                                               InstanceIdentifier<TerminationPoint> localTEPInstanceIdentifier,
143                                                                               InstanceIdentifier<TerminationPoint> remoteTEPInstanceIdentifier) {
144         TunnelsKey tunnelsKey = new TunnelsKey(new HwvtepPhysicalLocatorRef(localTEPInstanceIdentifier),
145                 new HwvtepPhysicalLocatorRef(remoteTEPInstanceIdentifier));
146         return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
147                 .child(Node.class, new NodeKey(nodeId.firstKeyOf(Node.class))).augmentation(PhysicalSwitchAugmentation.class)
148                 .child(Tunnels.class, tunnelsKey).build();
149     }
150
151     public static String getTerminationPointKeyString(String ipAddress) {
152         String tpKeyStr = null;
153         if(ipAddress != null) {
154             tpKeyStr = new StringBuilder(TEP_PREFIX).
155                     append(ipAddress).toString();
156         }
157         return tpKeyStr;
158     }
159
160     public static TerminationPointKey getTerminationPointKey(String ipAddress) {
161         TerminationPointKey tpKey = null;
162         String tpKeyStr = getTerminationPointKeyString(ipAddress);
163         if(tpKeyStr != null) {
164             tpKey = new TerminationPointKey(new TpId(tpKeyStr));
165         }
166         return tpKey;
167     }
168
169     public static TerminationPoint getTEPFromConfigDS(InstanceIdentifier<TerminationPoint> tpPath,
170                                                       DataBroker dataBroker) {
171         Optional<TerminationPoint> terminationPointOptional =
172                 IfmUtil.read(LogicalDatastoreType.CONFIGURATION, tpPath, dataBroker);
173         if (!terminationPointOptional.isPresent()) {
174             return null;
175         }
176         return terminationPointOptional.get();
177     }
178
179     public static void setDstIp(HwvtepPhysicalLocatorAugmentationBuilder tpAugmentationBuilder, IpAddress ipAddress) {
180         IpAddress ip = new IpAddress(ipAddress);
181         tpAugmentationBuilder.setDstIp(ip);
182     }
183
184     public static void addStateEntry(Interface interfaceInfo,  IfTunnel ifTunnel, WriteTransaction transaction) {
185         LOG.debug("adding tep interface state for {}", interfaceInfo.getName());
186         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus operStatus =
187                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up;
188         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus adminStatus =
189                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Up;
190         if (interfaceInfo != null && !interfaceInfo.isEnabled()) {
191             operStatus = org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Down;
192         }
193         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
194                 IfmUtil.buildStateInterfaceId(interfaceInfo.getName());
195         List<String> childLowerLayerIfList = new ArrayList<>();
196         childLowerLayerIfList.add(0, SouthboundUtils.getTerminationPointKeyString(ifTunnel.getTunnelDestination().getIpv4Address().getValue()));
197         InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus)
198                 .setOperStatus(operStatus).setLowerLayerIf(childLowerLayerIfList);
199
200
201         if(interfaceInfo != null){
202             ifaceBuilder.setType(interfaceInfo.getType());
203         }
204         ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceInfo.getName()));
205         transaction.put(LogicalDatastoreType.OPERATIONAL, ifStateId,ifaceBuilder.build() , true);
206     }
207
208     public static void fillBfdParameters(List<BfdParams> bfdParams, IfTunnel ifTunnel) {
209         setBfdParamForEnable(bfdParams, ifTunnel != null ? ifTunnel.isMonitorEnabled() :true);
210         bfdParams.add(getBfdParams(BFD_PARAM_MIN_TX, ifTunnel != null ?
211                 ifTunnel.getMonitorInterval().toString() : BFD_MIN_TX_VAL));
212         bfdParams.add(getBfdParams(BFD_PARAM_MIN_RX, BFD_MIN_RX_VAL));
213         bfdParams.add(getBfdParams(BFD_PARAM_DECAY_MIN_RX, BFD_DECAY_MIN_RX_VAL));
214         bfdParams.add(getBfdParams(BFD_PARAM_FORWARDING_IF_RX, BFD_FORWARDING_IF_RX_VAL));
215         bfdParams.add(getBfdParams(BFD_PARAM_CPATH_DOWN, BFD_CPATH_DOWN_VAL));
216         bfdParams.add(getBfdParams(BFD_PARAM_CHECK_TNL_KEY, BFD_CHECK_TNL_KEY_VAL));
217     }
218
219     public static void setBfdParamForEnable(List<BfdParams> bfdParams, boolean isEnabled) {
220         bfdParams.add(getBfdParams(BFD_PARAM_ENABLE, Boolean.toString(isEnabled)));
221     }
222
223     public static BfdParams getBfdParams(String key, String value) {
224         return new BfdParamsBuilder().setBfdParamKey(key).setKey(new BfdParamsKey(key))
225                 .setBfdParamValue(value).build();
226     }
227 }