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