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 static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
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;
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");
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";
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";
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";
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";
82 private SouthboundUtils() {
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));
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);
104 Node physicalSwitch = physicalSwitchOptional.get();
105 PhysicalSwitchAugmentation physicalSwitchAugmentation = physicalSwitch
106 .augmentation(PhysicalSwitchAugmentation.class);
107 return (InstanceIdentifier<Node>) physicalSwitchAugmentation.getManagedBy().getValue();
110 public static @Nullable InstanceIdentifier<Node> createGlobalNodeInstanceIdentifier(String psNodeIdString) {
111 String globalNodeIdStr;
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);
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;
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);
132 public static InstanceIdentifier<TerminationPoint> createInstanceIdentifier(InstanceIdentifier<Node> nodeIid,
133 TerminationPointKey tpKey) {
134 return nodeIid.child(TerminationPoint.class, tpKey);
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,
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();
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));
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;
164 public static String getTerminationPointKeyString(String ipAddress) {
165 String tpKeyStr = null;
166 if (ipAddress != null) {
167 tpKeyStr = TEP_PREFIX + ipAddress;
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));
181 public static void setDstIp(HwvtepPhysicalLocatorAugmentationBuilder tpAugmentationBuilder, IpAddress ipAddress) {
182 IpAddress ip = new IpAddress(ipAddress);
183 tpAugmentationBuilder.setDstIp(ip);
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) {
193 OperStatus operStatus = OperStatus.Up;
194 AdminStatus adminStatus = AdminStatus.Up;
195 if (!interfaceInfo.isEnabled()) {
196 operStatus = OperStatus.Down;
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);
204 ifaceBuilder.setType(interfaceInfo.getType());
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());
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));
225 public static void setBfdParamForEnable(List<BfdParams> bfdParams, boolean isEnabled) {
226 bfdParams.add(getBfdParams(BFD_PARAM_ENABLE, Boolean.toString(isEnabled)));
229 public static BfdParams getBfdParams(String key, String value) {
230 return new BfdParamsBuilder().setBfdParamKey(key).withKey(new BfdParamsKey(key)).setBfdParamValue(value)