Fix checkstyle
[netvirt.git] / vpnmanager / api / src / main / java / org / opendaylight / netvirt / vpnmanager / api / InterfaceUtils.java
1 /*
2  * Copyright (c) 2015 - 2016 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.netvirt.vpnmanager.api;
9
10 import com.google.common.base.Optional;
11 import java.math.BigInteger;
12 import java.util.List;
13 import java.util.concurrent.ExecutionException;
14 import java.util.concurrent.Future;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
19 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceInput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceInputBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceBindings;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceModeIngress;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceTypeFlowBased;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.StypeOpenflow;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.StypeOpenflowBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.ServicesInfo;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.ServicesInfoKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpoints;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
45 import org.opendaylight.yangtools.yang.binding.DataObject;
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
47 import org.opendaylight.yangtools.yang.common.RpcResult;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51 public final class InterfaceUtils {
52     private static final Logger LOG = LoggerFactory.getLogger(InterfaceUtils.class);
53     private static String OF_URI_SEPARATOR = ":";
54
55     private InterfaceUtils() {
56
57     }
58
59     public static BigInteger getDpnForInterface(OdlInterfaceRpcService interfaceManagerRpcService, String ifName) {
60         BigInteger nodeId = BigInteger.ZERO;
61         try {
62             GetDpidFromInterfaceInput
63                 dpIdInput =
64                 new GetDpidFromInterfaceInputBuilder().setIntfName(ifName).build();
65             Future<RpcResult<GetDpidFromInterfaceOutput>>
66                 dpIdOutput =
67                 interfaceManagerRpcService.getDpidFromInterface(dpIdInput);
68             RpcResult<GetDpidFromInterfaceOutput> dpIdResult = dpIdOutput.get();
69             if (dpIdResult.isSuccessful()) {
70                 nodeId = dpIdResult.getResult().getDpid();
71             } else {
72                 LOG.info("getDpnForInterface: Could not retrieve DPN Id for interface {}", ifName);
73             }
74         } catch (NullPointerException | InterruptedException | ExecutionException e) {
75             LOG.error("getDpnForInterface: Exception when getting dpn for interface {}", ifName, e);
76         }
77         return nodeId;
78     }
79
80     public static String getEndpointIpAddressForDPN(DataBroker broker, BigInteger 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();
90             }
91         }
92         return nextHopIp;
93     }
94
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();
99     }
100
101     public static BoundServices getBoundServices(String serviceName, short servicePriority, int flowPriority,
102         BigInteger 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();
109     }
110
111     public static boolean isOperational(DataBroker dataBroker, String ifName) {
112         return getInterfaceStateFromOperDS(dataBroker, ifName) != null;
113     }
114
115     public static InstanceIdentifier<Interface> buildStateInterfaceId(String interfaceName) {
116         InstanceIdentifier.InstanceIdentifierBuilder<Interface> idBuilder =
117             InstanceIdentifier.builder(InterfacesState.class)
118                 .child(
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
122                         .state.InterfaceKey(
123                         interfaceName));
124         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
125             .rev140508.interfaces.state.Interface>
126             id = idBuilder.build();
127         return id;
128     }
129
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>
135             ifStateId =
136             buildStateInterfaceId(interfaceName);
137         Optional<Interface> ifStateOptional = read(dataBroker, LogicalDatastoreType.OPERATIONAL, ifStateId);
138         if (ifStateOptional.isPresent()) {
139             return ifStateOptional.get();
140         }
141
142         return null;
143     }
144
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
149             .Interface>
150             optInterface = read(broker, LogicalDatastoreType.CONFIGURATION, getInterfaceIdentifier(interfaceName));
151         if (optInterface.isPresent()) {
152             return optInterface.get();
153         }
154         return null;
155     }
156
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>
161             ifStateId =
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());
168             }
169         }
170         return macAddressOptional;
171     }
172
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());
178         }
179         return macAddressOptional;
180     }
181
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)
186             .child(
187                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
188                     .Interface.class,
189                 new InterfaceKey(interfaceName)).build();
190     }
191
192     public static String getDpnFromNodeConnectorId(NodeConnectorId portId) {
193         /*
194          * NodeConnectorId is of form 'openflow:dpnid:portnum'
195          */
196         String[] split = portId.getValue().split(OF_URI_SEPARATOR);
197         return split[1];
198     }
199
200     public static BigInteger getDpIdFromInterface(
201         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface
202             ifState) {
203         String lowerLayerIf = ifState.getLowerLayerIf().get(0);
204         NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf);
205         return new BigInteger(getDpnFromNodeConnectorId(nodeConnectorId));
206     }
207
208     private static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
209             InstanceIdentifier<T> path) {
210         try {
211             return SingleTransactionDataBroker.syncReadOptional(broker, datastoreType, path);
212         } catch (ReadFailedException e) {
213             throw new RuntimeException(e);
214         }
215     }
216 }