a55c9e1d026b4535cd115fdac810a64453b55192
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / renderer / hwvtep / utilities / SouthboundUtils.java
1 /*
2  * Copyright (c) 2016, 2017 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.genius.interfacemanager.renderer.hwvtep.utilities;
9
10 import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
11
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.Optional;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.genius.infra.Datastore.Operational;
17 import org.opendaylight.genius.infra.TypedWriteTransaction;
18 import org.opendaylight.genius.interfacemanager.IfmUtil;
19 import org.opendaylight.mdsal.binding.api.DataBroker;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentationBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorRef;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.TunnelsKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.tunnel.attributes.BfdParams;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.tunnel.attributes.BfdParamsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.tunnel.attributes.BfdParamsKey;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50 public final class SouthboundUtils {
51     private static final Logger LOG = LoggerFactory.getLogger(SouthboundUtils.class);
52     private static final Logger EVENT_LOGGER = LoggerFactory.getLogger("GeniusEventLogger");
53
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     public static final String PS_NODE_ID_PREFIX = "/physicalswitch";
60
61     // BFD parameters
62     static final String BFD_PARAM_ENABLE = "enable";
63     static final String BFD_PARAM_MIN_RX = "min_rx";
64     static final String BFD_PARAM_MIN_TX = "min_tx";
65     static final String BFD_PARAM_DECAY_MIN_RX = "decay_min_rx";
66     static final String BFD_PARAM_FORWARDING_IF_RX = "forwarding_if_rx";
67     static final String BFD_PARAM_CPATH_DOWN = "cpath_down";
68     static final String BFD_PARAM_CHECK_TNL_KEY = "check_tnl_key";
69
70     // BFD Local/Remote Configuration parameters
71     static final String BFD_CONFIG_BFD_DST_MAC = "bfd_dst_mac";
72     static final String BFD_CONFIG_BFD_DST_IP = "bfd_dst_ip";
73
74     // BFD parameters
75     private static final String BFD_MIN_RX_VAL = "1000";
76     private static final String BFD_MIN_TX_VAL = "100";
77     private static final String BFD_DECAY_MIN_RX_VAL = "200";
78     private static final String BFD_FORWARDING_IF_RX_VAL = "true";
79     private static final String BFD_CPATH_DOWN_VAL = "false";
80     private static final String BFD_CHECK_TNL_KEY_VAL = "false";
81
82     private SouthboundUtils() {
83
84     }
85
86     public static InstanceIdentifier<Node> createPhysicalSwitchInstanceIdentifier(String psNodeIdString) {
87         NodeId physicalSwitchNodeId = new NodeId(psNodeIdString);
88         InstanceIdentifier<Node> psNodeId = InstanceIdentifier.create(NetworkTopology.class)
89                 .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
90                 .child(Node.class, new NodeKey(physicalSwitchNodeId));
91         return psNodeId;
92     }
93
94     public static InstanceIdentifier<Node> createGlobalNodeInstanceIdentifier(DataBroker dataBroker,
95             String physicalSwitchNodeId) {
96         InstanceIdentifier<Node> psNodeId = InstanceIdentifier.create(NetworkTopology.class)
97                 .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
98                 .child(Node.class, new NodeKey(new NodeId(physicalSwitchNodeId)));
99         Optional<Node> physicalSwitchOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, psNodeId, dataBroker);
100         if (!physicalSwitchOptional.isPresent()) {
101             LOG.debug("physical switch is not present for {}", physicalSwitchNodeId);
102             return null;
103         }
104         Node physicalSwitch = physicalSwitchOptional.get();
105         PhysicalSwitchAugmentation physicalSwitchAugmentation = physicalSwitch
106                 .augmentation(PhysicalSwitchAugmentation.class);
107         return (InstanceIdentifier<Node>) physicalSwitchAugmentation.getManagedBy().getValue();
108     }
109
110     public static @Nullable InstanceIdentifier<Node> createGlobalNodeInstanceIdentifier(String psNodeIdString) {
111         String globalNodeIdStr;
112         try {
113             globalNodeIdStr = psNodeIdString.substring(0, psNodeIdString.indexOf(PS_NODE_ID_PREFIX));
114         } catch (StringIndexOutOfBoundsException ex) {
115             LOG.error("cannot determine global-node-id for the physical node {}", psNodeIdString);
116             return null;
117         }
118         NodeId globalNodeId = new NodeId(globalNodeIdStr);
119         InstanceIdentifier<Node> globalNodeInstanceId = InstanceIdentifier
120             .create(NetworkTopology.class)
121             .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
122             .child(Node.class,new NodeKey(globalNodeId));
123         return globalNodeInstanceId;
124     }
125
126     public static InstanceIdentifier<TerminationPoint> createTEPInstanceIdentifier(InstanceIdentifier<Node> nodeIid,
127             IpAddress ipAddress) {
128         TerminationPointKey localTEP = SouthboundUtils.getTerminationPointKey(ipAddress.getIpv4Address().getValue());
129         return createInstanceIdentifier(nodeIid, localTEP);
130     }
131
132     public static InstanceIdentifier<TerminationPoint> createInstanceIdentifier(InstanceIdentifier<Node> nodeIid,
133             TerminationPointKey tpKey) {
134         return nodeIid.child(TerminationPoint.class, tpKey);
135     }
136
137     public static InstanceIdentifier<Tunnels> createTunnelsInstanceIdentifier(InstanceIdentifier<Node> nodeId,
138             IpAddress localIP, IpAddress remoteIp) {
139         InstanceIdentifier<TerminationPoint> localTEPInstanceIdentifier = createTEPInstanceIdentifier(nodeId, localIP);
140         InstanceIdentifier<TerminationPoint> remoteTEPInstanceIdentifier = createTEPInstanceIdentifier(nodeId,
141                 remoteIp);
142
143         TunnelsKey tunnelsKey = new TunnelsKey(new HwvtepPhysicalLocatorRef(localTEPInstanceIdentifier),
144                 new HwvtepPhysicalLocatorRef(remoteTEPInstanceIdentifier));
145         return InstanceIdentifier.builder(NetworkTopology.class)
146                 .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
147                 .child(Node.class, new NodeKey(nodeId.firstKeyOf(Node.class)))
148                 .augmentation(PhysicalSwitchAugmentation.class).child(Tunnels.class, tunnelsKey).build();
149     }
150
151     public static InstanceIdentifier<Tunnels> createTunnelsInstanceIdentifier(InstanceIdentifier<Node> nodeId,
152             InstanceIdentifier<TerminationPoint> localTEPInstanceIdentifier,
153             InstanceIdentifier<TerminationPoint> remoteTEPInstanceIdentifier) {
154         TunnelsKey tunnelsKey = new TunnelsKey(new HwvtepPhysicalLocatorRef(localTEPInstanceIdentifier),
155                 new HwvtepPhysicalLocatorRef(remoteTEPInstanceIdentifier));
156
157         InstanceIdentifier<Tunnels> tunnelInstanceId = InstanceIdentifier.builder(NetworkTopology.class)
158                 .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID))
159                 .child(Node.class, new NodeKey(nodeId.firstKeyOf(Node.class)))
160                 .augmentation(PhysicalSwitchAugmentation.class).child(Tunnels.class, tunnelsKey).build();
161         return tunnelInstanceId;
162     }
163
164     public static String getTerminationPointKeyString(String ipAddress) {
165         String tpKeyStr = null;
166         if (ipAddress != null) {
167             tpKeyStr = TEP_PREFIX + ipAddress;
168         }
169         return tpKeyStr;
170     }
171
172     public static TerminationPointKey getTerminationPointKey(String ipAddress) {
173         TerminationPointKey tpKey = null;
174         String tpKeyStr = getTerminationPointKeyString(ipAddress);
175         if (tpKeyStr != null) {
176             tpKey = new TerminationPointKey(new TpId(tpKeyStr));
177         }
178         return tpKey;
179     }
180
181     public static void setDstIp(HwvtepPhysicalLocatorAugmentationBuilder tpAugmentationBuilder, IpAddress ipAddress) {
182         IpAddress ip = new IpAddress(ipAddress);
183         tpAugmentationBuilder.setDstIp(ip);
184     }
185
186     public static void addStateEntry(Interface interfaceInfo, IfTunnel ifTunnel,
187             TypedWriteTransaction<Operational> transaction) {
188         LOG.debug("adding tep interface state for {}", interfaceInfo);
189         if (interfaceInfo == null) {
190             return;
191         }
192
193         OperStatus operStatus = OperStatus.Up;
194         AdminStatus adminStatus = AdminStatus.Up;
195         if (!interfaceInfo.isEnabled()) {
196             operStatus = OperStatus.Down;
197         }
198         List<String> childLowerLayerIfList = new ArrayList<>();
199         childLowerLayerIfList.add(0, SouthboundUtils
200                 .getTerminationPointKeyString(ifTunnel.getTunnelDestination().getIpv4Address().getValue()));
201         InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus).setOperStatus(operStatus)
202                 .setLowerLayerIf(childLowerLayerIfList);
203
204         ifaceBuilder.setType(interfaceInfo.getType());
205
206         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
207             .ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId = IfmUtil
208             .buildStateInterfaceId(interfaceInfo.getName());
209         ifaceBuilder.withKey(IfmUtil.getStateInterfaceKeyFromName(interfaceInfo.getName()));
210         transaction.put(ifStateId, ifaceBuilder.build(), CREATE_MISSING_PARENTS);
211         EVENT_LOGGER.info("IFM-TepInterfaceState,ADD {}", interfaceInfo.getName());
212     }
213
214     public static void fillBfdParameters(List<BfdParams> bfdParams, IfTunnel ifTunnel) {
215         setBfdParamForEnable(bfdParams, ifTunnel != null ? ifTunnel.isMonitorEnabled() : true);
216         bfdParams.add(getBfdParams(BFD_PARAM_MIN_TX,
217                 ifTunnel != null ? ifTunnel.getMonitorInterval().toString() : BFD_MIN_TX_VAL));
218         bfdParams.add(getBfdParams(BFD_PARAM_MIN_RX, BFD_MIN_RX_VAL));
219         bfdParams.add(getBfdParams(BFD_PARAM_DECAY_MIN_RX, BFD_DECAY_MIN_RX_VAL));
220         bfdParams.add(getBfdParams(BFD_PARAM_FORWARDING_IF_RX, BFD_FORWARDING_IF_RX_VAL));
221         bfdParams.add(getBfdParams(BFD_PARAM_CPATH_DOWN, BFD_CPATH_DOWN_VAL));
222         bfdParams.add(getBfdParams(BFD_PARAM_CHECK_TNL_KEY, BFD_CHECK_TNL_KEY_VAL));
223     }
224
225     public static void setBfdParamForEnable(List<BfdParams> bfdParams, boolean isEnabled) {
226         bfdParams.add(getBfdParams(BFD_PARAM_ENABLE, Boolean.toString(isEnabled)));
227     }
228
229     public static BfdParams getBfdParams(String key, String value) {
230         return new BfdParamsBuilder().setBfdParamKey(key).withKey(new BfdParamsKey(key)).setBfdParamValue(value)
231             .build();
232     }
233 }