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