Adding ITM internal/external tunnel build logic
[vpnservice.git] / itm / itm-impl / src / main / java / org / opendaylight / vpnservice / itm / rpc / ItmManagerRpcService.java
1 /*
2  * Copyright (c) 2015 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.itm.rpc;
9
10 import java.math.BigInteger;
11 import java.util.List;
12 import java.util.concurrent.Future;
13
14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.vpnservice.itm.confighelpers.ItmExternalTunnelAddWorker;
18 import org.opendaylight.vpnservice.itm.impl.ItmUtils;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.op.rev150701.tunnels.DPNTEPsInfo;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.BuildTunnelFromDpnToDcgatewayInput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.BuildTunnelToDcgatewayInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.GetTunnelInterfaceIdInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.GetTunnelInterfaceIdOutput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.GetTunnelInterfaceIdOutputBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.ItmRpcService;
27 import org.opendaylight.yangtools.yang.common.RpcResult;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey;
34
35 import com.google.common.util.concurrent.FutureCallback;
36 import com.google.common.util.concurrent.Futures;
37 import com.google.common.util.concurrent.ListenableFuture;
38 import com.google.common.util.concurrent.SettableFuture;
39
40 import org.opendaylight.yangtools.yang.common.RpcError;
41 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
42
43 import com.google.common.base.Optional;
44
45 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
46
47 public class ItmManagerRpcService implements ItmRpcService {
48
49    private static final Logger LOG = LoggerFactory.getLogger(ItmRpcService.class);
50         DataBroker dataBroker;
51         public ItmManagerRpcService(DataBroker dataBroker) {
52         this.dataBroker = dataBroker;
53     }
54
55      @Override
56      public Future<RpcResult<java.lang.Void>> buildTunnelFromDpnToDcgateway(BuildTunnelFromDpnToDcgatewayInput input) {
57         //Ignore the Futures for now
58          final SettableFuture<RpcResult<Void>> result = SettableFuture.create();
59          ItmExternalTunnelAddWorker.buildTunnelsFromDpnToExternalEndPoint(dataBroker, input.getDpid(), null, input.getDcgwyid());
60          result.set(RpcResultBuilder.<Void>success().build());
61          return result ;
62      }
63
64      @Override
65      public Future<RpcResult<GetTunnelInterfaceIdOutput>> getTunnelInterfaceId(GetTunnelInterfaceIdInput input) {
66          final SettableFuture<RpcResult<GetTunnelInterfaceIdOutput>> result = SettableFuture.create() ;
67          RpcResultBuilder<GetTunnelInterfaceIdOutput> resultBld = null;
68          BigInteger sourceDpn = input.getSourceDpid() ;
69          BigInteger destinationDpn = input.getDestinationDpid() ;
70          String parentName = null;
71          IpAddress srcIp = null ;
72          IpAddress destIp = null ;
73          List<DPNTEPsInfo> meshDpnList = ItmUtils.getTunnelMeshInfo(dataBroker);
74          for ( DPNTEPsInfo dpn : meshDpnList) {
75             if( (dpn.getDPNID()).equals(sourceDpn) ){
76                 parentName  = dpn.getTunnelEndPoints().get(0).getInterfaceName();
77                 srcIp = dpn.getTunnelEndPoints().get(0).getIpAddress() ;
78             }else if( (dpn.getDPNID()).equals(destinationDpn)) {
79                  destIp = dpn.getTunnelEndPoints().get(0).getIpAddress() ;
80             }
81          }
82          if( srcIp != null && destIp != null )
83          {
84               String trunkInterfaceName = ItmUtils.getTrunkInterfaceName(parentName, srcIp.getIpv4Address().getValue(), destIp.getIpv4Address().getValue()) ;
85               InstanceIdentifierBuilder<Interface> idBuilder = InstanceIdentifier.builder(InterfacesState.class)
86                       .child(Interface.class, new InterfaceKey(trunkInterfaceName));
87               InstanceIdentifier<Interface> id = idBuilder.build();
88               Optional<Interface> stateIf = ItmUtils.read(LogicalDatastoreType.OPERATIONAL, id, dataBroker);
89               if(stateIf.isPresent()){
90                   GetTunnelInterfaceIdOutputBuilder output = new GetTunnelInterfaceIdOutputBuilder() ;
91                   output.setInterfaceid(stateIf.get().getIfIndex()) ;
92                   resultBld.withResult(output.build()) ;
93                   result.set(resultBld.build()) ;
94               }else {
95                   result.set(RpcResultBuilder.<GetTunnelInterfaceIdOutput>failed().withError(RpcError.ErrorType.APPLICATION, "Interface Not found ").build()) ;
96               }
97          }else {
98               result.set(RpcResultBuilder.<GetTunnelInterfaceIdOutput>failed().withError(RpcError.ErrorType.APPLICATION, "Source or Destination Dpn Id not found ").build()) ;
99          }
100          return result ;
101      }
102
103      @Override
104      public Future<RpcResult<java.lang.Void>> buildTunnelToDcgateway(BuildTunnelToDcgatewayInput input) {
105          //Ignore the Futures for now
106          final SettableFuture<RpcResult<Void>> result = SettableFuture.create();
107          ItmExternalTunnelAddWorker.buildTunnelsToExternalEndPoint(dataBroker, null, input.getDcgwyid()) ;
108          result.set(RpcResultBuilder.<Void>success().build());
109          return result ;
110      }
111 }