BUG 5044: Neutron vpn should create vpn interface name with tap port name.
[vpnservice.git] / vpnmanager / vpnmanager-impl / src / main / java / org / opendaylight / vpnservice / utilities / 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.vpnservice.utilities;
9
10 import com.google.common.base.Optional;
11
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
14 import org.opendaylight.vpnservice.VpnUtil;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.ServiceBindings;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.ServiceTypeFlowBased;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.StypeOpenflow;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.StypeOpenflowBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.ServicesInfo;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.ServicesInfoKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.services.info.BoundServices;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.services.info.BoundServicesBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.services.info.BoundServicesKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetDpidFromInterfaceInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetDpidFromInterfaceInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetDpidFromInterfaceOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.OdlInterfaceRpcService;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.DpnEndpoints;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.dpn.endpoints.DPNTEPsInfo;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.dpn.endpoints.DPNTEPsInfoKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.opendaylight.yangtools.yang.common.RpcResult;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 import java.math.BigInteger;
44 import java.util.List;
45 import java.util.concurrent.ExecutionException;
46 import java.util.concurrent.Future;
47
48 public class InterfaceUtils {
49   private static final Logger LOG = LoggerFactory.getLogger(InterfaceUtils.class);
50   private static String OF_URI_SEPARATOR = ":";
51
52   public static BigInteger getDpnForInterface(OdlInterfaceRpcService interfaceManagerRpcService, String ifName) {
53     BigInteger nodeId = BigInteger.ZERO;
54     try {
55       GetDpidFromInterfaceInput
56           dpIdInput =
57           new GetDpidFromInterfaceInputBuilder().setIntfName(ifName).build();
58       Future<RpcResult<GetDpidFromInterfaceOutput>>
59           dpIdOutput =
60           interfaceManagerRpcService.getDpidFromInterface(dpIdInput);
61       RpcResult<GetDpidFromInterfaceOutput> dpIdResult = dpIdOutput.get();
62       if (dpIdResult.isSuccessful()) {
63         nodeId = dpIdResult.getResult().getDpid();
64       } else {
65         LOG.error("Could not retrieve DPN Id for interface {}", ifName);
66       }
67     } catch (NullPointerException | InterruptedException | ExecutionException e) {
68       LOG.error("Exception when getting dpn for interface {}", ifName,  e);
69     }
70     return nodeId;
71   }
72
73   public static String getEndpointIpAddressForDPN(DataBroker broker, BigInteger dpnId) {
74     String nextHopIp = null;
75     InstanceIdentifier<DPNTEPsInfo> tunnelInfoId =
76         InstanceIdentifier.builder(DpnEndpoints.class).child(DPNTEPsInfo.class, new DPNTEPsInfoKey(dpnId)).build();
77     Optional<DPNTEPsInfo> tunnelInfo = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, tunnelInfoId);
78     if (tunnelInfo.isPresent()) {
79       List<TunnelEndPoints> nexthopIpList = tunnelInfo.get().getTunnelEndPoints();
80       if (nexthopIpList != null && !nexthopIpList.isEmpty()) {
81         nextHopIp = nexthopIpList.get(0).getIpAddress().getIpv4Address().getValue();
82       }
83     }
84     return nextHopIp;
85   }
86
87   public static InstanceIdentifier<BoundServices> buildServiceId(String vpnInterfaceName, short serviceIndex) {
88     return InstanceIdentifier.builder(ServiceBindings.class).child(ServicesInfo.class, new ServicesInfoKey(vpnInterfaceName))
89         .child(BoundServices.class, new BoundServicesKey(serviceIndex)).build();
90   }
91
92   public static BoundServices getBoundServices(String serviceName, short servicePriority, int flowPriority,
93                                                BigInteger cookie, List<Instruction> instructions) {
94     StypeOpenflowBuilder augBuilder = new StypeOpenflowBuilder().setFlowCookie(cookie).setFlowPriority(flowPriority).setInstruction(instructions);
95     return new BoundServicesBuilder().setKey(new BoundServicesKey(servicePriority))
96         .setServiceName(serviceName).setServicePriority(servicePriority)
97         .setServiceType(ServiceTypeFlowBased.class).addAugmentation(StypeOpenflow.class, augBuilder.build()).build();
98   }
99
100   public static boolean isOperational(DataBroker dataBroker, String ifName) {
101     return getInterfaceStateFromOperDS(dataBroker, ifName) == null ? false : true;
102   }
103
104   public static InstanceIdentifier<Interface> buildStateInterfaceId(String interfaceName) {
105     InstanceIdentifier.InstanceIdentifierBuilder<Interface> idBuilder =
106         InstanceIdentifier.builder(InterfacesState.class)
107             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.class,
108                    new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(interfaceName));
109     InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> id = idBuilder.build();
110     return id;
111   }
112
113   public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface getInterfaceStateFromOperDS(DataBroker dataBroker, String interfaceName) {
114     InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
115         buildStateInterfaceId(interfaceName);
116     Optional<Interface> ifStateOptional =
117         VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, ifStateId);
118     if (ifStateOptional.isPresent()) {
119       return ifStateOptional.get();
120     }
121
122     return null;
123   }
124
125   public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface getInterface(DataBroker broker, String interfaceName) {
126     Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface> optInterface =
127         VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, getInterfaceIdentifier(interfaceName));
128     if(optInterface.isPresent()) {
129       return optInterface.get();
130     }
131     return null;
132   }
133
134   public static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface> getInterfaceIdentifier(String interfaceName) {
135     return InstanceIdentifier.builder(Interfaces.class)
136         .child(
137             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface.class, new InterfaceKey(interfaceName)).build();
138   }
139
140   public static String getDpnFromNodeConnectorId(NodeConnectorId portId) {
141         /*
142          * NodeConnectorId is of form 'openflow:dpnid:portnum'
143          */
144     String[] split = portId.getValue().split(OF_URI_SEPARATOR);
145     return split[1];
146   }
147
148   public static BigInteger getDpIdFromInterface(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState) {
149     String lowerLayerIf = ifState.getLowerLayerIf().get(0);
150     NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf);
151     return new BigInteger(getDpnFromNodeConnectorId(nodeConnectorId));
152   }
153
154 }