From bbcefb6cfe134b33dd0062555f4981d109a08661 Mon Sep 17 00:00:00 2001 From: Mikhail Yohman Date: Thu, 12 Nov 2020 19:43:37 -0700 Subject: [PATCH 1/2] Add option for lookup plugin to use .get when id=x passed into api_filter --- plugins/lookup/nb_lookup.py | 14 ++++++++++++++ .../targets/latest/tasks/netbox_lookup.yml | 5 +++++ .../targets/v2.8/tasks/netbox_lookup.yml | 5 +++++ 3 files changed, 24 insertions(+) diff --git a/plugins/lookup/nb_lookup.py b/plugins/lookup/nb_lookup.py index 4a9cb23bb..e60d16087 100644 --- a/plugins/lookup/nb_lookup.py +++ b/plugins/lookup/nb_lookup.py @@ -330,6 +330,20 @@ def run(self, terms, variables=None, **kwargs): if netbox_api_filter: filter = build_filters(netbox_api_filter) + if "id" in filter: + Display().vvvv( + u"Filter is: %s and includes id, will use .get instead of .filter" + % (filter) + ) + try: + id = int(filter["id"][0]) + nb_data = endpoint.get(id) + data = dict(nb_data) + Display().vvvvv(pformat(data)) + return [data] + except pynetbox.RequestError as e: + raise AnsibleError(e.error) + Display().vvvv("filter is %s" % filter) # Make call to NetBox API and capture any failures diff --git a/tests/integration/targets/latest/tasks/netbox_lookup.yml b/tests/integration/targets/latest/tasks/netbox_lookup.yml index e4f7c5589..3217f1c7b 100644 --- a/tests/integration/targets/latest/tasks/netbox_lookup.yml +++ b/tests/integration/targets/latest/tasks/netbox_lookup.yml @@ -75,3 +75,8 @@ - "'L2' in {{ query_result |json_query('[*].display_name') }}" vars: query_result: "{{ query('netbox.netbox.nb_lookup', 'devices', api_filter='role=core-switch site=test-site site=test-site2', api_endpoint='http://localhost:32768', token='0123456789abcdef0123456789abcdef01234567', raw_data=True) }}" + +- name: "NETBOX_LOOKUP 10: Device query by ID" + assert: + that: + - "{{ query('netbox.netbox.nb_lookup', 'devices', api_filter='id=1', api_endpoint='http://localhost:32768', token='0123456789abcdef0123456789abcdef01234567') }}" diff --git a/tests/integration/targets/v2.8/tasks/netbox_lookup.yml b/tests/integration/targets/v2.8/tasks/netbox_lookup.yml index e4f7c5589..3217f1c7b 100644 --- a/tests/integration/targets/v2.8/tasks/netbox_lookup.yml +++ b/tests/integration/targets/v2.8/tasks/netbox_lookup.yml @@ -75,3 +75,8 @@ - "'L2' in {{ query_result |json_query('[*].display_name') }}" vars: query_result: "{{ query('netbox.netbox.nb_lookup', 'devices', api_filter='role=core-switch site=test-site site=test-site2', api_endpoint='http://localhost:32768', token='0123456789abcdef0123456789abcdef01234567', raw_data=True) }}" + +- name: "NETBOX_LOOKUP 10: Device query by ID" + assert: + that: + - "{{ query('netbox.netbox.nb_lookup', 'devices', api_filter='id=1', api_endpoint='http://localhost:32768', token='0123456789abcdef0123456789abcdef01234567') }}" From 9e969c1cd46a24f7e370e6194382e280b38d2919 Mon Sep 17 00:00:00 2001 From: Mikhail Yohman Date: Sun, 15 Nov 2020 18:44:21 -0700 Subject: [PATCH 2/2] Made a few more changes to stop from repeatedly casting to dict in regular logic. --- plugins/lookup/nb_lookup.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/lookup/nb_lookup.py b/plugins/lookup/nb_lookup.py index e60d16087..f79e3d828 100644 --- a/plugins/lookup/nb_lookup.py +++ b/plugins/lookup/nb_lookup.py @@ -352,13 +352,14 @@ def run(self, terms, variables=None, **kwargs): ) for data in nb_data: - Display().vvvvv(pformat(dict(data))) + data = dict(data) + Display().vvvvv(pformat(data)) if netbox_raw_return: - results.append(dict(data)) + results.append(data) else: - key = dict(data)["id"] - result = {key: dict(data)} + key = data["id"] + result = {key: data} results.extend(self._flatten_hash_to_list(result)) return results