From 61544d29db5302520e3c6a07a3b41da501543f80 Mon Sep 17 00:00:00 2001 From: maercu Date: Tue, 1 Apr 2025 13:40:29 +0200 Subject: [PATCH 1/4] pagination update --- aciClient/aci.py | 6 ++++- aciClient/aciCertClient.py | 45 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/aciClient/aci.py b/aciClient/aci.py index 9a371f2..2b630e9 100644 --- a/aciClient/aci.py +++ b/aciClient/aci.py @@ -167,7 +167,11 @@ def getJsonPaged(self, uri) -> {}: page = 0 while True: - parsed_query.extend([('page', page), ('page-size', '50000')]) + if page == 0: + parsed_query.extend([('page-size', '50000'), ('page', page)]) + else: + parsed_query[-1] = ('page', page) + page += 1 url_to_call = urlunparse((parsed_url[0], parsed_url[1], parsed_url[2], parsed_url[3], urlencode(parsed_query), parsed_url[5])) diff --git a/aciClient/aciCertClient.py b/aciClient/aciCertClient.py index 27b6ad9..ef9d3f7 100644 --- a/aciClient/aciCertClient.py +++ b/aciClient/aciCertClient.py @@ -16,6 +16,15 @@ import requests import json +# The modules are named different in python2/python3... +try: + from urlparse import urlparse, urlunparse, parse_qsl + from urllib import urlencode +except ImportError: + from urllib.parse import urlparse, urlunparse, urlencode, parse_qsl + +requests.packages.urllib3.disable_warnings() + class ACICert: __logger = logging.getLogger(__name__) @@ -58,6 +67,42 @@ def getJson(self, uri) -> {}: self.__logger.debug(f'Successful get Data from APIC: {r.json()}') return r.json()['imdata'] + # ============================================================================== + # getJson with Pagination + # ============================================================================== + def getJsonPaged(self, uri) -> {}: + url = self.baseUrl + uri + self.__logger.debug(f'Get Json Pagination called url: {url}') + parsed_url = urlparse(url) + parsed_query = parse_qsl(parsed_url.query) + + return_data = [] + page = 0 + + while True: + if page == 0: + parsed_query.extend([('page-size', '50000'), ('page', page)]) + else: + parsed_query[-1] = ('page', page) + + page += 1 + url_to_call = urlunparse((parsed_url[0], parsed_url[1], parsed_url[2], parsed_url[3], + urlencode(parsed_query), parsed_url[5])) + content = f'GET{parsed_url[2]}?{urlencode(parsed_query)}' + cookies = self.packCookies(content) + r = requests.get(url_to_call, cookies=cookies, verify=False) + + # Raise Exception if http Error occurred + r.raise_for_status() + + if r.ok: + responseJson = r.json() + self.__logger.debug(f'Successful get Data from APIC: {responseJson}') + if responseJson['imdata']: + return_data.extend(responseJson['imdata']) + else: + return return_data + # ============================================================================== # postJson # ============================================================================== From 0fb37a77155e64224b4031de55a75f3c945bbb0f Mon Sep 17 00:00:00 2001 From: maercu Date: Tue, 1 Apr 2025 14:23:47 +0200 Subject: [PATCH 2/4] pagination update - bugfix --- aciClient/aci.py | 4 ++-- aciClient/aciCertClient.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aciClient/aci.py b/aciClient/aci.py index 2b630e9..43f323b 100644 --- a/aciClient/aci.py +++ b/aciClient/aci.py @@ -171,10 +171,10 @@ def getJsonPaged(self, uri) -> {}: parsed_query.extend([('page-size', '50000'), ('page', page)]) else: parsed_query[-1] = ('page', page) - + page += 1 url_to_call = urlunparse((parsed_url[0], parsed_url[1], parsed_url[2], parsed_url[3], - urlencode(parsed_query), parsed_url[5])) + urlencode(parsed_query, safe="|"), parsed_url[5])) response = self.session.get(url_to_call, verify=False) if response.ok: diff --git a/aciClient/aciCertClient.py b/aciClient/aciCertClient.py index ef9d3f7..c00ac36 100644 --- a/aciClient/aciCertClient.py +++ b/aciClient/aciCertClient.py @@ -87,8 +87,8 @@ def getJsonPaged(self, uri) -> {}: page += 1 url_to_call = urlunparse((parsed_url[0], parsed_url[1], parsed_url[2], parsed_url[3], - urlencode(parsed_query), parsed_url[5])) - content = f'GET{parsed_url[2]}?{urlencode(parsed_query)}' + urlencode(parsed_query, safe="|"), parsed_url[5])) + content = f'GET{parsed_url[2]}?{urlencode(parsed_query, safe="|")}' cookies = self.packCookies(content) r = requests.get(url_to_call, cookies=cookies, verify=False) From db963aba3a83524f2c229a0f118b6a0d1f3b8d32 Mon Sep 17 00:00:00 2001 From: maercu Date: Tue, 1 Apr 2025 14:34:55 +0200 Subject: [PATCH 3/4] indent --- aciClient/aci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aciClient/aci.py b/aciClient/aci.py index 43f323b..764c76a 100644 --- a/aciClient/aci.py +++ b/aciClient/aci.py @@ -257,7 +257,7 @@ def snapshot(self, description="snapshot", target_dn="") -> bool: self.__logger.error(f'snapshot creation not succesfull: {response}') return False -# ============================================================================== + # ============================================================================== # subscribe # ============================================================================== def subscribe( From eab9a5ac7fa5a44497d6e6672d2fc8be81d27965 Mon Sep 17 00:00:00 2001 From: maercu Date: Tue, 1 Apr 2025 14:34:55 +0200 Subject: [PATCH 4/4] indent --- aciClient/aci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aciClient/aci.py b/aciClient/aci.py index 43f323b..764c76a 100644 --- a/aciClient/aci.py +++ b/aciClient/aci.py @@ -257,7 +257,7 @@ def snapshot(self, description="snapshot", target_dn="") -> bool: self.__logger.error(f'snapshot creation not succesfull: {response}') return False -# ============================================================================== + # ============================================================================== # subscribe # ============================================================================== def subscribe(