2 * Copyright © 2015, 2017 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
8 package org.opendaylight.netvirt.bgpmanager;
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;
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;
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;
47 public BgpManager(final DataBroker dataBroker,
48 final BgpConfigurationManager bcm,
49 final BgpAlarmBroadcaster bgpAlarmProducer,
50 final FibDSWriter fibDSWriter) {
51 this.dataBroker = dataBroker;
53 this.qbgpAlarmProducer = bgpAlarmProducer;
54 this.fibDSWriter = fibDSWriter;
58 BgpUtil.setBroker(dataBroker);
59 ConfigureBgpCli.setBgpManager(this);
60 LOG.info("{} start", getClass().getSimpleName());
64 public void close() throws Exception {
65 LOG.info("{} close", getClass().getSimpleName());
68 public void configureGR(int stalepathTime) throws TException {
69 bcm.addGracefulRestart(stalepathTime);
72 public void delGracefulRestart() throws Exception {
73 bcm.delGracefulRestart();
76 public void addNeighbor(String ipAddress, long asNum,
77 @Nullable final TcpMd5SignaturePasswordType md5Password) throws TException {
78 bcm.addNeighbor(ipAddress, asNum, md5Password);
81 public void addEbgpMultihop(String ipAddress, int nhops) throws TException {
82 bcm.addEbgpMultihop(ipAddress, nhops);
85 public void addUpdateSource(String ipAddress, String srcIp) throws TException {
86 bcm.addUpdateSource(ipAddress, srcIp);
89 public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) throws TException {
90 bcm.addAddressFamily(ipAddress, afi.getValue(), safi.getValue());
93 public void deleteNeighbor(String ipAddress) throws TException {
94 bcm.delNeighbor(ipAddress);
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);
104 public void deleteVrf(String rd, boolean removeFibTable) {
105 if (removeFibTable) {
106 fibDSWriter.removeVrfFromDS(rd);
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)
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);
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,
130 public void deletePrefix(String rd, String prefix) {
131 fibDSWriter.removeFibEntryFromDS(rd, prefix);
132 bcm.delPrefix(rd, prefix);
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);
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 {} afi {}",
148 rd, prefix, nextHop, vpnLabel);
149 bcm.addPrefix(rd, macAddress, prefix, Collections.singletonList(nextHop), encapType,
150 vpnLabel, l3vni, l2vni, gatewayMac);
151 LOG.info("ADVERTISE: Added Prefix rd {} prefix {} nexthop {} label {} afi {}",
152 rd, prefix, nextHop, vpnLabel);
156 public void withdrawPrefix(String rd, String prefix) {
157 LOG.info("WITHDRAW: Removing Prefix rd {} prefix {} afi {}", rd, prefix);
158 bcm.delPrefix(rd, prefix);
159 LOG.info("WITHDRAW: Removed Prefix rd {} prefix {} afi {}", rd, prefix);
162 public void setQbgpLog(String fileName, String debugLevel) {
163 bcm.addLogging(fileName, debugLevel);
166 public void delLogging() {
170 public void startBgp(long asn, String routerId, int spt, boolean fbit) {
171 bcm.startBgp(asn, routerId, spt, fbit);
174 public void stopBgp() {
178 public void startConfig(String host, int port) {
179 bcm.startConfig(host, port);
182 public void stopConfig() {
186 public Bgp getConfig() {
187 return bcm.getConfig();
191 public void enableMultipath(af_afi afi, af_safi safi) {
192 bcm.setMultipathStatus(afi, safi,true);
195 public void disableMultipath(af_afi afi, af_safi safi) {
196 bcm.setMultipathStatus(afi, safi, false);
199 public void multipaths(String rd, int maxpath) {
200 bcm.multipaths(rd, maxpath);
204 public String getDCGwIP() {
205 Bgp conf = bcm.getConfig();
209 List<Neighbors> nbrs = conf.getNeighbors();
213 return nbrs.get(0).getAddress().getValue();
216 public synchronized void sendNotificationEvent(String pfx, int code, int subcode) {
217 BgpAlarmErrorCodes errorSubCode;
218 if (code != BgpConstants.BGP_NOTIFY_CEASE_CODE) {
219 // CEASE Notifications alone have to be reported to the CBA.
220 // Silently return here. No need to log because tons
221 // of non-alarm notifications will be sent to the SDNc.
224 errorSubCode = BgpAlarmErrorCodes.checkErrorSubcode(subcode);
225 if (errorSubCode == BgpAlarmErrorCodes.ERROR_IGNORE) {
226 // Need to report only those subcodes, defined in
227 // BgpAlarmErrorCodes enum class.
232 public FibDSWriter getFibWriter() {
236 public String getConfigHost() {
237 return BgpConfigurationManager.getConfigHost();
240 public int getConfigPort() {
241 return BgpConfigurationManager.getConfigPort();
245 public void bgpRestarted() {
249 public BgpManager getBgpManager() {
253 public boolean isBgpConnected() {
254 return bcm.isBgpConnected();
257 public long getLastConnectedTS() {
258 return bcm.getLastConnectedTS();
261 public long getConnectTS() {
262 return bcm.getConnectTS();
265 public long getStartTS() {
266 return bcm.getStartTS();
269 public long getQbgprestartTS() {
270 return qbgprestartTS;
273 public void setQbgprestartTS(long qbgprestartTS) {
274 this.qbgprestartTS = qbgprestartTS;
277 public long getStaleStartTime() {
278 return bcm.getStaleStartTime();
281 public long getStaleEndTime() {
282 return bcm.getStaleEndTime();
285 public long getCfgReplayStartTime() {
286 return bcm.getCfgReplayStartTime();
289 public long getCfgReplayEndTime() {
290 return bcm.getCfgReplayEndTime();
293 public long getStaleCleanupTime() {
294 return bcm.getStaleCleanupTime();