From fb3e1bb6ee8298dbc869b7aa009f09a2e40c8f45 Mon Sep 17 00:00:00 2001 From: Nathan Kamm Date: Tue, 24 Sep 2019 14:22:12 -0700 Subject: [PATCH] Open Source JuniperBGPPlugin --- .../generic/snmp/juniper/bgp/__init__.py | 0 .../bgp/data/devicetype_location_results.json | 219 ++++++++++ .../recording/devicetype_location.snmprec | 39 ++ ..._enrichment_juniper_bgp_session_metrics.py | 61 +++ .../generic/snmp/juniper/bgp/__init__.py | 0 .../snmp/juniper/bgp/data/enrichment_data | 1 + .../juniper/bgp/data/recording/public.snmprec | 39 ++ .../snmp/juniper/bgp/data/results.json | 246 +++++++++++ ...gin_polling_juniper_bgp_session_metrics.py | 60 +++ .../generic/snmp/juniper/bgp/__init__.py | 0 .../plugin_enrichment_bgp_session_metrics.py | 413 ++++++++++++++++++ 11 files changed, 1078 insertions(+) create mode 100644 tests/plugins/enrichment/generic/snmp/juniper/bgp/__init__.py create mode 100644 tests/plugins/enrichment/generic/snmp/juniper/bgp/data/devicetype_location_results.json create mode 100644 tests/plugins/enrichment/generic/snmp/juniper/bgp/data/recording/devicetype_location.snmprec create mode 100644 tests/plugins/enrichment/generic/snmp/juniper/bgp/test_plugin_enrichment_juniper_bgp_session_metrics.py create mode 100644 tests/plugins/polling/generic/snmp/juniper/bgp/__init__.py create mode 100644 tests/plugins/polling/generic/snmp/juniper/bgp/data/enrichment_data create mode 100644 tests/plugins/polling/generic/snmp/juniper/bgp/data/recording/public.snmprec create mode 100644 tests/plugins/polling/generic/snmp/juniper/bgp/data/results.json create mode 100644 tests/plugins/polling/generic/snmp/juniper/bgp/test_plugin_polling_juniper_bgp_session_metrics.py create mode 100644 yahoo_panoptes/plugins/enrichment/generic/snmp/juniper/bgp/__init__.py create mode 100644 yahoo_panoptes/plugins/enrichment/generic/snmp/juniper/bgp/plugin_enrichment_bgp_session_metrics.py diff --git a/tests/plugins/enrichment/generic/snmp/juniper/bgp/__init__.py b/tests/plugins/enrichment/generic/snmp/juniper/bgp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/enrichment/generic/snmp/juniper/bgp/data/devicetype_location_results.json b/tests/plugins/enrichment/generic/snmp/juniper/bgp/data/devicetype_location_results.json new file mode 100644 index 00000000..07503efd --- /dev/null +++ b/tests/plugins/enrichment/generic/snmp/juniper/bgp/data/devicetype_location_results.json @@ -0,0 +1,219 @@ +{ + "enrichment": [ + { + "data": [ + { + "127.0.0.1": { + "metrics_groups": [ + { + "dimensions": { + "bgp_adjacency_subtype": { + "value": "'transit' if 'TRANS' in interface_alias.$index else 'free' if 'FREE' in interface_alias.$index else 'unknown'" + }, + "bgp_adjacency_type": { + "value": "'unknown' if peer_local_as.$index is None or peer_remote_as.$index is None else 'internal' if peer_local_as.$index == peer_remote_as.$index else 'external'" + }, + "interface_alias": { + "value": "interface_alias.$index" + }, + "interface_name": { + "value": "interface_name.$index" + }, + "local_address": { + "value": "local_address.$index" + }, + "peer_address": { + "value": "peer_address.$index" + }, + "peer_external_connection": { + "value": "'ix' if 'IX' in interface_alias.$index else 'pni'" + }, + "peer_local_as": { + "value": "peer_local_as.$index" + }, + "peer_remote_as": { + "value": "peer_remote_as.$index" + } + }, + "group_name": "bgp_session", + "metrics": { + "interface_speed": { + "metric_type": "gauge", + "transform": "lambda x: x * 1000000", + "value": "interface_speed.$index" + }, + "peer_in_updates": { + "metric_type": "counter", + "value": "peer_in_updates.$index" + }, + "peer_out_updates": { + "metric_type": "counter", + "value": "peer_out_updates.$index" + }, + "peer_session_established_time": { + "metric_type": "gauge", + "value": "peer_session_established_time.$index" + }, + "peer_session_transitions": { + "metric_type": "gauge", + "value": "peer_session_transitions.$index" + }, + "peer_state": { + "metric_type": "gauge", + "value": "peer_state.$index" + }, + "peer_status": { + "metric_type": "gauge", + "value": "peer_status.$index" + }, + "prefix_in_prefixes": { + "metric_type": "gauge", + "value": "prefix_in_prefixes.$index" + }, + "prefix_in_prefixes_accepted": { + "metric_type": "gauge", + "value": "prefix_in_prefixes_accepted.$index" + }, + "prefix_in_prefixes_active": { + "metric_type": "gauge", + "value": "prefix_in_prefixes_active.$index" + }, + "prefix_in_prefixes_rejected": { + "metric_type": "gauge", + "value": "prefix_in_prefixes_rejected.$index" + } + } + } + ], + "oids": { + "interface_alias": { + "method": "static", + "values": { + "0.1.44.144.154.142.1.42.7.240.144": "", + "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "" + } + }, + "interface_name": { + "method": "static", + "values": { + "0.1.44.144.154.142.1.42.7.240.144": "xe-1/0/10.0", + "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "xe-11/0/10.0" + } + }, + "interface_speed": { + "method": "static", + "values": { + "0.1.44.144.154.142.1.42.7.240.144": "10000", + "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "10000" + } + }, + "local_address": { + "method": "static", + "values": { + "0.1.44.144.154.142.1.42.7.240.144": "44.144.154.142", + "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "2303:792:11:504:2:372c:0:6" + } + }, + "peer_address": { + "method": "static", + "values": { + "0.1.44.144.154.142.1.42.7.240.144": "42.7.240.144", + "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "2131:7fa:4011:4:5000:2a:400:5001" + } + }, + "peer_in_updates": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.1.1.1" + }, + "peer_index": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14" + }, + "peer_local_as": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.9" + }, + "peer_out_updates": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.1.1.2" + }, + "peer_remote_as": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13" + }, + "peer_session_established_time": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.4.1.1.1" + }, + "peer_session_transitions": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.1.1.5" + }, + "peer_state": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2" + }, + "peer_status": { + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.3" + }, + "prefix_in_prefixes": { + "index_transform": { + "154.1.1": "0.1.44.144.154.142.1.42.7.240.144", + "223.2.1": "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1" + }, + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.2.1.7" + }, + "prefix_in_prefixes_accepted": { + "index_transform": { + "154.1.1": "0.1.44.144.154.142.1.42.7.240.144", + "223.2.1": "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1" + }, + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.2.1.8" + }, + "prefix_in_prefixes_active": { + "index_transform": { + "154.1.1": "0.1.44.144.154.142.1.42.7.240.144", + "223.2.1": "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1" + }, + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.2.1.11" + }, + "prefix_in_prefixes_rejected": { + "index_transform": { + "154.1.1": "0.1.44.144.154.142.1.42.7.240.144", + "223.2.1": "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1" + }, + "method": "bulk_walk", + "oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.2.1.9" + } + } + } + } + ], + "metadata": { + "_enrichment_group_creation_timestamp": 1512629517.03121, + "_enrichment_ttl": 300, + "_execute_frequency": 60 + }, + "namespace": "metrics" + } + ], + "enrichment_group_set_creation_timestamp": 1512629517.03121, + "resource": { + "resource_class": "network", + "resource_creation_timestamp": 1512629517.03121, + "resource_endpoint": "127.0.0.1", + "resource_id": "test_id", + "resource_metadata": { + "_resource_ttl": "604800", + "model": "model" + }, + "resource_plugin": "dummy", + "resource_site": "test_site", + "resource_subclass": "test_subclass", + "resource_type": "test_type" + } +} \ No newline at end of file diff --git a/tests/plugins/enrichment/generic/snmp/juniper/bgp/data/recording/devicetype_location.snmprec b/tests/plugins/enrichment/generic/snmp/juniper/bgp/data/recording/devicetype_location.snmprec new file mode 100644 index 00000000..58ea24ad --- /dev/null +++ b/tests/plugins/enrichment/generic/snmp/juniper/bgp/data/recording/devicetype_location.snmprec @@ -0,0 +1,39 @@ +1.3.6.1.2.1.4.35.1.7.670.1.4.42.7.240.144|2|6 +1.3.6.1.2.1.4.35.1.7.670.1.4.44.144.154.142|2|6 +1.3.6.1.2.1.4.35.1.7.683.2.16.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|2|1 +1.3.6.1.2.1.4.35.1.7.683.2.16.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6|2|1 +1.3.6.1.2.1.31.1.1.1.1.670|4x|78652d312f302f31302e30 +1.3.6.1.2.1.31.1.1.1.1.683|4x|78652d31312f302f31302e30 +1.3.6.1.2.1.31.1.1.1.15.670|66|10000 +1.3.6.1.2.1.31.1.1.1.15.683|66|10000 +1.3.6.1.2.1.31.1.1.1.18.670|4| +1.3.6.1.2.1.31.1.1.1.18.683|4| +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2.0.1.44.144.154.142.1.42.7.240.144|2|6 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|2|6 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.3.0.1.44.144.154.142.1.42.7.240.144|2|2 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.3.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|2|2 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.9.0.1.44.144.154.142.1.42.7.240.144|66|17457 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.9.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|66|17457 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.11.0.1.44.144.154.142.1.42.7.240.144|4x|2A07F090 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.11.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|4x|213107fa401100045000002a04005001 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13.0.1.44.144.154.142.1.42.7.240.144|66|63956 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|66|42 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14.0.1.44.144.154.142.1.42.7.240.144|66|154 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|66|223 +1.3.6.1.4.1.2636.5.1.1.2.4.1.1.1.0.1.44.144.154.142.1.42.7.240.144|66|7775535 +1.3.6.1.4.1.2636.5.1.1.2.4.1.1.1.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|66|556929 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.1.0.1.44.144.154.142.1.42.7.240.144|65|126349 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.1.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|65|10 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.2.0.1.44.144.154.142.1.42.7.240.144|65|0 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.2.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|65|9 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.5.0.1.44.144.154.142.1.42.7.240.144|65|4 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.5.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|65|1 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.7.154.1.1|66|403 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.7.223.2.1|66|152 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.8.154.1.1|66|0 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.8.223.2.1|66|152 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.9.154.1.1|66|403 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.9.223.2.1|66|0 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.11.154.1.1|66|0 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.11.223.2.1|66|152 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.12.397.1.1|66|55028 \ No newline at end of file diff --git a/tests/plugins/enrichment/generic/snmp/juniper/bgp/test_plugin_enrichment_juniper_bgp_session_metrics.py b/tests/plugins/enrichment/generic/snmp/juniper/bgp/test_plugin_enrichment_juniper_bgp_session_metrics.py new file mode 100644 index 00000000..7e24142f --- /dev/null +++ b/tests/plugins/enrichment/generic/snmp/juniper/bgp/test_plugin_enrichment_juniper_bgp_session_metrics.py @@ -0,0 +1,61 @@ +import unittest +import os + +from yahoo_panoptes.plugins.enrichment.generic.snmp.juniper.bgp.plugin_enrichment_bgp_session_metrics import \ + JuniperBGPInfoPluginEnrichmentMetrics + +from tests.plugins.helpers import setup_module_default, tear_down_module_default, \ + SNMPEnrichmentPluginTestFramework +from mock import * + +pwd = os.path.dirname(os.path.abspath(__file__)) +mock_time = Mock() +mock_time.return_value = 1512629517.03121 + +mock_total_single_ports_oid = Mock() +mock_total_single_ports_oid.return_value = None + +mock_source_pools = Mock() +mock_source_pools.return_value = None + +mock_routing_engines = Mock() +mock_routing_engines.return_value = None + + +def setUpModule(): + return setup_module_default(plugin_pwd=pwd) + + +def tearDownModule(): + return tear_down_module_default() + + +class TestPluginJuniperBGPDeviceMetricsEnrichment(SNMPEnrichmentPluginTestFramework, unittest.TestCase): + """ + Test Juniper BGP Metrics + + Note: + 44.144.154.142 + 42.7.240.144 + 2131:7fa:4011:4:5000:2a:400:5001 + 2303:792:11:504:2:372c:0:6 + The above IP Addresses which are used in the snmprec file were randomly generated. + Verizon Media is not associated with them. + """ + path = pwd + results_data_file = 'devicetype_location_results.json' + snmp_community = 'devicetype_location' + plugin_conf = {'Core': {'name': 'Test Plugin', 'module': 'test_plugin'}, + 'main': {'execute_frequency': '60', 'enrichment_ttl': '300', + 'resource_filter': 'resource_class = "network" AND resource_type = "juniper"', + 'polling_frequency': '300', 'enrichment_schema_version': '0.2'}, + 'snmp': {'timeout': 5, 'retries': 2}, + 'enrichment': {'preload': 'self:metrics'}, + 'x509': {'x509_secured_requests': 0}, + } + plugin_class = JuniperBGPInfoPluginEnrichmentMetrics + use_enrichment = False + + def test_polling_plugin_timeout(self): + """Test plugin raises error during timeout""" + pass diff --git a/tests/plugins/polling/generic/snmp/juniper/bgp/__init__.py b/tests/plugins/polling/generic/snmp/juniper/bgp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/polling/generic/snmp/juniper/bgp/data/enrichment_data b/tests/plugins/polling/generic/snmp/juniper/bgp/data/enrichment_data new file mode 100644 index 00000000..cd2b4be6 --- /dev/null +++ b/tests/plugins/polling/generic/snmp/juniper/bgp/data/enrichment_data @@ -0,0 +1 @@ +test_id:metrics=>{"data": {"127.0.0.1": {"metrics_groups": [{"dimensions": {"bgp_adjacency_subtype": {"value": "'transit' if 'TRANS' in interface_alias.$index else 'free' if 'FREE' in interface_alias.$index else 'unknown'"},"bgp_adjacency_type": {"value": "'unknown' if peer_local_as.$index is None or peer_remote_as.$index is None else 'internal' if peer_local_as.$index == peer_remote_as.$index else 'external'"},"interface_alias": {"value": "interface_alias.$index"},"interface_name": {"value": "interface_name.$index"},"local_address": {"value": "local_address.$index"},"peer_address": {"value": "peer_address.$index"},"peer_external_connection": {"value": "'ix' if 'IX' in interface_alias.$index else 'pni'"},"peer_local_as": {"value": "peer_local_as.$index"},"peer_remote_as": {"value": "peer_remote_as.$index"}},"group_name": "bgp_session","metrics": {"interface_speed": {"metric_type": "gauge","transform": "lambda x: x * 1000000","value": "interface_speed.$index"},"peer_in_updates": {"metric_type": "counter","value": "peer_in_updates.$index"},"peer_out_updates": {"metric_type": "counter","value": "peer_out_updates.$index"},"peer_session_established_time": {"metric_type": "gauge","value": "peer_session_established_time.$index"},"peer_session_transitions": {"metric_type": "gauge","value": "peer_session_transitions.$index"},"peer_state": {"metric_type": "gauge","value": "peer_state.$index"},"peer_status": {"metric_type": "gauge","value": "peer_status.$index"},"prefix_in_prefixes": {"metric_type": "gauge","value": "prefix_in_prefixes.$index"},"prefix_in_prefixes_accepted": {"metric_type": "gauge","value": "prefix_in_prefixes_accepted.$index"},"prefix_in_prefixes_active": {"metric_type": "gauge","value": "prefix_in_prefixes_active.$index"},"prefix_in_prefixes_rejected": {"metric_type": "gauge","value": "prefix_in_prefixes_rejected.$index"}}}],"oids": {"interface_alias": {"method": "static","values": {"0.1.44.144.154.142.1.42.7.240.144": "","0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": ""}},"interface_name": {"method": "static","values": {"0.1.44.144.154.142.1.42.7.240.144": "xe-1/0/10.0","0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "xe-11/0/10.0"}},"interface_speed": {"method": "static","values": {"0.1.44.144.154.142.1.42.7.240.144": "10000","0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "10000"}},"local_address": {"method": "static","values": {"0.1.44.144.154.142.1.42.7.240.144": "44.144.154.142","0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "2303:792:11:504:2:372c:0:6"}},"peer_address": {"method": "static","values": {"0.1.44.144.154.142.1.42.7.240.144": "42.7.240.144","0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1": "2131:7fa:4011:4:5000:2a:400:5001"}},"peer_in_updates": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.1.1.1"},"peer_index": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14"},"peer_local_as": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.9"},"peer_out_updates": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.1.1.2"},"peer_remote_as": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13"},"peer_session_established_time": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.4.1.1.1"},"peer_session_transitions": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.1.1.5"},"peer_state": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2"},"peer_status": {"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.1.1.1.3"},"prefix_in_prefixes": {"index_transform": {"154.1.1": "0.1.44.144.154.142.1.42.7.240.144","223.2.1": "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1"},"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.2.1.7"},"prefix_in_prefixes_accepted": {"index_transform": {"154.1.1": "0.1.44.144.154.142.1.42.7.240.144","223.2.1": "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1"},"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.2.1.8"},"prefix_in_prefixes_active": {"index_transform": {"154.1.1": "0.1.44.144.154.142.1.42.7.240.144","223.2.1": "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1"},"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.2.1.11"},"prefix_in_prefixes_rejected": {"index_transform": {"154.1.1": "0.1.44.144.154.142.1.42.7.240.144","223.2.1": "0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1"},"method": "bulk_walk","oid": ".1.3.6.1.4.1.2636.5.1.1.2.6.2.1.9"}}}}} \ No newline at end of file diff --git a/tests/plugins/polling/generic/snmp/juniper/bgp/data/recording/public.snmprec b/tests/plugins/polling/generic/snmp/juniper/bgp/data/recording/public.snmprec new file mode 100644 index 00000000..58ea24ad --- /dev/null +++ b/tests/plugins/polling/generic/snmp/juniper/bgp/data/recording/public.snmprec @@ -0,0 +1,39 @@ +1.3.6.1.2.1.4.35.1.7.670.1.4.42.7.240.144|2|6 +1.3.6.1.2.1.4.35.1.7.670.1.4.44.144.154.142|2|6 +1.3.6.1.2.1.4.35.1.7.683.2.16.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|2|1 +1.3.6.1.2.1.4.35.1.7.683.2.16.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6|2|1 +1.3.6.1.2.1.31.1.1.1.1.670|4x|78652d312f302f31302e30 +1.3.6.1.2.1.31.1.1.1.1.683|4x|78652d31312f302f31302e30 +1.3.6.1.2.1.31.1.1.1.15.670|66|10000 +1.3.6.1.2.1.31.1.1.1.15.683|66|10000 +1.3.6.1.2.1.31.1.1.1.18.670|4| +1.3.6.1.2.1.31.1.1.1.18.683|4| +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2.0.1.44.144.154.142.1.42.7.240.144|2|6 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|2|6 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.3.0.1.44.144.154.142.1.42.7.240.144|2|2 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.3.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|2|2 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.9.0.1.44.144.154.142.1.42.7.240.144|66|17457 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.9.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|66|17457 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.11.0.1.44.144.154.142.1.42.7.240.144|4x|2A07F090 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.11.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|4x|213107fa401100045000002a04005001 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13.0.1.44.144.154.142.1.42.7.240.144|66|63956 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|66|42 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14.0.1.44.144.154.142.1.42.7.240.144|66|154 +1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|66|223 +1.3.6.1.4.1.2636.5.1.1.2.4.1.1.1.0.1.44.144.154.142.1.42.7.240.144|66|7775535 +1.3.6.1.4.1.2636.5.1.1.2.4.1.1.1.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|66|556929 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.1.0.1.44.144.154.142.1.42.7.240.144|65|126349 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.1.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|65|10 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.2.0.1.44.144.154.142.1.42.7.240.144|65|0 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.2.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|65|9 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.5.0.1.44.144.154.142.1.42.7.240.144|65|4 +1.3.6.1.4.1.2636.5.1.1.2.6.1.1.5.0.2.35.3.7.146.0.17.5.4.0.2.55.44.0.0.0.6.2.33.49.7.250.64.17.0.4.80.0.0.42.4.0.80.1|65|1 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.7.154.1.1|66|403 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.7.223.2.1|66|152 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.8.154.1.1|66|0 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.8.223.2.1|66|152 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.9.154.1.1|66|403 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.9.223.2.1|66|0 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.11.154.1.1|66|0 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.11.223.2.1|66|152 +1.3.6.1.4.1.2636.5.1.1.2.6.2.1.12.397.1.1|66|55028 \ No newline at end of file diff --git a/tests/plugins/polling/generic/snmp/juniper/bgp/data/results.json b/tests/plugins/polling/generic/snmp/juniper/bgp/data/results.json new file mode 100644 index 00000000..2fd89750 --- /dev/null +++ b/tests/plugins/polling/generic/snmp/juniper/bgp/data/results.json @@ -0,0 +1,246 @@ +[ + { + "metrics_group_interval": 60, + "resource": { + "resource_site": "test_site", + "resource_id": "test_id", + "resource_class": "network", + "resource_plugin": "dummy", + "resource_subclass": "test_subclass", + "resource_endpoint": "127.0.0.1", + "resource_metadata": { + "model": "model", + "_resource_ttl": "604800" + }, + "resource_type": "test_type" + }, + "dimensions": [ + { + "dimension_name": "bgp_adjacency_type", + "dimension_value": "external" + }, + { + "dimension_name": "bgp_adjacency_subtype", + "dimension_value": "unknown" + }, + { + "dimension_name": "peer_remote_as", + "dimension_value": "63956" + }, + { + "dimension_name": "local_address", + "dimension_value": "44.144.154.142" + }, + { + "dimension_name": "interface_name", + "dimension_value": "xe-1/0/10.0" + }, + { + "dimension_name": "peer_address", + "dimension_value": "42.7.240.144" + }, + { + "dimension_name": "peer_external_connection", + "dimension_value": "pni" + }, + { + "dimension_name": "peer_local_as", + "dimension_value": "17457" + } + ], + "metrics_group_type": "bgp_session", + "metrics": [ + { + "metric_type": "gauge", + "metric_name": "prefix_in_prefixes_accepted", + "metric_value": 0 + }, + { + "metric_type": "gauge", + "metric_name": "prefix_in_prefixes_rejected", + "metric_value": 403 + }, + { + "metric_type": "gauge", + "metric_name": "prefix_in_prefixes", + "metric_value": 403 + }, + { + "metric_type": "gauge", + "metric_name": "peer_status", + "metric_value": 2 + }, + { + "metric_type": "gauge", + "metric_name": "peer_state", + "metric_value": 6 + }, + { + "metric_type": "gauge", + "metric_name": "interface_speed", + "metric_value": 10000000000 + }, + { + "metric_type": "gauge", + "metric_name": "peer_session_established_time", + "metric_value": 7775535 + }, + { + "metric_type": "gauge", + "metric_name": "peer_session_transitions", + "metric_value": 4 + }, + { + "metric_type": "counter", + "metric_name": "peer_out_updates", + "metric_value": 0 + }, + { + "metric_type": "gauge", + "metric_name": "prefix_in_prefixes_active", + "metric_value": 0 + }, + { + "metric_type": "counter", + "metric_name": "peer_in_updates", + "metric_value": 126349 + } + ], + "metrics_group_schema_version": "0.2" + }, + { + "metrics_group_interval": 60, + "resource": { + "resource_site": "test_site", + "resource_id": "test_id", + "resource_class": "network", + "resource_plugin": "dummy", + "resource_subclass": "test_subclass", + "resource_endpoint": "127.0.0.1", + "resource_metadata": { + "model": "model", + "_resource_ttl": "604800" + }, + "resource_type": "test_type" + }, + "dimensions": [ + { + "dimension_name": "peer_remote_as", + "dimension_value": "42" + }, + { + "dimension_name": "interface_name", + "dimension_value": "xe-11/0/10.0" + }, + { + "dimension_name": "bgp_adjacency_type", + "dimension_value": "external" + }, + { + "dimension_name": "peer_address", + "dimension_value": "2131:7fa:4011:4:5000:2a:400:5001" + }, + { + "dimension_name": "bgp_adjacency_subtype", + "dimension_value": "unknown" + }, + { + "dimension_name": "peer_external_connection", + "dimension_value": "pni" + }, + { + "dimension_name": "peer_local_as", + "dimension_value": "17457" + }, + { + "dimension_name": "local_address", + "dimension_value": "2303:792:11:504:2:372c:0:6" + } + ], + "metrics_group_type": "bgp_session", + "metrics": [ + { + "metric_type": "gauge", + "metric_name": "peer_session_established_time", + "metric_value": 556929 + }, + { + "metric_type": "counter", + "metric_name": "peer_in_updates", + "metric_value": 10 + }, + { + "metric_type": "gauge", + "metric_name": "peer_status", + "metric_value": 2 + }, + { + "metric_type": "gauge", + "metric_name": "prefix_in_prefixes_rejected", + "metric_value": 0 + }, + { + "metric_type": "gauge", + "metric_name": "prefix_in_prefixes_active", + "metric_value": 152 + }, + { + "metric_type": "gauge", + "metric_name": "peer_state", + "metric_value": 6 + }, + { + "metric_type": "counter", + "metric_name": "peer_out_updates", + "metric_value": 9 + }, + { + "metric_type": "gauge", + "metric_name": "interface_speed", + "metric_value": 10000000000 + }, + { + "metric_type": "gauge", + "metric_name": "prefix_in_prefixes_accepted", + "metric_value": 152 + }, + { + "metric_type": "gauge", + "metric_name": "peer_session_transitions", + "metric_value": 1 + }, + { + "metric_type": "gauge", + "metric_name": "prefix_in_prefixes", + "metric_value": 152 + } + ], + "metrics_group_schema_version": "0.2" + }, + { + "metrics_group_interval": 60, + "resource": { + "resource_site": "test_site", + "resource_id": "test_id", + "resource_class": "network", + "resource_plugin": "dummy", + "resource_subclass": "test_subclass", + "resource_endpoint": "127.0.0.1", + "resource_metadata": { + "model": "model", + "_resource_ttl": "604800" + }, + "resource_type": "test_type" + }, + "dimensions": [], + "metrics_group_type": "status", + "metrics": [ + { + "metric_type": "gauge", + "metric_name": "polling_status", + "metric_value": 0 + } + ], + "metrics_group_schema_version": "0.2" + } +] \ No newline at end of file diff --git a/tests/plugins/polling/generic/snmp/juniper/bgp/test_plugin_polling_juniper_bgp_session_metrics.py b/tests/plugins/polling/generic/snmp/juniper/bgp/test_plugin_polling_juniper_bgp_session_metrics.py new file mode 100644 index 00000000..b49a0e64 --- /dev/null +++ b/tests/plugins/polling/generic/snmp/juniper/bgp/test_plugin_polling_juniper_bgp_session_metrics.py @@ -0,0 +1,60 @@ +import os +import unittest + +from tests.plugins.helpers import SNMPPollingPluginTestFramework, setup_module_default, tear_down_module_default +from yahoo_panoptes.plugins.polling.generic.snmp.plugin_polling_generic_snmp import \ + PluginPollingGenericSNMPMetrics + +module_path = os.path.dirname(os.path.abspath(__file__)) + + +def setUpModule(): + setup_module_default(module_path) + + +def tearDownModule(): + tear_down_module_default() + + +class TestPluginPollingBGPMetrics(SNMPPollingPluginTestFramework, unittest.TestCase): + """ + Note: + 44.144.154.142 + 42.7.240.144 + 2131:7fa:4011:4:5000:2a:400:5001 + 2303:792:11:504:2:372c:0:6 + The above IP Addresses which are used in the public.snmprec file were randomly generated. + Verizon Media is not associated with them. + """ + plugin_class = PluginPollingGenericSNMPMetrics + path = os.path.dirname(os.path.abspath(__file__)) + maxDiff = None + plugin_conf = { + 'Core': { + 'name': 'Test Plugin', + 'module': 'test_plugin' + }, + 'main': { + 'execute_frequency': '60', + 'enrichment_ttl': '300', + 'resource_filter': 'resource_class = "network"', + 'namespace': 'metrics', + 'polling_status_metric_name': 'polling_status' + }, + 'snmp': { + 'timeout': 10, + 'retries': 1, + 'non_repeaters': 0, + 'max_repetitions': 25, + }, + 'enrichment': { + 'preload': 'self:metrics' + }, + 'x509': {'x509_secured_requests': 0} + } + + def test_inactive_port(self): + pass + + def test_no_service_active(self): + pass \ No newline at end of file diff --git a/yahoo_panoptes/plugins/enrichment/generic/snmp/juniper/bgp/__init__.py b/yahoo_panoptes/plugins/enrichment/generic/snmp/juniper/bgp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/yahoo_panoptes/plugins/enrichment/generic/snmp/juniper/bgp/plugin_enrichment_bgp_session_metrics.py b/yahoo_panoptes/plugins/enrichment/generic/snmp/juniper/bgp/plugin_enrichment_bgp_session_metrics.py new file mode 100644 index 00000000..903a34d2 --- /dev/null +++ b/yahoo_panoptes/plugins/enrichment/generic/snmp/juniper/bgp/plugin_enrichment_bgp_session_metrics.py @@ -0,0 +1,413 @@ +""" +This module implements a Panoptes Plugin that polls Juniper Devices for BGP Metrics +""" + +from cached_property import threaded_cached_property +import ipaddress + +from yahoo_panoptes.framework.enrichment import PanoptesEnrichmentSet +from yahoo_panoptes.framework.utilities.helpers import transform_index_ipv6_address +from yahoo_panoptes.plugins.enrichment.generic.snmp.plugin_enrichment_generic_snmp import \ + PanoptesEnrichmentGenericSNMPPlugin + +jnxBgpM2PeerEntry = '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1' + +jnxBgpM2PeerState = jnxBgpM2PeerEntry + '.2' +jnxBgpM2PeerStatus = jnxBgpM2PeerEntry + '.3' +jnxBgpM2PeerLocalAs = jnxBgpM2PeerEntry + '.9' +jnxBgpM2PeerRemoteAddr = jnxBgpM2PeerEntry + '.11' +jnxBgpM2PeerRemoteAs = jnxBgpM2PeerEntry + '.13' +jnxBgpM2PeerIndex = jnxBgpM2PeerEntry + '.14' + +jnxBgpM2PeerEventTimesEntry = '.1.3.6.1.4.1.2636.5.1.1.2.4.1.1' +jnxBgpM2PeerFsmEstablishedTime = jnxBgpM2PeerEventTimesEntry + '.1' + +jnxBgpM2PeerCountersEntry = '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1' +jnxBgpM2PeerInUpdates = jnxBgpM2PeerCountersEntry + '.1' +jnxBgpM2PeerOutUpdates = jnxBgpM2PeerCountersEntry + '.2' +jnxBgpM2PeerFsmEstablishedTrans = jnxBgpM2PeerCountersEntry + '.5' + +jnxBgpM2PrefixCountersEntry = '.1.3.6.1.4.1.2636.5.1.1.2.6.2.1' +jnxBgpM2PrefixInPrefixes = jnxBgpM2PrefixCountersEntry + '.7' +jnxBgpM2PrefixInPrefixesAccepted = jnxBgpM2PrefixCountersEntry + '.8' +jnxBgpM2PrefixInPrefixesRejected = jnxBgpM2PrefixCountersEntry + '.9' +jnxBgpM2PrefixInPrefixesActive = jnxBgpM2PrefixCountersEntry + '.11' + +ifXEntry = '.1.3.6.1.2.1.31.1.1.1' +ifName = ifXEntry + '.1' +ifHighSpeed = ifXEntry + '.15' +ifAlias = ifXEntry + '.18' + +ipNetToPhysicalState = '.1.3.6.1.2.1.4.35.1.7' + + +class DimensionDerivation(object): + + @staticmethod + def peer_external_connection(): + pass + + @staticmethod + def bgp_adjacency_subtype(): + pass + + +class YahooDimensionDerivation(DimensionDerivation): + """ + The way dimensions are derived below are Yahoo specific. + These methods should be overridden + """ + @staticmethod + def peer_external_connection(): + return "'ix' if 'IX' in interface_alias.$index else 'pni'" + + @staticmethod + def bgp_adjacency_subtype(): + return "'transit' if 'TRANS' in interface_alias.$index else 'free' if 'FREE' in " \ + "interface_alias.$index else 'unknown'" + + +def transform_ip_octstr(ip_octstr): + """ + Converts octet strings containing IPv4 or IPv6 addresses into a human readable format. + + Args: + ip_octstr (str): The octet string returned via SNMP + + Returns: + str: human readable IPv4 or IPv6 IP address: + 2001:dea:0:10::82, 1.2.3.4 + """ + byte_arr = ['%0.2x' % ord(_) for _ in ip_octstr] + if len(byte_arr) == 4: + return '.'.join([str(int(x, 16)) for x in byte_arr]) + else: + byte_string = "" + for p, i in enumerate(byte_arr): + if p % 2 != 0: + byte_string += '{}{}:'.format(byte_arr[p - 1].lstrip('0'), byte_arr[p]) + # ipaddress formats the string nicely -- collapses blocks of zero + return str(ipaddress.ip_address(unicode(byte_string[:-1]))) + + +def transformer(value, transform): + if transform == 'ip': + return transform_ip_octstr(value) + elif transform == 'index_ipv6_address': + return transform_index_ipv6_address(value) + else: + return value + + +class JuniperBGPInfoPluginEnrichmentMetrics(PanoptesEnrichmentGenericSNMPPlugin): + + def __init__(self): + super(JuniperBGPInfoPluginEnrichmentMetrics, self).__init__() + + def _build_oids_map(self): + self._oids_map = { + "peer_state": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerState + }, + "peer_status": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerStatus + }, + "peer_local_as": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerLocalAs + }, + "peer_remote_as": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerRemoteAs + }, + "peer_index": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerIndex + }, + "peer_session_established_time": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerFsmEstablishedTime + }, + "peer_in_updates": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerInUpdates + }, + "peer_out_updates": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerOutUpdates + }, + "peer_session_transitions": { + "method": "bulk_walk", + "oid": jnxBgpM2PeerFsmEstablishedTrans + }, + "prefix_in_prefixes": { + "method": "bulk_walk", + "oid": jnxBgpM2PrefixInPrefixes, + "index_transform": self._join_jnxBGP_prefix_counters_entry + }, + "prefix_in_prefixes_accepted": { + "method": "bulk_walk", + "oid": jnxBgpM2PrefixInPrefixesAccepted, + "index_transform": self._join_jnxBGP_prefix_counters_entry + }, + "prefix_in_prefixes_rejected": { + "method": "bulk_walk", + "oid": jnxBgpM2PrefixInPrefixesRejected, + "index_transform": self._join_jnxBGP_prefix_counters_entry + }, + "prefix_in_prefixes_active": { + "method": "bulk_walk", + "oid": jnxBgpM2PrefixInPrefixesActive, + "index_transform": self._join_jnxBGP_prefix_counters_entry + }, + "interface_name": { + "method": "static", + "values": self._interface_to_bgp(ifName) + }, + "interface_speed": { + "method": "static", + "values": self._interface_to_bgp(ifHighSpeed) + }, + "interface_alias": { + "method": "static", + "values": self._interface_to_bgp(ifAlias) + }, + "local_address": { + "method": "static", + "values": self._create_static_local_remote_addr[0] + }, + "peer_address": { + "method": "static", + "values": self._create_static_local_remote_addr[1] + } + } + + def _interface_to_bgp(self, oid): + """ + Does a 2 way jump using the previously made dimensions table and maps + the jnxBgpM2PeerIndex indices directly to the corresponding ifXTable + entry depending on the oid passed in + Returns: + dict: jnxBgpM2PeerIndex keys mapping to the corresponding ifXTable entry values + """ + varbinds = self._snmp_connection.bulk_walk(oid) + return self._join_interface_and_bgp_info(self._dimensions_join, varbinds) + + def _join_interface_and_bgp_info(self, mappings, varbinds): + """ + Helper function for _interface_to_bgp + Returns: + dict: jnxBgpM2PeerIndex keys mapping to the corresponding ifXTable entry values + """ + + generic_mapping = dict() + interface_to_bgp = dict() + for varbind in varbinds: + generic_mapping[varbind.index] = varbind.value + + for key, value in mappings.items(): + + if value in generic_mapping: + interface_to_bgp[key] = generic_mapping[value] + + return interface_to_bgp + + @threaded_cached_property + def _join_jnxBGP_prefix_counters_entry(self): + return {index: self._process_peer_index_to_inet[index.split('.')[0]] for index in + self._prefix_counters_entry_indices} + + @threaded_cached_property + def _prefix_counters_entry_indices(self): + """ + Returns: + list: Array of jnxBgpM2PrefixInPrefixes indices to later iterate over + """ + indices = [] + varbinds = self._snmp_connection.bulk_walk(jnxBgpM2PrefixInPrefixes) + for varbind in varbinds: + indices.append(varbind.index) + return indices + + @threaded_cached_property + def _bgp_remote_addr(self): + varbinds = self._snmp_connection.bulk_walk(jnxBgpM2PeerRemoteAddr) + return varbinds + + @threaded_cached_property + def _ipNetToPhysicalState(self): + return self._snmp_connection.bulk_walk(ipNetToPhysicalState) + + @threaded_cached_property + def _jnx_peer_index(self): + return self._snmp_connection.bulk_walk(jnxBgpM2PeerIndex) + + @threaded_cached_property + def _create_static_local_remote_addr(self): + """ + Maps jnxBgpM2PeerIndices to their corresponding Local / Peering Addresses + Returns + list: [jnxBgpM2PeerIndex to Local Address, jnxBgpM2PeerIndex to Peering Address] + """ + peer_index_to_local_address = dict() + peer_index_to_peer_address = dict() + # making the assumption that (IPv4 - IPv4) & (IPv6 - IPv6) + for varbind in self._jnx_peer_index: + + peer_index = varbind.index.split('.') + + if int(peer_index[1]) == 1: # IPv4 + local_address = ".".join(peer_index[2:6]) + peer_address = ".".join(peer_index[7:]) + else: # IPv6 + local_address = transformer(".".join(peer_index[2:18]), 'index_ipv6_address') + peer_address = transformer(".".join(peer_index[19:]), 'index_ipv6_address') + + peer_index_to_local_address[varbind.index] = local_address + peer_index_to_peer_address[varbind.index] = peer_address + + return [peer_index_to_local_address, peer_index_to_peer_address] + + @threaded_cached_property + def _process_peer_index_to_inet(self): + """ + Returns: + dict: The jnxBgpM2PeerIndex table inverted + """ + idx_to_inet = {} + for varbind in self._jnx_peer_index: + idx_to_inet[varbind.value] = varbind.index + return idx_to_inet + + @threaded_cached_property + def _dimensions_join(self): + """ + Returns: + dict: Mapping from BGP Peer Table to the Interface Table + """ + ipaddr_to_ifidx = {} + for item in self._ipNetToPhysicalState: + indices = item.index.split('.')[:3] + ipaddr = str(".".join(item.index.split('.')[3:])) + + if int(indices[1]) == 2: + ipaddr = transformer(ipaddr, 'index_ipv6_address') + + ipaddr_to_ifidx[ipaddr] = str(indices[0]) + + bgp_peer_to_ifidx = {} + remoteaddr = self._bgp_remote_addr + for item in remoteaddr: + ipaddr = transform_ip_octstr(item.value) + if ipaddr in ipaddr_to_ifidx: + bgp_peer_to_ifidx[item.index] = ipaddr_to_ifidx[ipaddr] + + return bgp_peer_to_ifidx + + def _build_metrics_groups_conf(self): + self._metrics_groups = [ + { + "dimensions": { + "peer_local_as": { + "value": "peer_local_as.$index" + }, + "peer_remote_as": { + "value": "peer_remote_as.$index" + }, + "interface_name": { + "value": "interface_name.$index" + }, + "interface_alias": { + "value": "interface_alias.$index" + }, + "bgp_adjacency_type": { + "value": "'unknown' if peer_local_as.$index is None or peer_remote_as.$index is None" + " else 'internal' if peer_local_as.$index == peer_remote_as.$index else 'external'" + }, + "bgp_adjacency_subtype": { + "value": YahooDimensionDerivation.bgp_adjacency_subtype() + }, + "peer_external_connection": { + "value": YahooDimensionDerivation.peer_external_connection() + }, + "local_address": { + "value": "local_address.$index" + }, + "peer_address": { + "value": "peer_address.$index" + } + + }, + "group_name": "bgp_session", + "metrics": { + "peer_state": { + "metric_type": "gauge", + "value": "peer_state.$index" + }, + "peer_status": { + "metric_type": "gauge", + "value": "peer_status.$index" + }, + "prefix_in_prefixes": { + "metric_type": "gauge", + "value": "prefix_in_prefixes.$index" + }, + "prefix_in_prefixes_accepted": { + "metric_type": "gauge", + "value": "prefix_in_prefixes_accepted.$index" + }, + "prefix_in_prefixes_rejected": { + "metric_type": "gauge", + "value": "prefix_in_prefixes_rejected.$index" + }, + "prefix_in_prefixes_active": { + "metric_type": "gauge", + "value": "prefix_in_prefixes_active.$index" + }, + "interface_speed": { + "metric_type": "gauge", + "transform": "lambda x: x * 1000000", + "value": "interface_speed.$index" + }, + "peer_session_established_time": { + "metric_type": "gauge", + "value": "peer_session_established_time.$index" + }, + "peer_session_transitions": { + "metric_type": "gauge", + "value": "peer_session_transitions.$index" + }, + "peer_in_updates": { + "metric_type": "counter", + "value": "peer_in_updates.$index" + }, + "peer_out_updates": { + "metric_type": "counter", + "value": "peer_out_updates.$index" + }, + + } + } + ] + + def get_enrichment(self): + self._build_oids_map() + self._build_metrics_groups_conf() + enrichment_set = { + "oids": self.oids_map, + "metrics_groups": self.metrics_groups + } + + try: + self.enrichment_group.add_enrichment_set(PanoptesEnrichmentSet(self.device_fqdn, enrichment_set)) + except Exception as e: + self._logger.error('Error while adding enrichment set {} to enrichment group for the device {}: {}'. + format(enrichment_set, self.device_fqdn, repr(e))) + + self.enrichment_group_set.add_enrichment_group(self.enrichment_group) + + self._logger.debug('Metrics enrichment for device {}: {}'.format(self.device_fqdn, self.enrichment_group_set)) + + return self.enrichment_group_set