|
1 | 1 | import socket
|
2 | 2 | from bisect import bisect_right
|
3 | 3 | from sonic_ax_impl import mibs
|
4 |
| -from sonic_ax_impl.lib.perseverantsocket import PerseverantSocket |
5 |
| -from sonic_ax_impl.lib.quaggaclient import QuaggaClient, bgp_peer_tuple |
6 | 4 | from ax_interface import MIBMeta, ValueType, MIBUpdater, SubtreeMIBEntry
|
7 | 5 | from ax_interface.mib import MIBEntry
|
| 6 | +from sonic_ax_impl.mibs import Namespace |
| 7 | +import ipaddress |
| 8 | + |
| 9 | +STATE_CODE = { |
| 10 | + "Idle": 1, |
| 11 | + "Idle (Admin)": 1, |
| 12 | + "Connect": 2, |
| 13 | + "Active": 3, |
| 14 | + "OpenSent": 4, |
| 15 | + "OpenConfirm": 5, |
| 16 | + "Established": 6 |
| 17 | +}; |
| 18 | + |
8 | 19 |
|
9 | 20 | class BgpSessionUpdater(MIBUpdater):
|
10 | 21 | def __init__(self):
|
11 | 22 | super().__init__()
|
12 |
| - self.sock = PerseverantSocket(socket.AF_INET, socket.SOCK_STREAM |
13 |
| - , address_tuple=(QuaggaClient.HOST, QuaggaClient.PORT)) |
14 |
| - self.QuaggaClient = QuaggaClient(self.sock) |
| 23 | + self.db_conn = Namespace.init_namespace_dbs() |
15 | 24 |
|
| 25 | + self.neigh_state_map = {} |
16 | 26 | self.session_status_map = {}
|
17 | 27 | self.session_status_list = []
|
18 | 28 |
|
19 | 29 | def reinit_data(self):
|
20 |
| - if not self.sock.connected: |
21 |
| - try: |
22 |
| - self.sock.reconnect() |
23 |
| - mibs.logger.info('Connected quagga socket') |
24 |
| - except (ConnectionRefusedError, socket.timeout) as e: |
25 |
| - mibs.logger.debug('Failed to connect quagga socket. Retry later...: {}.'.format(e)) |
26 |
| - return |
27 |
| - self.QuaggaClient.auth() |
28 |
| - mibs.logger.info('Authed quagga socket') |
| 30 | + Namespace.connect_all_dbs(self.db_conn, mibs.STATE_DB) |
| 31 | + self.neigh_state_map = Namespace.dbs_keys_namespace(self.db_conn, mibs.STATE_DB, "NEIGH_STATE_TABLE|*") |
29 | 32 |
|
30 | 33 | def update_data(self):
|
31 | 34 | self.session_status_map = {}
|
32 | 35 | self.session_status_list = []
|
33 | 36 |
|
34 |
| - try: |
35 |
| - if not self.sock.connected: |
36 |
| - return |
37 |
| - |
38 |
| - sessions = self.QuaggaClient.union_bgp_sessions() |
39 |
| - |
40 |
| - except (socket.error, socket.timeout) as e: |
41 |
| - self.sock.close() |
42 |
| - mibs.logger.error('Failed to talk with quagga socket. Reconnect later...: {}.'.format(e)) |
43 |
| - return |
44 |
| - except ValueError as e: |
45 |
| - self.sock.close() |
46 |
| - mibs.logger.error('Receive unexpected data from quagga socket. Reconnect later...: {}.'.format(e)) |
47 |
| - return |
48 |
| - |
49 |
| - for nei, ses in sessions.items(): |
50 |
| - oid, status = bgp_peer_tuple(ses) |
51 |
| - if oid is None: continue |
52 |
| - self.session_status_list.append(oid) |
53 |
| - self.session_status_map[oid] = status |
| 37 | + for neigh_key, db_index in self.neigh_state_map.items(): |
| 38 | + neigh_str = neigh_key.decode() |
| 39 | + neigh_str = neigh_str.split('|')[1] |
| 40 | + neigh_info = self.db_conn[db_index].get_all(mibs.STATE_DB, neigh_key, blocking=False) |
| 41 | + if neigh_info is not None: |
| 42 | + state = neigh_info[b'state'].decode() |
| 43 | + ip = ipaddress.ip_address(neigh_str) |
| 44 | + if type(ip) is ipaddress.IPv4Address: |
| 45 | + oid_head = (1, 4) |
| 46 | + else: |
| 47 | + oid_head = (2, 16) |
| 48 | + oid_ip = tuple(i for i in ip.packed) |
| 49 | + |
| 50 | + if state.isdigit(): |
| 51 | + status = 6 |
| 52 | + elif state in STATE_CODE: |
| 53 | + status = STATE_CODE[state] |
| 54 | + else: |
| 55 | + continue |
| 56 | + |
| 57 | + oid = oid_head + oid_ip |
| 58 | + self.session_status_list.append(oid) |
| 59 | + self.session_status_map[oid] = status |
54 | 60 |
|
55 | 61 | self.session_status_list.sort()
|
56 | 62 |
|
|
0 commit comments