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