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 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;
45 public class BgpManager implements AutoCloseable, IBgpManager {
46 private static final Logger LOG = LoggerFactory.getLogger(BgpManager.class);
47 private final BgpConfigurationManager bcm;
49 private final FibDSWriter fibDSWriter;
50 private final DataBroker dataBroker;
51 private volatile long qbgprestartTS = 0;
54 public BgpManager(final BgpConfigurationManager bcm, final FibDSWriter fibDSWriter, final DataBroker dataBroker) {
56 this.fibDSWriter = fibDSWriter;
57 this.dataBroker = dataBroker;
62 LOG.info("{} start", getClass().getSimpleName());
68 LOG.info("{} close", getClass().getSimpleName());
71 public BgpConfigurationManager getBgpConfigurationManager() {
75 public void configureGR(int stalepathTime) {
76 bcm.addGracefulRestart(stalepathTime);
79 public void delGracefulRestart() {
80 bcm.delGracefulRestart();
83 public void addNeighbor(String ipAddress, long asNum,
84 @Nullable final TcpMd5SignaturePasswordType md5Password) {
85 bcm.addNeighbor(ipAddress, asNum, md5Password);
88 public void addEbgpMultihop(String ipAddress, int nhops) {
89 bcm.addEbgpMultihop(ipAddress, nhops);
92 public void addUpdateSource(String ipAddress, String srcIp) {
93 bcm.addUpdateSource(ipAddress, srcIp);
96 public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) {
97 bcm.addAddressFamily(ipAddress, afi.getValue(), safi.getValue());
100 public void deleteNeighbor(String ipAddress) {
101 bcm.delNeighbor(ipAddress);
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);
111 public void deleteVrf(String rd, boolean removeFibTable, AddressFamily addressFamily) {
113 if (removeFibTable) {
114 LOG.info("deleteVrf: suppressing FIB from rd {} with {}", rd, addressFamily);
115 fibDSWriter.removeVrfSubFamilyFromDS(rd, addressFamily);
117 ret = bcm.delVrf(rd, addressFamily);
118 if (ret && removeFibTable) {
119 fibDSWriter.removeVrfFromDS(rd);
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);
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,
141 public void deletePrefix(String rd, String prefix) {
142 fibDSWriter.removeFibEntryFromDS(rd, prefix);
143 bcm.delPrefix(rd, prefix);
147 public void advertisePrefix(String rd, String macAddress, String prefix, List<String> nextHopList,
148 VrfEntry.EncapType encapType, long vpnLabel, long l3vni, long l2vni,
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);
159 public void advertisePrefix(String rd, String macAddress, String prefix, String nextHop,
160 VrfEntry.EncapType encapType, long vpnLabel, long l3vni, long l2vni,
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);
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);
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>>() {
185 public void onSuccess(@Nonnull Optional<Networks> networks) {
186 if (networks.isPresent()) {
187 withdrawPrefix(rd, prefix);
192 public void onFailure(Throwable throwable) {
193 LOG.warn("withdrwaPrefixIfPresent: Failed to retrieve ebgp networks for rd {} prefix {}",
194 rd, prefix, throwable);
201 public void setQbgpLog(String fileName, String debugLevel) {
202 bcm.addLogging(fileName, debugLevel);
205 public void delLogging() {
209 public void startBgp(long asn, String routerId, int spt, boolean fbit) {
210 bcm.startBgp(asn, routerId, spt, fbit);
213 public void stopBgp() {
217 public void startConfig(String host, int port) {
218 bcm.startConfig(host, port);
221 public void stopConfig() {
225 public Bgp getConfig() {
226 return bcm.getConfig();
230 public void enableMultipath(af_afi afi, af_safi safi) {
231 bcm.setMultipathStatus(afi, safi,true);
234 public void disableMultipath(af_afi afi, af_safi safi) {
235 bcm.setMultipathStatus(afi, safi, false);
238 public void multipaths(String rd, int maxpath) {
239 bcm.multipaths(rd, maxpath);
243 public String getDCGwIP() {
244 Bgp conf = bcm.getConfig();
248 List<Neighbors> nbrs = conf.getNeighbors();
252 return nbrs.get(0).getAddress().getValue();
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.
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.
273 public FibDSWriter getFibWriter() {
277 public String getConfigHost() {
278 return bcm.getConfigHost();
281 public int getConfigPort() {
282 return bcm.getConfigPort();
287 public void bgpRestarted() {
291 public BgpManager getBgpManager() {
295 public boolean isBgpConnected() {
296 return bcm.isBgpConnected();
299 public long getLastConnectedTS() {
300 return bcm.getLastConnectedTS();
303 public long getConnectTS() {
304 return bcm.getConnectTS();
307 public long getStartTS() {
308 return bcm.getStartTS();
311 public long getQbgprestartTS() {
312 return qbgprestartTS;
316 public void setQbgprestartTS(long qbgprestartTS) {
317 this.qbgprestartTS = qbgprestartTS;
320 public long getStaleStartTime() {
321 return bcm.getStaleStartTime();
324 public long getStaleEndTime() {
325 return bcm.getStaleEndTime();
328 public long getCfgReplayStartTime() {
329 return bcm.getCfgReplayStartTime();
332 public long getCfgReplayEndTime() {
333 return bcm.getCfgReplayEndTime();
336 public long getStaleCleanupTime() {
337 return bcm.getStaleCleanupTime();