NETVIRT-1134 : ModifiedNodeDoesNotExistException bgp/networks in CSIT
[netvirt.git] / bgpmanager / impl / src / main / java / org / opendaylight / netvirt / bgpmanager / BgpManager.java
1 /*
2  * Copyright © 2015, 2017 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.bgpmanager;
9
10 import com.google.common.base.Optional;
11 import com.google.common.util.concurrent.FutureCallback;
12 import com.google.common.util.concurrent.Futures;
13 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.Collections;
17 import java.util.List;
18 import javax.annotation.Nonnull;
19 import javax.annotation.Nullable;
20 import javax.annotation.PostConstruct;
21 import javax.annotation.PreDestroy;
22 import javax.inject.Inject;
23 import javax.inject.Singleton;
24 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
25 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
26 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
27 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
28 import org.opendaylight.netvirt.bgpmanager.oam.BgpAlarmErrorCodes;
29 import org.opendaylight.netvirt.bgpmanager.oam.BgpConstants;
30 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_afi;
31 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_safi;
32 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
33 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.AddressFamily;
34 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
35 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.TcpMd5SignaturePasswordType;
36 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors;
37 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Networks;
38 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
40 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43
44 @Singleton
45 public class BgpManager implements AutoCloseable, IBgpManager {
46     private static final Logger LOG = LoggerFactory.getLogger(BgpManager.class);
47     private final BgpConfigurationManager bcm;
48
49     private final FibDSWriter fibDSWriter;
50     private final DataBroker dataBroker;
51     private volatile long qbgprestartTS = 0;
52
53     @Inject
54     public BgpManager(final BgpConfigurationManager bcm, final FibDSWriter fibDSWriter, final DataBroker dataBroker) {
55         this.bcm = bcm;
56         this.fibDSWriter = fibDSWriter;
57         this.dataBroker = dataBroker;
58     }
59
60     @PostConstruct
61     public void init() {
62         LOG.info("{} start", getClass().getSimpleName());
63     }
64
65     @Override
66     @PreDestroy
67     public void close() {
68         LOG.info("{} close", getClass().getSimpleName());
69     }
70
71     public BgpConfigurationManager getBgpConfigurationManager() {
72         return bcm;
73     }
74
75     public void configureGR(int stalepathTime) {
76         bcm.addGracefulRestart(stalepathTime);
77     }
78
79     public void delGracefulRestart() {
80         bcm.delGracefulRestart();
81     }
82
83     public void addNeighbor(String ipAddress, long asNum,
84             @Nullable final TcpMd5SignaturePasswordType md5Password) {
85         bcm.addNeighbor(ipAddress, asNum, md5Password);
86     }
87
88     public void addEbgpMultihop(String ipAddress, int nhops) {
89         bcm.addEbgpMultihop(ipAddress, nhops);
90     }
91
92     public void addUpdateSource(String ipAddress, String srcIp) {
93         bcm.addUpdateSource(ipAddress, srcIp);
94     }
95
96     public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) {
97         bcm.addAddressFamily(ipAddress, afi.getValue(), safi.getValue());
98     }
99
100     public void deleteNeighbor(String ipAddress) {
101         bcm.delNeighbor(ipAddress);
102     }
103
104     @Override
105     public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts,
106             AddressFamily addressFamily) {
107         bcm.addVrf(rd, new ArrayList<>(importRts), new ArrayList<>(exportRts),  addressFamily);
108     }
109
110     @Override
111       public void deleteVrf(String rd, boolean removeFibTable, AddressFamily addressFamily) {
112         boolean ret = false;
113         if (removeFibTable) {
114             LOG.info("deleteVrf: suppressing FIB from rd {} with {}", rd, addressFamily);
115             fibDSWriter.removeVrfSubFamilyFromDS(rd, addressFamily);
116         }
117         ret = bcm.delVrf(rd, addressFamily);
118         if (ret && removeFibTable) {
119             fibDSWriter.removeVrfFromDS(rd);
120         }
121     }
122
123     @Override
124     public void addPrefix(String rd, String macAddress, String prefix, List<String> nextHopList,
125                           VrfEntry.EncapType encapType, int vpnLabel, long l3vni,
126                           String gatewayMac, RouteOrigin origin) {
127         fibDSWriter.addFibEntryToDS(rd, prefix, nextHopList,
128                 encapType, vpnLabel, l3vni, gatewayMac, origin);
129         bcm.addPrefix(rd, macAddress, prefix, nextHopList,
130                 encapType, vpnLabel, l3vni, 0 /*l2vni*/, gatewayMac);
131     }
132
133     @Override
134     public void addPrefix(String rd, String macAddress, String prefix, String nextHop, VrfEntry.EncapType encapType,
135                           int vpnLabel, long l3vni, String gatewayMac, RouteOrigin origin) {
136         addPrefix(rd, macAddress, prefix, Collections.singletonList(nextHop), encapType, vpnLabel, l3vni,
137                 gatewayMac, origin);
138     }
139
140     @Override
141     public void deletePrefix(String rd, String prefix) {
142         fibDSWriter.removeFibEntryFromDS(rd, prefix);
143         bcm.delPrefix(rd, prefix);
144     }
145
146     @Override
147     public void advertisePrefix(String rd, String macAddress, String prefix, List<String> nextHopList,
148                                 VrfEntry.EncapType encapType, long vpnLabel, long l3vni, long l2vni,
149                                 String gatewayMac) {
150         LOG.info("Advertise Prefix: Adding Prefix rd {} prefix {} label {} l3vni {} l2vni {}",
151                 rd, prefix, vpnLabel, l3vni, l2vni);
152         bcm.addPrefix(rd, macAddress, prefix, nextHopList,
153                 encapType, vpnLabel, l3vni, l2vni, gatewayMac);
154         LOG.info("Advertise Prefix: Added Prefix rd {} prefix {} label {} l3vni {} l2vni {}",
155                 rd, prefix, vpnLabel, l3vni, l2vni);
156     }
157
158     @Override
159     public void advertisePrefix(String rd, String macAddress, String prefix, String nextHop,
160                                 VrfEntry.EncapType encapType, long vpnLabel, long l3vni, long l2vni,
161                                 String gatewayMac) {
162         LOG.info("ADVERTISE: Adding Prefix rd {} prefix {} nexthop {} label {} l3vni {} l2vni {}",
163                 rd, prefix, nextHop, vpnLabel, l3vni, l2vni);
164         bcm.addPrefix(rd, macAddress, prefix, Collections.singletonList(nextHop), encapType,
165                 vpnLabel, l3vni, l2vni, gatewayMac);
166         LOG.info("ADVERTISE: Added Prefix rd {} prefix {} nexthop {} label {} l3vni {} l2vni {}",
167                 rd, prefix, nextHop, vpnLabel, l3vni, l2vni);
168     }
169
170     @Override
171     public void withdrawPrefix(String rd, String prefix) {
172         LOG.info("WITHDRAW: Removing Prefix rd {} prefix {}", rd, prefix);
173         bcm.delPrefix(rd, prefix);
174         LOG.info("WITHDRAW: Removed Prefix rd {} prefix {}", rd, prefix);
175     }
176
177     @Override
178     public void withdrawPrefixIfPresent(String rd, String prefix) {
179         InstanceIdentifier<Networks> networksId = InstanceIdentifier.builder(Bgp.class).child(Networks.class,
180                 new NetworksKey(rd, prefix)).build();
181         try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
182             Futures.addCallback(tx.read(LogicalDatastoreType.OPERATIONAL, networksId),
183                 new FutureCallback<Optional<Networks>>() {
184                     @Override
185                     public void onSuccess(@Nonnull Optional<Networks> networks) {
186                         if (networks.isPresent()) {
187                             withdrawPrefix(rd, prefix);
188                         }
189                     }
190
191                     @Override
192                     public void onFailure(Throwable throwable) {
193                         LOG.warn("withdrwaPrefixIfPresent: Failed to retrieve ebgp networks for rd {} prefix {}",
194                                 rd, prefix, throwable);
195                     }
196                 });
197         }
198     }
199
200     @Override
201     public void setQbgpLog(String fileName, String debugLevel) {
202         bcm.addLogging(fileName, debugLevel);
203     }
204
205     public void delLogging() {
206         bcm.delLogging();
207     }
208
209     public void startBgp(long asn, String routerId, int spt, boolean fbit) {
210         bcm.startBgp(asn, routerId, spt, fbit);
211     }
212
213     public void stopBgp() {
214         bcm.stopBgp();
215     }
216
217     public void startConfig(String host, int port) {
218         bcm.startConfig(host, port);
219     }
220
221     public void stopConfig() {
222         bcm.stopConfig();
223     }
224
225     public Bgp getConfig() {
226         return bcm.getConfig();
227     }
228
229
230     public void enableMultipath(af_afi afi, af_safi safi) {
231         bcm.setMultipathStatus(afi, safi,true);
232     }
233
234     public void disableMultipath(af_afi afi, af_safi safi) {
235         bcm.setMultipathStatus(afi, safi, false);
236     }
237
238     public void multipaths(String rd, int maxpath) {
239         bcm.multipaths(rd, maxpath);
240     }
241
242     @Override
243     public String getDCGwIP() {
244         Bgp conf = bcm.getConfig();
245         if (conf == null) {
246             return null;
247         }
248         List<Neighbors> nbrs = conf.getNeighbors();
249         if (nbrs == null) {
250             return null;
251         }
252         return nbrs.get(0).getAddress().getValue();
253     }
254
255     @Override
256     // This method doesn't actually do any real work currently but may at some point so suppress FindBugs violation.
257     @SuppressFBWarnings("UC_USELESS_VOID_METHOD")
258     public synchronized void sendNotificationEvent(int code, int subcode) {
259         if (code != BgpConstants.BGP_NOTIFY_CEASE_CODE) {
260             // CEASE Notifications alone have to be reported to the CBA.
261             // Silently return here. No need to log because tons
262             // of non-alarm notifications will be sent to the SDNc.
263             return;
264         }
265         BgpAlarmErrorCodes errorSubCode = BgpAlarmErrorCodes.checkErrorSubcode(subcode);
266         if (errorSubCode == BgpAlarmErrorCodes.ERROR_IGNORE) {
267             // Need to report only those subcodes, defined in
268             // BgpAlarmErrorCodes enum class.
269             return;
270         }
271     }
272
273     public FibDSWriter getFibWriter() {
274         return fibDSWriter;
275     }
276
277     public String getConfigHost() {
278         return bcm.getConfigHost();
279     }
280
281     public int getConfigPort() {
282         return bcm.getConfigPort();
283     }
284
285
286     @Override
287     public void bgpRestarted() {
288         bcm.bgpRestarted();
289     }
290
291     public BgpManager getBgpManager() {
292         return this;
293     }
294
295     public boolean isBgpConnected() {
296         return bcm.isBgpConnected();
297     }
298
299     public long getLastConnectedTS() {
300         return bcm.getLastConnectedTS();
301     }
302
303     public long getConnectTS() {
304         return bcm.getConnectTS();
305     }
306
307     public long getStartTS() {
308         return bcm.getStartTS();
309     }
310
311     public long getQbgprestartTS() {
312         return qbgprestartTS;
313     }
314
315     @Override
316     public void setQbgprestartTS(long qbgprestartTS) {
317         this.qbgprestartTS = qbgprestartTS;
318     }
319
320     public long getStaleStartTime() {
321         return bcm.getStaleStartTime();
322     }
323
324     public long getStaleEndTime() {
325         return bcm.getStaleEndTime();
326     }
327
328     public long getCfgReplayStartTime() {
329         return bcm.getCfgReplayStartTime();
330     }
331
332     public long getCfgReplayEndTime() {
333         return bcm.getCfgReplayEndTime();
334     }
335
336     public long getStaleCleanupTime() {
337         return bcm.getStaleCleanupTime();
338     }
339
340
341 }