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