diff --git a/README.md b/README.md index a61d1fea3690d3fccb70dfe221328282de66785f..494d1c78a5effe5e230a91189aefe3b6e612de81 100644 --- a/README.md +++ b/README.md @@ -596,4 +596,11 @@ Any non-empty responses are JSON formatted messages. TODO: verify these values * `unknown` * `up` - * `down` \ No newline at end of file + * `down` + + +`ix_public_peer:<address>` + * key examples + * `ix_public_peer:193.203.0.203` + * `ix_public_peer:2001:07f8:00a0:0000:0000:5926:0000:0002` + * valid values: diff --git a/inventory_provider/juniper.py b/inventory_provider/juniper.py index cb7a198892d734ec5b4695fa7856761f2b405405..3094781f90b04b42518a7d286b186d4a4f3ae83a 100644 --- a/inventory_provider/juniper.py +++ b/inventory_provider/juniper.py @@ -266,7 +266,7 @@ def ix_public_peers(netconf_config): local_as = local_as.find('as-number') peer_as = r.find('peer-as') yield { - 'name': ipaddress.ip_address(name.text), + 'name': ipaddress.ip_address(name.text).exploded, 'description': description.text, 'as': { 'local': int(local_as.text), diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index e1861c2b30edb15f841461a33aa27661ab2ab949..66321d66b82efc5fdc9510ff163b7ab7760e7466 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -238,6 +238,23 @@ def clear_cached_classifier_responses(hostname): r.delete(k) +def refresh_ix_public_peers(hostname, netconf): + task_logger = logging.getLogger(constants.TASK_LOGGER_NAME) + task_logger.debug( + 'removing cached ix public peers for %r' % hostname) + r = get_redis(InventoryTask.config) + for k in r.keys('ix_public_peer:*'): + value = json.loads(r.get(k.decode('utf-8')).decode('utf-8')) + if value['router'] == hostname: + r.delete(k) + + for peer in juniper.ix_public_peers(netconf): + peer['router'] = hostname + r.set( + 'ix_public_peer:' + peer['name'], + json.dumps(peer)) + + @app.task def reload_router_config(hostname): task_logger = logging.getLogger(constants.TASK_LOGGER_NAME) @@ -249,6 +266,9 @@ def reload_router_config(hostname): if not netconf_doc: task_logger.error('no netconf data available for %r' % hostname) else: + + refresh_ix_public_peers(hostname, netconf_doc) + community = juniper.snmp_community_string(netconf_doc) if not community: task_logger.error(