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