2 * Copyright (c) 2015 - 2016 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.netvirt.vpnmanager.api;
10 import com.google.common.base.Optional;
11 import java.util.List;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.Future;
14 import org.eclipse.jdt.annotation.Nullable;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
18 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceInput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceInputBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceOutput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceBindings;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceModeIngress;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceTypeFlowBased;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.StypeOpenflow;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.StypeOpenflowBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.ServicesInfo;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.ServicesInfoKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpoints;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
44 import org.opendaylight.yangtools.yang.binding.DataObject;
45 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
46 import org.opendaylight.yangtools.yang.common.RpcResult;
47 import org.opendaylight.yangtools.yang.common.Uint64;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
51 public final class InterfaceUtils {
52 private static final Logger LOG = LoggerFactory.getLogger(InterfaceUtils.class);
53 private static String OF_URI_SEPARATOR = ":";
55 private InterfaceUtils() {
59 public static Uint64 getDpnForInterface(OdlInterfaceRpcService interfaceManagerRpcService, String ifName) {
60 Uint64 nodeId = Uint64.ZERO;
62 GetDpidFromInterfaceInput
64 new GetDpidFromInterfaceInputBuilder().setIntfName(ifName).build();
65 Future<RpcResult<GetDpidFromInterfaceOutput>>
67 interfaceManagerRpcService.getDpidFromInterface(dpIdInput);
68 RpcResult<GetDpidFromInterfaceOutput> dpIdResult = dpIdOutput.get();
69 if (dpIdResult.isSuccessful()) {
70 nodeId = dpIdResult.getResult().getDpid();
72 LOG.info("getDpnForInterface: Could not retrieve DPN Id for interface {}", ifName);
74 } catch (NullPointerException | InterruptedException | ExecutionException e) {
75 LOG.error("getDpnForInterface: Exception when getting dpn for interface {}", ifName, e);
80 public static String getEndpointIpAddressForDPN(DataBroker broker, Uint64 dpnId) {
81 String nextHopIp = null;
82 InstanceIdentifier<DPNTEPsInfo> tunnelInfoId =
83 InstanceIdentifier.builder(DpnEndpoints.class).child(DPNTEPsInfo.class,
84 new DPNTEPsInfoKey(dpnId)).build();
85 Optional<DPNTEPsInfo> tunnelInfo = read(broker, LogicalDatastoreType.CONFIGURATION, tunnelInfoId);
86 if (tunnelInfo.isPresent()) {
87 List<TunnelEndPoints> nexthopIpList = tunnelInfo.get().getTunnelEndPoints();
88 if (nexthopIpList != null && !nexthopIpList.isEmpty()) {
89 nextHopIp = nexthopIpList.get(0).getIpAddress().stringValue();
95 public static InstanceIdentifier<BoundServices> buildServiceId(String vpnInterfaceName, short serviceIndex) {
96 return InstanceIdentifier.builder(ServiceBindings.class).child(ServicesInfo.class,
97 new ServicesInfoKey(vpnInterfaceName, ServiceModeIngress.class))
98 .child(BoundServices.class, new BoundServicesKey(serviceIndex)).build();
101 public static BoundServices getBoundServices(String serviceName, short servicePriority, int flowPriority,
102 Uint64 cookie, List<Instruction> instructions) {
103 StypeOpenflowBuilder augBuilder =
104 new StypeOpenflowBuilder().setFlowCookie(cookie).setFlowPriority(flowPriority).setInstruction(instructions);
105 return new BoundServicesBuilder().withKey(new BoundServicesKey(servicePriority))
106 .setServiceName(serviceName).setServicePriority(servicePriority)
107 .setServiceType(ServiceTypeFlowBased.class).addAugmentation(StypeOpenflow.class,
108 augBuilder.build()).build();
111 public static boolean isOperational(DataBroker dataBroker, String ifName) {
112 return getInterfaceStateFromOperDS(dataBroker, ifName) != null;
115 public static InstanceIdentifier<Interface> buildStateInterfaceId(String interfaceName) {
116 InstanceIdentifier.InstanceIdentifierBuilder<Interface> idBuilder =
117 InstanceIdentifier.builder(InterfacesState.class)
119 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
120 .state.Interface.class,
121 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
124 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
125 .rev140508.interfaces.state.Interface>
126 id = idBuilder.build();
130 public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state
131 .@Nullable Interface getInterfaceStateFromOperDS(
132 DataBroker dataBroker, String interfaceName) {
133 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
134 .rev140508.interfaces.state.Interface>
136 buildStateInterfaceId(interfaceName);
137 Optional<Interface> ifStateOptional = read(dataBroker, LogicalDatastoreType.OPERATIONAL, ifStateId);
138 if (ifStateOptional.isPresent()) {
139 return ifStateOptional.get();
145 public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
146 .@Nullable Interface getInterface(
147 DataBroker broker, String interfaceName) {
148 Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
150 optInterface = read(broker, LogicalDatastoreType.CONFIGURATION, getInterfaceIdentifier(interfaceName));
151 if (optInterface.isPresent()) {
152 return optInterface.get();
157 public static Optional<String> getMacAddressForInterface(DataBroker dataBroker, String interfaceName) {
158 Optional<String> macAddressOptional = Optional.absent();
159 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
160 .rev140508.interfaces.state.Interface>
162 buildStateInterfaceId(interfaceName);
163 Optional<Interface> ifStateOptional = read(dataBroker, LogicalDatastoreType.OPERATIONAL, ifStateId);
164 if (ifStateOptional.isPresent()) {
165 PhysAddress macAddress = ifStateOptional.get().getPhysAddress();
166 if (macAddress != null) {
167 macAddressOptional = Optional.of(macAddress.getValue());
170 return macAddressOptional;
173 public static Optional<String> getMacAddressFromInterfaceState(Interface ifState) {
174 Optional<String> macAddressOptional = Optional.absent();
175 PhysAddress macAddress = ifState.getPhysAddress();
176 if (macAddress != null) {
177 macAddressOptional = Optional.of(macAddress.getValue());
179 return macAddressOptional;
182 public static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
183 .rev140508.interfaces.Interface> getInterfaceIdentifier(
184 String interfaceName) {
185 return InstanceIdentifier.builder(Interfaces.class)
187 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
189 new InterfaceKey(interfaceName)).build();
192 public static String getDpnFromNodeConnectorId(NodeConnectorId portId) {
194 * NodeConnectorId is of form 'openflow:dpnid:portnum'
196 String[] split = portId.getValue().split(OF_URI_SEPARATOR);
200 public static Uint64 getDpIdFromInterface(
201 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface
203 String lowerLayerIf = ifState.getLowerLayerIf().get(0);
204 NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf);
205 return Uint64.valueOf(getDpnFromNodeConnectorId(nodeConnectorId)).intern();
208 private static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
209 InstanceIdentifier<T> path) {
211 return SingleTransactionDataBroker.syncReadOptional(broker, datastoreType, path);
212 } catch (ReadFailedException e) {
213 throw new RuntimeException(e);