Supply correct tunnel type to retrieve tunnel interface name
[netvirt.git] / fibmanager / impl / src / main / java / org / opendaylight / netvirt / fibmanager / FibManagerImpl.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.fibmanager;
9
10 import com.google.common.base.Optional;
11 import com.google.common.base.Preconditions;
12 import com.google.common.util.concurrent.FutureCallback;
13 import io.netty.util.concurrent.GlobalEventExecutor;
14 import java.math.BigInteger;
15 import java.util.List;
16 import java.util.concurrent.TimeUnit;
17 import javax.inject.Inject;
18 import javax.inject.Singleton;
19 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
20 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
21 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
22 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
23 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
24 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.RouterInterface;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
28 import org.osgi.framework.BundleContext;
29 import org.osgi.util.tracker.ServiceTracker;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 @Singleton
34 public class FibManagerImpl implements IFibManager {
35     private static final Logger LOG = LoggerFactory.getLogger(FibManagerImpl.class);
36     private final NexthopManager nexthopManager;
37     private final VrfEntryListener vrfEntryListener;
38     private IVpnManager vpnmanager;
39     private final FibUtil fibUtil;
40     private final InterVpnLinkCache interVpnLinkCache;
41
42     @Inject
43     public FibManagerImpl(final NexthopManager nexthopManager,
44                           final VrfEntryListener vrfEntryListener,
45                           final BundleContext bundleContext,
46                           final FibUtil fibUtil,
47                           final InterVpnLinkCache interVpnLinkCache) {
48         this.nexthopManager = nexthopManager;
49         this.vrfEntryListener = vrfEntryListener;
50         this.fibUtil = fibUtil;
51         this.interVpnLinkCache = interVpnLinkCache;
52
53         GlobalEventExecutor.INSTANCE.execute(() -> {
54             ServiceTracker<IVpnManager, ?> tracker = null;
55             try {
56                 tracker = new ServiceTracker<>(bundleContext, IVpnManager.class, null);
57                 tracker.open();
58                 vpnmanager = (IVpnManager) tracker.waitForService(TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES));
59                 Preconditions.checkState(vpnmanager != null, "IVpnManager service not found");
60                 LOG.info("FibManagerImpl initialized. IVpnManager={}", vpnmanager);
61             } catch (IllegalStateException | InterruptedException e) {
62                 LOG.error("Error retrieving IVpnManager service", e);
63             } finally {
64                 if (tracker != null) {
65                     tracker.close();
66                 }
67             }
68         });
69     }
70
71     @Override
72     public void populateFibOnNewDpn(BigInteger dpnId, long vpnId, String rd,
73                                     FutureCallback<List<Void>> callback) {
74         vrfEntryListener.populateFibOnNewDpn(dpnId, vpnId, rd, callback);
75     }
76
77     @Override
78     public void populateExternalRoutesOnDpn(BigInteger localDpnId, long vpnId,
79                                             String rd, String localNextHopIp,
80                                             String remoteNextHopIp) {
81         vrfEntryListener.populateExternalRoutesOnDpn(localDpnId, vpnId, rd,
82             localNextHopIp, remoteNextHopIp);
83     }
84
85     @Override
86     public void cleanUpExternalRoutesOnDpn(BigInteger dpnId, long vpnId,
87                                            String rd, String localNextHopIp,
88                                            String remoteNextHopIp) {
89         vrfEntryListener.cleanUpExternalRoutesOnDpn(dpnId, vpnId, rd,
90             localNextHopIp, remoteNextHopIp);
91     }
92
93     @Override
94     public void cleanUpDpnForVpn(BigInteger dpnId, long vpnId, String rd,
95                                  FutureCallback<List<Void>> callback) {
96         vrfEntryListener.cleanUpDpnForVpn(dpnId, vpnId, rd, callback);
97     }
98
99     @Override
100     public void setConfTransType(String service, String transportType) {
101         nexthopManager.setConfTransType(service, transportType);
102     }
103
104     @Override
105     public void writeConfTransTypeConfigDS() {
106         nexthopManager.writeConfTransTypeConfigDS();
107     }
108
109     @Override
110     public String getConfTransType() {
111         return nexthopManager.getConfiguredTransportTypeL3VPN().toString();
112     }
113
114     @Override
115     public String getReqTransType() {
116         return nexthopManager.getReqTransType();
117     }
118
119     @Override
120     public String getTransportTypeStr(String tunType) {
121         return nexthopManager.getTransportTypeStr(tunType);
122     }
123
124     @Override
125     public void manageRemoteRouteOnDPN(boolean action,
126                                        BigInteger dpnId,
127                                        long vpnId,
128                                        String rd,
129                                        String destPrefix,
130                                        String destTepIp,
131                                        long label) {
132         vrfEntryListener.manageRemoteRouteOnDPN(action, dpnId, vpnId, rd, destPrefix, destTepIp, label);
133     }
134
135     @Override
136     public void addOrUpdateFibEntry(String rd, String macAddress, String prefix,
137             List<String> nextHopList, VrfEntry.EncapType encapType, long label,
138             long l3vni, String gwMacAddress, String parentVpnRd, RouteOrigin origin,
139             WriteTransaction writeConfigTxn) {
140         fibUtil.addOrUpdateFibEntry(rd, macAddress, prefix, nextHopList , encapType, label, l3vni, gwMacAddress,
141                 parentVpnRd, origin, writeConfigTxn);
142     }
143
144     @Override
145     public void addFibEntryForRouterInterface(String rd, String prefix,
146             RouterInterface routerInterface, long label,
147             WriteTransaction writeConfigTxn) {
148         fibUtil.addFibEntryForRouterInterface(rd, prefix, routerInterface, label, writeConfigTxn);
149     }
150
151     @Override
152     public void removeOrUpdateFibEntry(String rd, String prefix,
153             String nextHopToRemove, WriteTransaction writeConfigTxn) {
154         fibUtil.removeOrUpdateFibEntry(rd, prefix, nextHopToRemove, writeConfigTxn);
155     }
156
157     @Override
158     public void removeFibEntry(String rd, String prefix, WriteTransaction writeConfigTxn) {
159         fibUtil.removeFibEntry(rd, prefix, writeConfigTxn);
160     }
161
162     @Override
163     public void updateRoutePathForFibEntry(String rd, String prefix, String nextHop,
164             long label, boolean nextHopAdd, WriteTransaction writeConfigTxn) {
165         fibUtil.updateRoutePathForFibEntry(rd, prefix, nextHop, label, nextHopAdd, writeConfigTxn);
166     }
167
168     @Override
169     public void removeVrfTable(String rd, WriteTransaction writeConfigTxn) {
170         fibUtil.removeVrfTable(rd, writeConfigTxn);
171     }
172
173     @Override
174     public void addVrfTable(String rd, WriteTransaction writeConfigTxn) {
175         fibUtil.addVrfTable(rd, writeConfigTxn);
176     }
177
178     @Override
179     public boolean isVPNConfigured() {
180         return this.vpnmanager.isVPNConfigured();
181     }
182
183     @Override
184     public void removeInterVPNLinkRouteFlows(final String interVpnLinkName,
185                                              final boolean isVpnFirstEndPoint,
186                                              final VrfEntry vrfEntry) {
187         Optional<InterVpnLinkDataComposite> optInterVpnLink = interVpnLinkCache.getInterVpnLinkByName(interVpnLinkName);
188         if (!optInterVpnLink.isPresent()) {
189             LOG.warn("Could not find InterVpnLink with name {}. InterVpnLink route flows wont be removed",
190                      interVpnLinkName);
191             return;
192         }
193         InterVpnLinkDataComposite interVpnLink = optInterVpnLink.get();
194         String vpnName = isVpnFirstEndPoint ? interVpnLink.getFirstEndpointVpnUuid().get()
195                                               : interVpnLink.getSecondEndpointVpnUuid().get();
196
197         vrfEntryListener.removeInterVPNLinkRouteFlows(interVpnLink, vpnName, vrfEntry);
198     }
199
200     @Override
201     public void programDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId, String destinationIp,
202                                               int addRemoveOrUpdate, boolean isTunnelUp,
203                                               Class<? extends TunnelTypeBase> tunnelType) {
204         nexthopManager.programDcGwLoadBalancingGroup(availableDcGws, dpnId, destinationIp,
205             addRemoveOrUpdate, isTunnelUp, tunnelType);
206     }
207
208     @Override
209     public void refreshVrfEntry(String rd, String prefix) {
210         vrfEntryListener.refreshFibTables(rd, prefix);
211     }
212 }