itm-direct tunnel related changes for scaling
[netvirt.git] / vpnmanager / api / src / main / java / org / opendaylight / netvirt / vpnmanager / api / VpnExtraRouteHelper.java
1 /*
2  * Copyright (c) 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
9 package org.opendaylight.netvirt.vpnmanager.api;
10
11 import static java.util.stream.Collectors.toList;
12
13 import com.google.common.base.Optional;
14
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.concurrent.ExecutionException;
18 import java.util.concurrent.Future;
19
20 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.genius.mdsalutil.MDSALUtil;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.GetTunnelTypeInputBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.GetTunnelTypeOutput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.ExtrarouteRdsMap;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.extraroute.rds.map.ExtrarouteRds;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.extraroute.rds.map.ExtrarouteRdsKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.extraroute.rds.map.extraroute.rds.DestPrefixes;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.extraroute.rds.map.extraroute.rds.DestPrefixesKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.extraroute.rds.map.extraroute.rds.dest.prefixes.AllocatedRds;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.extraroute.rds.map.extraroute.rds.dest.prefixes.AllocatedRdsKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnToExtraroutes;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.Vpn;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.VpnKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.vpn.ExtraRoutes;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.vpn.ExtraRoutesKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.vpn.extra.routes.Routes;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.vpn.extra.routes.RoutesKey;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.opendaylight.yangtools.yang.common.RpcResult;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46 public final class VpnExtraRouteHelper {
47     private static final Logger LOG = LoggerFactory.getLogger(VpnExtraRouteHelper.class);
48
49     private VpnExtraRouteHelper() { }
50
51     public static  List<Routes> getVpnExtraroutes(DataBroker broker, String vpnName, String vpnRd) {
52         InstanceIdentifier<ExtraRoutes> vpnExtraRoutesId = getVpnToExtrarouteIdentifier(vpnName, vpnRd);
53         Optional<ExtraRoutes> vpnOpc = MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, vpnExtraRoutesId);
54         return vpnOpc.isPresent() ? vpnOpc.get().getRoutes() : new ArrayList<>();
55     }
56
57     public static Optional<Routes> getVpnExtraroutes(DataBroker broker, String vpnName,
58                                                      String vpnRd, String destPrefix) {
59         InstanceIdentifier<Routes> vpnExtraRoutesId = getVpnToExtrarouteVrfIdIdentifier(vpnName, vpnRd, destPrefix);
60         return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, vpnExtraRoutesId);
61     }
62
63     public static  InstanceIdentifier<Routes> getVpnToExtrarouteVrfIdIdentifier(String vpnName, String vrfId,
64             String ipPrefix) {
65         return InstanceIdentifier.builder(VpnToExtraroutes.class)
66                 .child(Vpn.class, new VpnKey(vpnName)).child(ExtraRoutes.class,
67                         new ExtraRoutesKey(vrfId)).child(Routes.class, new RoutesKey(ipPrefix)).build();
68     }
69
70     public static  InstanceIdentifier<ExtraRoutes> getVpnToExtrarouteIdentifier(String vpnName, String vrfId) {
71         return InstanceIdentifier.builder(VpnToExtraroutes.class)
72                 .child(Vpn.class, new VpnKey(vpnName)).child(ExtraRoutes.class,
73                         new ExtraRoutesKey(vrfId)).build();
74     }
75
76     public static  InstanceIdentifier<Vpn> getVpnToExtrarouteVpnIdentifier(String vpnName) {
77         return InstanceIdentifier.builder(VpnToExtraroutes.class)
78                 .child(Vpn.class, new VpnKey(vpnName)).build();
79     }
80
81     public static List<Routes> getAllVpnExtraRoutes(DataBroker dataBroker, String vpnName,
82             List<String> usedRds, String destPrefix) {
83         List<Routes> routes = new ArrayList<>();
84         for (String rd : usedRds) {
85             Optional<Routes> extraRouteInfo =
86                     MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
87                             getVpnToExtrarouteVrfIdIdentifier(vpnName, rd, destPrefix));
88             if (extraRouteInfo.isPresent()) {
89                 routes.add(extraRouteInfo.get());
90             }
91         }
92         return routes;
93     }
94
95     public static  List<String> getUsedRds(DataBroker broker, long vpnId, String destPrefix) {
96         InstanceIdentifier<DestPrefixes> usedRdsId = getUsedRdsIdentifier(vpnId, destPrefix);
97         Optional<DestPrefixes> usedRds = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, usedRdsId);
98         return usedRds.isPresent() ? usedRds.get().getAllocatedRds().stream()
99                 .map(AllocatedRds::getRd).distinct().collect(toList()) : new ArrayList<>();
100     }
101
102     public static  InstanceIdentifier<ExtrarouteRds> getUsedRdsIdentifier(long vpnId) {
103         return InstanceIdentifier.builder(ExtrarouteRdsMap.class)
104                 .child(ExtrarouteRds.class, new ExtrarouteRdsKey(vpnId)).build();
105     }
106
107     public static  InstanceIdentifier<DestPrefixes> getUsedRdsIdentifier(long vpnId, String destPrefix) {
108         return InstanceIdentifier.builder(ExtrarouteRdsMap.class)
109                 .child(ExtrarouteRds.class, new ExtrarouteRdsKey(vpnId))
110                 .child(DestPrefixes.class, new DestPrefixesKey(destPrefix)).build();
111     }
112
113     public static  InstanceIdentifier<AllocatedRds> getUsedRdsIdentifier(long vpnId, String destPrefix, String nh) {
114         return InstanceIdentifier.builder(ExtrarouteRdsMap.class)
115                 .child(ExtrarouteRds.class, new ExtrarouteRdsKey(vpnId))
116                 .child(DestPrefixes.class, new DestPrefixesKey(destPrefix))
117                 .child(AllocatedRds.class, new AllocatedRdsKey(nh)).build();
118     }
119
120     public static List<Routes> getAllExtraRoutes(DataBroker broker, String vpnName, String vrfId) {
121         Optional<ExtraRoutes> extraRoutes = MDSALUtil.read(broker,LogicalDatastoreType.OPERATIONAL,
122                 getVpnToExtrarouteIdentifier(vpnName, vrfId));
123         List<Routes> extraRoutesList = new ArrayList<>();
124         if (extraRoutes.isPresent()) {
125             extraRoutesList = extraRoutes.get().getRoutes();
126         }
127         return extraRoutesList;
128     }
129
130     public static Class<? extends TunnelTypeBase> getTunnelType(ItmRpcService itmRpcService, String ifName) {
131         try {
132             Future<RpcResult<GetTunnelTypeOutput>> result =
133                     itmRpcService.getTunnelType(new GetTunnelTypeInputBuilder().setIntfName(ifName).build());
134             RpcResult<GetTunnelTypeOutput> rpcResult = result.get();
135             if (!rpcResult.isSuccessful()) {
136                 LOG.warn("RPC Call to getTunnelInterfaceId returned with Errors {}", rpcResult.getErrors());
137             } else {
138                 return rpcResult.getResult().getTunnelType();
139             }
140         } catch (InterruptedException | ExecutionException e) {
141             LOG.warn("Exception when getting tunnel interface Id for tunnel type", e);
142         }
143         return null;
144     }
145
146     public static java.util.Optional<String> getRdAllocatedForExtraRoute(DataBroker broker,
147             long vpnId, String destPrefix, String nextHop) {
148         InstanceIdentifier<AllocatedRds> usedRdsId = getUsedRdsIdentifier(vpnId, destPrefix, nextHop);
149         return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, usedRdsId)
150                 .toJavaUtil().map(AllocatedRds::getRd);
151     }
152
153     public static List<DestPrefixes> getExtraRouteDestPrefixes(DataBroker broker, Long vpnId) {
154         Optional<ExtrarouteRds> extraRoutes = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION,
155                 getUsedRdsIdentifier(vpnId));
156         return extraRoutes.isPresent() ? extraRoutes.get().getDestPrefixes() : new ArrayList<>();
157     }
158 }