From 3a0ced42f2498ab2783b5a813ea538eb6ce968ce Mon Sep 17 00:00:00 2001 From: Lee Goolsbee Date: Wed, 22 Jul 2026 00:41:14 -0500 Subject: [PATCH] ITPLT-4718 Query Marketplace for JSM app software ID --- roles/product_install/defaults/main.yml | 5 ++- .../molecule/jira_all/converge.yml | 3 +- .../molecule/jira_all/tests/test_default.py | 2 +- .../jira-servicedesk_app_software_ids.yml | 23 ++++++++++++ .../tasks/jira-servicedesk_as_obr.yml | 36 +++++++++++++++---- .../tasks/jira-servicedesk_version_latest.yml | 26 ++++++++++++-- 6 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 roles/product_install/tasks/jira-servicedesk_app_software_ids.yml diff --git a/roles/product_install/defaults/main.yml b/roles/product_install/defaults/main.yml index d2c9ffa..2129c90 100644 --- a/roles/product_install/defaults/main.yml +++ b/roles/product_install/defaults/main.yml @@ -36,7 +36,10 @@ atl_product_family_to_mpac_parent_software_id_map: stash: "bitbucket" atl_mpac_base_url: "https://marketplace.atlassian.com" atl_mpac_api_base_url: "{{ atl_mpac_base_url }}/rest/3" -atl_mpac_jsm_app_software_id: "1bbd1b4a-95cd-4762-b7ae-3e3e99eee7d8" +atl_mpac_jsm_app_key: "com.atlassian.servicedesk.application" +atl_mpac_jsm_hosting_preference: + - datacenter + - server atl_mpac_product_latest_version_url: "{{ atl_mpac_api_base_url }}/parent-software/{{ atl_product_family_to_mpac_parent_software_id_map[atl_product_family] }}/versions?state=ACTIVE&limit=1" atl_install_jsd_as_obr: false diff --git a/roles/product_install/molecule/jira_all/converge.yml b/roles/product_install/molecule/jira_all/converge.yml index 58e3ecd..3c1913d 100644 --- a/roles/product_install/molecule/jira_all/converge.yml +++ b/roles/product_install/molecule/jira_all/converge.yml @@ -5,7 +5,8 @@ atl_product_family: "jira" atl_product_edition: "jira-software" atl_product_user: "jira" - # Version 8.14.0 is chosen deliberately as it is a version where jira and jira-software returns different buildNumber from MPAC + # Version 8.14.0 has different jira and jira-software build numbers from MPAC. + # It also has no Data Center-hosted JSM record, exercising the Server fallback. # See DCD-1216 for context atl_product_version: "8.14.0" atl_install_jsd_as_obr: true diff --git a/roles/product_install/molecule/jira_all/tests/test_default.py b/roles/product_install/molecule/jira_all/tests/test_default.py index 1d793bf..99281c8 100644 --- a/roles/product_install/molecule/jira_all/tests/test_default.py +++ b/roles/product_install/molecule/jira_all/tests/test_default.py @@ -31,7 +31,7 @@ def test_is_unpacked(host): assert installer.user == 'jira' assert installer.mode == 0o0755 -def test_obr_is_downloaded(host): +def test_obr_is_downloaded_via_server_fallback(host): installer = host.file('/media/atl/downloads/jira-servicedesk-application-4.14.0.obr') assert installer.exists assert installer.user == 'root' diff --git a/roles/product_install/tasks/jira-servicedesk_app_software_ids.yml b/roles/product_install/tasks/jira-servicedesk_app_software_ids.yml new file mode 100644 index 0000000..284b25d --- /dev/null +++ b/roles/product_install/tasks/jira-servicedesk_app_software_ids.yml @@ -0,0 +1,23 @@ +--- + +- name: Marketplace JSM - Resolve app software IDs by hosting preference + ansible.builtin.uri: + url: "{{ atl_mpac_api_base_url }}/app-software/app-key/{{ atl_mpac_jsm_app_key }}?hosting={{ item }}" + return_content: true + loop: "{{ atl_mpac_jsm_hosting_preference }}" + loop_control: + label: "{{ item }}" + register: atl_jsm_app_software_lookup + +- name: Marketplace JSM - Set non-archived app software IDs + ansible.builtin.set_fact: + atl_jsm_app_software_ids: "{{ atl_jsm_app_software_lookup.results | map(attribute='json') | flatten | rejectattr('archived') | map(attribute='appSoftwareId') | list }}" + +- name: Marketplace JSM - Ensure at least one app software ID was resolved + ansible.builtin.assert: + that: + - atl_jsm_app_software_ids | length > 0 + fail_msg: >- + Marketplace did not return a non-archived app software ID for + {{ atl_mpac_jsm_app_key }} using hosting preferences + {{ atl_mpac_jsm_hosting_preference | join(', ') }}. diff --git a/roles/product_install/tasks/jira-servicedesk_as_obr.yml b/roles/product_install/tasks/jira-servicedesk_as_obr.yml index e755cbc..e7efbb5 100644 --- a/roles/product_install/tasks/jira-servicedesk_as_obr.yml +++ b/roles/product_install/tasks/jira-servicedesk_as_obr.yml @@ -19,23 +19,47 @@ ansible.builtin.debug: msg="buildNumber={{ atl_product_version_info.json.buildNumber }}" - - name: Marketplace OBR - Get the JSD build version info + - name: Marketplace OBR - Resolve JSM app software IDs + ansible.builtin.include_tasks: jira-servicedesk_app_software_ids.yml + + - name: Marketplace OBR - Get JSD build version info for resolved app software IDs ansible.builtin.uri: - url: "{{ atl_mpac_api_base_url }}/app-software/{{ atl_mpac_jsm_app_software_id }}/versions?parentSoftwareId=jira&parentSoftwareVersionId={{ atl_product_version_info.json.buildNumber }}&state=ACTIVE&limit=1" - return_content: yes + url: "{{ atl_mpac_api_base_url }}/app-software/{{ item }}/versions?parentSoftwareId=jira&parentSoftwareVersionId={{ atl_product_version_info.json.buildNumber }}&state=ACTIVE&limit=1" + return_content: true + loop: "{{ atl_jsm_app_software_ids }}" + loop_control: + label: "{{ item }}" register: atl_jsd_build_info + - name: Marketplace OBR - Set compatible JSD build versions + ansible.builtin.set_fact: + atl_jsd_build_versions: "{{ atl_jsd_build_info.results | map(attribute='json') | map(attribute='versions') | flatten | list }}" + + - name: Marketplace OBR - Ensure a compatible JSD build was returned + ansible.builtin.assert: + that: + - atl_jsd_build_versions | length > 0 + fail_msg: >- + Marketplace returned no compatible JSM version for Jira {{ atl_product_version }} + (build {{ atl_product_version_info.json.buildNumber }}) using app key + {{ atl_mpac_jsm_app_key }} and app software IDs + {{ atl_jsm_app_software_ids | join(', ') }}. + + - name: Marketplace OBR - Set selected JSD build version + ansible.builtin.set_fact: + atl_jsd_build_info: "{{ atl_jsd_build_versions | first }}" + - name: Marketplace OBR - Show the returned obr artifact ID ansible.builtin.debug: - msg="obr_artifact_id={{ atl_jsd_build_info.json.versions[0].frameworkDetails.attributes.artifactId }}" + msg="obr_artifact_id={{ atl_jsd_build_info.frameworkDetails.attributes.artifactId }}" - name: Marketplace OBR - Set atl_obr_download_url ansible.builtin.set_fact: - atl_obr_download_url: "{{ atl_mpac_base_url }}/artifacts/{{ atl_jsd_build_info.json.versions[0].frameworkDetails.attributes.artifactId }}/download" + atl_obr_download_url: "{{ atl_mpac_base_url }}/artifacts/{{ atl_jsd_build_info.frameworkDetails.attributes.artifactId }}/download" - name: Marketplace OBR - Set atl_jsd_build ansible.builtin.set_fact: - atl_jsd_build: "{{ atl_jsd_build_info.json.versions[0].versionNumber }}" + atl_jsd_build: "{{ atl_jsd_build_info.versionNumber }}" - name: Marketplace OBR - Show the obr filename ansible.builtin.debug: diff --git a/roles/product_install/tasks/jira-servicedesk_version_latest.yml b/roles/product_install/tasks/jira-servicedesk_version_latest.yml index b64fd6f..73f5f1c 100644 --- a/roles/product_install/tasks/jira-servicedesk_version_latest.yml +++ b/roles/product_install/tasks/jira-servicedesk_version_latest.yml @@ -1,9 +1,29 @@ --- -- name: Fetch the latest version from URL +- name: Resolve JSM app software IDs + ansible.builtin.include_tasks: jira-servicedesk_app_software_ids.yml + +- name: Fetch latest JSM versions for resolved app software IDs + ansible.builtin.uri: + url: "{{ atl_mpac_api_base_url }}/app-software/{{ item }}/versions?parentSoftwareId=jira&state=ACTIVE&limit=1" + return_content: true + loop: "{{ atl_jsm_app_software_ids }}" + loop_control: + label: "{{ item }}" + register: atl_jsm_latest_version_info + +- name: Set compatible latest JSM versions ansible.builtin.set_fact: - atl_product_version_json: "{{ lookup('url', '{{ atl_mpac_api_base_url }}/app-software/{{ atl_mpac_jsm_app_software_id }}/versions?parentSoftwareId=jira&state=ACTIVE&limit=1') }}" + atl_jsm_latest_versions: "{{ atl_jsm_latest_version_info.results | map(attribute='json') | map(attribute='versions') | flatten | list }}" + +- name: Ensure Marketplace returned a latest JSM version + ansible.builtin.assert: + that: + - atl_jsm_latest_versions | length > 0 + fail_msg: >- + Marketplace returned no active JSM version for app key {{ atl_mpac_jsm_app_key }} + using app software IDs {{ atl_jsm_app_software_ids | join(', ') }}. - name: Set the local var to retrieved version ansible.builtin.set_fact: - atl_latest_version: "{{ atl_product_version_json.versions[0].versionNumber }}" + atl_latest_version: "{{ (atl_jsm_latest_versions | first).versionNumber }}"