From b11a4203800bb1f1100f4266ca73bebaa0b2c63d Mon Sep 17 00:00:00 2001 From: Roel van de Kraats Date: Wed, 8 Oct 2025 15:38:38 +0200 Subject: [PATCH] Use new Jira Cloud jql search API Fixes: CLOUD ISSUES ERROR: Error retrieving issues from Jira Cloud instance: The requested API has been removed. Please migrate to the /rest/api/3/search/jql API. A full migration guideline is available at https://developer.atlassian.com/changelog/#CHANGE-2046 Note that _only_ this specific 'search POST' API call was updated. --- api/cloud/api.py | 2 +- utilities/cloud_functions.py | 15 ++++++++------- utilities/cloud_verifications.py | 12 +++++++----- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/api/cloud/api.py b/api/cloud/api.py index df7adde..eaa9ae3 100644 --- a/api/cloud/api.py +++ b/api/cloud/api.py @@ -42,7 +42,7 @@ class JiraCloudApi(Consumer): @headers({"Accept": "application/json", "Content-Type": "application/json"}) @json - @post("{}{}".format(jira_endpoint, "search")) + @post("{}{}/jql".format(jira_endpoint, "search")) def search_for_issues_using_jql(self, body: Body): """Search issues through jql""" diff --git a/utilities/cloud_functions.py b/utilities/cloud_functions.py index 1ce7e53..8c1c0db 100644 --- a/utilities/cloud_functions.py +++ b/utilities/cloud_functions.py @@ -7,26 +7,27 @@ def get_cloud_issue_folders(project_key, folder_issue_type_id): start_at = 0 - total = 1 folder_issue_type_name = cloud_jira_helper.get_issue_type_name(folder_issue_type_id) request_body = {"jql": f'issuetype = "{folder_issue_type_name}" and project = {project_key}', - "maxResults": MAX_RESULTS, "fields": ["summary"], "startAt": start_at} + "maxResults": MAX_RESULTS, "fields": ["summary"], "nextPageToken": None} cloud_issue_folders = [] - while len(cloud_issue_folders) != total: + while True: response = cloud_jira_helper.search_for_issues_using_jql(request_body) cloud_issues = response.json() if response.status_code == 200: - total = cloud_issues["total"] - start_at += MAX_RESULTS - request_body["startAt"] = start_at cloud_issue_folders += [{"issue_key": issue["key"], "summary": issue["fields"]["summary"]} for issue in cloud_issues["issues"]] - message = f"Folder issues retrieved from {cloud_issues['startAt']} to {len(cloud_issue_folders)}" \ + message = f"Folder issues retrieved from {start_at} to {len(cloud_issue_folders)}" \ f" in Jira Cloud instance" write_logging_server_response(response, message) + if cloud_issues["isLast"]: + break + request_body["nextPageToken"] = cloud_issues["nextPageToken"] + start_at += MAX_RESULTS else: message = "Could not retrieve the folder issues in Jira cloud instance" write_logging_server_response(response, message, True) + break return cloud_issue_folders diff --git a/utilities/cloud_verifications.py b/utilities/cloud_verifications.py index 794cb46..820da11 100644 --- a/utilities/cloud_verifications.py +++ b/utilities/cloud_verifications.py @@ -74,7 +74,7 @@ def verify_all_data_center_tree_issues_in_cloud_instance(tree_items_list): for tree_item in tree_issues_list] request_body = {"jql": f"issueKey in {tree_items_key_list}", "maxResults": MAX_RESULTS, "fields": ["summary", - "issuetype"], "startAt": start_at} + "issuetype"], "nextPageToken": None} not_found_issues = [] @@ -84,14 +84,16 @@ def verify_all_data_center_tree_issues_in_cloud_instance(tree_items_list): if response.status_code == 200: tried_to_retrieve = min( - len(issue_keys_and_summary_expected) - request_body["startAt"], MAX_RESULTS) - start_at += MAX_RESULTS - request_body["startAt"] = start_at + len(issue_keys_and_summary_expected) - start_at, MAX_RESULTS) issue_keys_and_summary_response += [{"issue_key": issue["key"], "summary": issue["fields"]["summary"]} for issue in cloud_issues["issues"]] issues_retrieved = len(cloud_issues["issues"]) - message = f"Successfully retrieved {issues_retrieved} issues out of {tried_to_retrieve} requested starting with issue {(cloud_issues['startAt'] + 1)}" + message = f"Successfully retrieved {issues_retrieved} issues out of {tried_to_retrieve} requested starting with issue {(start_at + 1)}" write_logging_server_response(response, message) + if cloud_issues["isLast"]: + break + request_body["nextPageToken"] = cloud_issues["nextPageToken"] + start_at += MAX_RESULTS else: # Try to get the response error message message = try_extend_error_message_with_response_object(