2 * Copyright (c) 2016, 2017 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.genius.interfacemanager.renderer.hwvtep.utilities;
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;
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");
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";
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";
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";
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";
80 private SouthboundUtils() {
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));
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);
102 Node physicalSwitch = physicalSwitchOptional.get();
103 PhysicalSwitchAugmentation physicalSwitchAugmentation = physicalSwitch
104 .augmentation(PhysicalSwitchAugmentation.class);
105 return (InstanceIdentifier<Node>) physicalSwitchAugmentation.getManagedBy().getValue();
108 public static @Nullable InstanceIdentifier<Node> createGlobalNodeInstanceIdentifier(String psNodeIdString) {
109 String globalNodeIdStr;
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);
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;
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);
130 public static InstanceIdentifier<TerminationPoint> createInstanceIdentifier(InstanceIdentifier<Node> nodeIid,
131 TerminationPointKey tpKey) {
132 return nodeIid.child(TerminationPoint.class, tpKey);
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,
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();
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));
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;
162 public static String getTerminationPointKeyString(String ipAddress) {
163 String tpKeyStr = null;
164 if (ipAddress != null) {
165 tpKeyStr = TEP_PREFIX + ipAddress;
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));
179 public static void setDstIp(HwvtepPhysicalLocatorAugmentationBuilder tpAugmentationBuilder, IpAddress ipAddress) {
180 IpAddress ip = new IpAddress(ipAddress);
181 tpAugmentationBuilder.setDstIp(ip);
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) {
191 OperStatus operStatus = OperStatus.Up;
192 AdminStatus adminStatus = AdminStatus.Up;
193 if (!interfaceInfo.isEnabled()) {
194 operStatus = OperStatus.Down;
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);
202 ifaceBuilder.setType(interfaceInfo.getType());
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());
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));
223 public static void setBfdParamForEnable(List<BfdParams> bfdParams, boolean isEnabled) {
224 bfdParams.add(getBfdParams(BFD_PARAM_ENABLE, Boolean.toString(isEnabled)));
227 public static BfdParams getBfdParams(String key, String value) {
228 return new BfdParamsBuilder().setBfdParamKey(key).withKey(new BfdParamsKey(key)).setBfdParamValue(value)