bd930faf1675b1941698647eb7a01bd3d675ae8b
[netvirt.git] / vpnservice / bgpmanager / bgpmanager-impl / src / main / java / org / opendaylight / netvirt / bgpmanager / oam / BgpAlarms.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.netvirt.bgpmanager.oam;
10
11 import java.io.IOException;
12 import java.util.HashMap;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.TimerTask;
16 import org.opendaylight.netvirt.bgpmanager.BgpConfigurationManager;
17 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 public class BgpAlarms extends TimerTask {
22     private static final Logger LOG = LoggerFactory.getLogger(BgpAlarms.class);
23     private static final BgpJMXAlarmAgent ALARM_AGENT = new BgpJMXAlarmAgent();
24     private static Map<String, String> neighborStatusMap = new HashMap<>();
25     private BgpConfigurationManager bgpMgr;
26
27     private static Map<String, BgpAlarmStatus> neighborsRaisedAlarmStatusMap = new HashMap<>();
28     private static final String ALARM_TEXT = "Bgp Neighbor TCP connection is down";
29
30     @Override
31     public void run() {
32         List<Neighbors> nbrList = null;
33         try {
34             LOG.debug("Fetching neighbor status' from BGP");
35             BgpCounters.resetFile(BgpCounters.BGP_VPNV4_SUMMARY_FILE);
36             BgpCounters.resetFile(BgpCounters.BGP_VPNV6_SUMMARY_FILE);
37             neighborStatusMap.clear();
38
39             if (bgpMgr != null && bgpMgr.getBgpCounters() != null) {
40                 bgpMgr.getBgpCounters().fetchCmdOutputs(BgpCounters.BGP_VPNV4_SUMMARY_FILE,
41                         "show ip bgp vpnv4 all summary");
42                 if (bgpMgr.getConfig() != null) {
43                     nbrList = bgpMgr.getConfig().getNeighbors();
44                 }
45                 BgpCounters.parseIpBgpVpnv4AllSummary(neighborStatusMap);
46
47                 bgpMgr.getBgpCounters().fetchCmdOutputs(BgpCounters.BGP_VPNV6_SUMMARY_FILE,
48                         "show ip bgp vpnv6 all summary");
49
50                 BgpCounters.parseIpBgpVpnv6AllSummary(neighborStatusMap);
51                 processNeighborStatusMap(neighborStatusMap, nbrList, neighborsRaisedAlarmStatusMap);
52             }
53             LOG.debug("Finished getting the status of BGP neighbors");
54         } catch (IOException e) {
55             LOG.error("Failed to publish bgp counters ", e);
56         }
57     }
58
59     public BgpAlarms(BgpConfigurationManager bgpManager) {
60         bgpMgr = bgpManager;
61         ALARM_AGENT.registerMbean();
62         if (bgpMgr != null && bgpMgr.getConfig() != null) {
63             List<Neighbors> nbrs = bgpMgr.getConfig().getNeighbors();
64             if (nbrs != null) {
65                 for (Neighbors nbr : nbrs) {
66                     LOG.trace("Clearing Neighbor DOWN alarm at the startup for Neighbor {}",
67                             nbr.getAddress().getValue());
68                     clearBgpNbrDownAlarm(nbr.getAddress().getValue());
69                     neighborsRaisedAlarmStatusMap.put(nbr.getAddress().getValue(),
70                             BgpAlarmStatus.CLEARED);
71                 }
72             }
73         }
74     }
75
76     private void processNeighborStatusMap(Map<String, String> nbrStatusMap,
77             List<Neighbors> nbrs, Map<String, BgpAlarmStatus>
78             nbrsRaisedAlarmStatusMap) {
79         boolean alarmToRaise;
80         String nbrshipStatus;
81         if ((nbrs == null) || (nbrs.size() == 0)) {
82             LOG.trace("No BGP neighbors configured.");
83             return;
84         }
85         for (Neighbors nbr : nbrs) {
86             alarmToRaise = true;
87             if ((nbrStatusMap != null) && nbrStatusMap.containsKey(nbr.getAddress().getValue())) {
88                 nbrshipStatus = nbrStatusMap.get(nbr.getAddress().getValue());
89                 LOG.trace("nbr {} status {}",
90                         nbr.getAddress().getValue(),
91                         nbrshipStatus);
92                 try {
93                     Integer.parseInt(nbrshipStatus);
94                     alarmToRaise = false;
95                 } catch (NumberFormatException e) {
96                     LOG.trace("Exception thrown in parsing the integers. {}", e);
97                 }
98                 if (alarmToRaise) {
99                     if ((!nbrsRaisedAlarmStatusMap.containsKey(
100                             nbr.getAddress().getValue())) || (nbrsRaisedAlarmStatusMap.get(
101                             nbr.getAddress().getValue()) != BgpAlarmStatus.RAISED)) {
102                         LOG.trace("alarm raised for {}.", nbr.getAddress().getValue());
103                         raiseBgpNbrDownAlarm(nbr.getAddress().getValue());
104                         nbrsRaisedAlarmStatusMap.put(nbr.getAddress().getValue(), BgpAlarmStatus.RAISED);
105                     } else {
106                         LOG.trace("alarm raised already for {}", nbr.getAddress().getValue());
107                     }
108                 } else {
109                     if ((!nbrsRaisedAlarmStatusMap.containsKey(
110                             nbr.getAddress().getValue())) || (nbrsRaisedAlarmStatusMap.get(
111                             nbr.getAddress().getValue()) != BgpAlarmStatus.CLEARED)) {
112                         clearBgpNbrDownAlarm(nbr.getAddress().getValue());
113                         LOG.trace("alarm cleared for {}", nbr.getAddress().getValue());
114                         nbrsRaisedAlarmStatusMap.put(nbr.getAddress().getValue(), BgpAlarmStatus.CLEARED);
115                     } else {
116                         LOG.trace("alarm cleared already for {}", nbr.getAddress().getValue());
117                     }
118                 }
119             }
120         }
121     }
122
123     public void raiseBgpNbrDownAlarm(String nbrIp) {
124
125         StringBuilder source = new StringBuilder();
126         source.append("BGP_Neighbor=").append(nbrIp);
127         if ((nbrIp == null) || (nbrIp.isEmpty())) {
128             return;
129         }
130         LOG.trace("Raising BgpControlPathFailure alarm. {} alarmtext {} ", source, ALARM_TEXT);
131         //Invokes JMX raiseAlarm method
132         ALARM_AGENT.invokeFMraisemethod("BgpControlPathFailure", ALARM_TEXT, source.toString());
133     }
134
135     public void clearBgpNbrDownAlarm(String nbrIp) {
136         StringBuilder source = new StringBuilder();
137         source.append("BGP_Neighbor=").append(nbrIp);
138         if ((nbrIp == null) || (nbrIp.isEmpty())) {
139             return;
140         }
141         LOG.trace("Clearing BgpControlPathFailure alarm of source {} alarmtext {} ", source, ALARM_TEXT);
142         //Invokes JMX clearAlarm method
143         ALARM_AGENT.invokeFMclearmethod("BgpControlPathFailure", ALARM_TEXT, source.toString());
144     }
145 }