From 1c5b9d3524c0c780adcb488cbb8b7c0cb95091d1 Mon Sep 17 00:00:00 2001 From: Tony Murray Date: Mon, 19 Feb 2018 09:08:27 -0600 Subject: [PATCH] Fix bgp peers discovery cleanup (#8263) Take context into account, update index for that --- includes/discovery/bgp-peers.inc.php | 41 +++++++++++++++++++++++----- misc/db_schema.yaml | 4 +-- sql-schema/236.sql | 4 +++ 3 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 sql-schema/236.sql diff --git a/includes/discovery/bgp-peers.inc.php b/includes/discovery/bgp-peers.inc.php index a8c5ae54ed..68777ffb7b 100644 --- a/includes/discovery/bgp-peers.inc.php +++ b/includes/discovery/bgp-peers.inc.php @@ -8,7 +8,7 @@ if (Config::get('enable_bgp')) { if (key_exists('vrf_lite_cisco', $device) && (count($device['vrf_lite_cisco'])!=0)) { $vrfs_lite_cisco = $device['vrf_lite_cisco']; } else { - $vrfs_lite_cisco = array(array('context_name'=>null)); + $vrfs_lite_cisco = array(array('context_name'=>'')); } $bgpLocalAs = snmp_getnext($device, 'bgpLocalAs', '-Oqvn', 'BGP4-MIB'); @@ -125,12 +125,16 @@ if (Config::get('enable_bgp')) { } } - $af_query = "SELECT bgpPeerIdentifier, afi, safi FROM bgpPeers_cbgp WHERE `device_id` = '".$device['device_id']."' AND bgpPeerIdentifier = '".$peer['ip']."'"; - foreach (dbFetchRows($af_query) as $entry) { + $af_query = "SELECT bgpPeerIdentifier, afi, safi FROM bgpPeers_cbgp WHERE `device_id`=? AND bgpPeerIdentifier=? AND context_name=?"; + foreach (dbFetchRows($af_query, [$device['device_id'], $peer['ip'], $device['context_name']]) as $entry) { $afi = $entry['afi']; $safi = $entry['safi']; if (!$af_list[$entry['bgpPeerIdentifier']][$afi][$safi]) { - dbDelete('bgpPeers_cbgp', '`device_id` = ? AND `bgpPeerIdentifier` = ? AND afi=? AND safi=?', array($device['device_id'], $peer['ip'], $afi, $safi)); + dbDelete( + 'bgpPeers_cbgp', + '`device_id`=? AND `bgpPeerIdentifier`=? AND context_name=? AND afi=? AND safi=?', + [$device['device_id'], $peer['ip'], $device['context_name'], $afi, $safi] + ); } } } @@ -140,9 +144,13 @@ if (Config::get('enable_bgp')) { unset($j_peerIndexes); } - $params = array_column($peerlist, 'ip'); - $query = 'device_id=? AND bgpPeerIdentifier NOT IN ' . dbGenPlaceholders(count($params)); - array_unshift($params, $device['device_id']); // prepend device_id + // clean up peers + $params = [$device['device_id'], $device['context_name']]; + $query = 'device_id=? AND context_name=?'; + if (!empty($peerlist)) { + $query .= ' AND bgpPeerIdentifier NOT IN ' . dbGenPlaceholders(count($peerlist)); + $params = array_merge($params, array_column($peerlist, 'ip')); + } $deleted = dbDelete('bgpPeers', $query, $params); dbDelete('bgpPeers_cbgp', $query, $params); @@ -156,8 +164,27 @@ if (Config::get('enable_bgp')) { $af_data ); } + + // delete unknown contexts + $contexts = dbFetchColumn( + 'SELECT DISTINCT context_name FROM bgpPeers WHERE device_id=?', + [$device['device_id']] + ); + $existing_contexts = array_column($vrfs_lite_cisco, 'context_name'); + foreach ($contexts as $context) { + if (!in_array($context, $existing_contexts)) { + dbDelete('bgpPeers', 'device_id=? and context_name=?', [$device['device_id'], $context]); + dbDelete('bgpPeers_cbgp', 'device_id=? and context_name=?', [$device['device_id'], $context]); + echo '-'; + } + } + unset( $device['context_name'], + $vrfs_lite_cisco, + $peers_data, + $af_data, + $contexts, $vrfs_c ); } diff --git a/misc/db_schema.yaml b/misc/db_schema.yaml index 0db0c7ab8c..4d6689e849 100644 --- a/misc/db_schema.yaml +++ b/misc/db_schema.yaml @@ -170,7 +170,7 @@ bgpPeers: - { Field: context_name, Type: varchar(128), 'Null': true, Extra: '' } Indexes: PRIMARY: { Name: PRIMARY, Columns: [bgpPeer_id], Unique: true, Type: BTREE } - device_id: { Name: device_id, Columns: [device_id], Unique: false, Type: BTREE } + device_id: { Name: device_id, Columns: [device_id, context_name], Unique: false, Type: BTREE } bgpPeers_cbgp: Columns: - { Field: device_id, Type: int(11), 'Null': false, Extra: '' } @@ -198,7 +198,7 @@ bgpPeers_cbgp: - { Field: context_name, Type: varchar(128), 'Null': true, Extra: '' } Indexes: unique_index: { Name: unique_index, Columns: [device_id, bgpPeerIdentifier, afi, safi], Unique: true, Type: BTREE } - device_id: { Name: device_id, Columns: [device_id, bgpPeerIdentifier], Unique: false, Type: BTREE } + device_id: { Name: device_id, Columns: [device_id, bgpPeerIdentifier, context_name], Unique: false, Type: BTREE } bills: Columns: - { Field: bill_id, Type: int(11), 'Null': false, Extra: auto_increment } diff --git a/sql-schema/236.sql b/sql-schema/236.sql new file mode 100644 index 0000000000..354ccbbe7d --- /dev/null +++ b/sql-schema/236.sql @@ -0,0 +1,4 @@ +DROP INDEX device_id ON bgpPeers; +CREATE INDEX device_id ON bgpPeers (device_id, context_name); +DROP INDEX device_id ON bgpPeers_cbgp; +CREATE INDEX device_id ON bgpPeers_cbgp (device_id, bgpPeerIdentifier, context_name);