--- - name: Check for alternate obr download url ansible.builtin.set_fact: atl_source_obr_from_marketplace: false when: - atl_obr_download_url is defined - name: Source jira-servicedesk obr from marketplace block: - name: Marketplace OBR - Get the installer product version info ansible.builtin.uri: url: "{{ atl_mpac_products }}/key/jira/versions/name/{{ atl_product_version }}" return_content: yes register: atl_product_version_info - name: Marketplace OBR - Show the returned build number ansible.builtin.debug: msg="buildNumber={{ atl_product_version_info.json.buildNumber }}" - name: Marketplace OBR - Get the JSD build version info ansible.builtin.uri: url: "{{ atl_mpac_products }}/key/jira-servicedesk/versions/latest?application=\ jira&applicationBuild={{ atl_product_version_info.json.buildNumber }}" return_content: yes register: atl_jsd_build_info - name: Marketplace OBR - Show the returned obr binary href ansible.builtin.debug: msg="obr_ref={{ atl_jsd_build_info.json._embedded.artifact._links.binary.href }}" - name: Marketplace OBR - Set atl_obr_download_url ansible.builtin.set_fact: atl_obr_download_url: "{{ atl_jsd_build_info.json._embedded.artifact._links.binary.href }}" - name: Marketplace OBR - Set atl_jsd_build ansible.builtin.set_fact: atl_jsd_build: "{{ atl_jsd_build_info.json.name }}" - name: Marketplace OBR - Show the obr filename ansible.builtin.debug: msg="obr_name=jira-servicedesk-application-{{ atl_jsd_build }}.obr" - name: Marketplace OBR - Set the obr filename ansible.builtin.set_fact: atl_obr_filename: "jira-servicedesk-application-{{ atl_jsd_build }}.obr" when: - atl_source_obr_from_marketplace | bool # When sourcing jira-servicedesk from marketplace the atl_jsd_build is source by querying api. # In this case atl_jsd_build must be passed manually by flag - name: Source jira-servicedesk obr from alternate url block: - name: Alternate URL OBR - Show the obr filename ansible.builtin.debug: msg="obr_name=jira-servicedesk-application-{{ atl_jsd_build }}.obr" - name: Alternate OBR - Set the obr filename ansible.builtin.set_fact: atl_obr_filename: "jira-servicedesk-application-{{ atl_jsd_build }}.obr" when: - not atl_source_obr_from_marketplace | bool - name: is shared_home set ? ansible.builtin.debug: msg="atl_product_home_shared_download_dir={{ atl_product_home_shared_download_dir }}" # For the first run a temp obr should be downloaded but moved to # shared home to ensure all subsequent nodes have access # to the same specific version binary. # To prevent a race condition with multiple downloads at the same time # a directory is used as a lockfile (atomic operation) when moving obr. - name: Set assumptions to avoid race condition ansible.builtin.set_fact: download_obr: true move_obr: false atl_obr_download: "{{ atl_installer_temp }}/{{ atl_obr_filename }}" atl_obr_shared_download: "{{ atl_product_home_shared_download_dir }}/{{ atl_obr_filename }}" atl_obr_moving_lock: "{{ atl_product_home_shared_download_dir }}/{{ atl_obr_filename }}_moving" atl_obr_completed_lock: "{{ atl_product_home_shared_download_dir }}/{{ atl_obr_filename }}_completed" # Check for pre-downloaded obr on shared_home and completed lock dir. - name: Check for completed lock directory ansible.builtin.stat: path: "{{ atl_obr_completed_lock }}" register: completed_lock - name: Check for obr in home_shared ansible.builtin.stat: path: "{{ atl_obr_shared_download }}" register: home_shared_download - name: debug home_shared_download ansible.builtin.debug: var: home_shared_download # If obr exists and lockdir exists use this obr instead - name: Check lock directory and obr exists on shared_home ansible.builtin.set_fact: download_obr: false atl_obr_download: "{{ atl_obr_shared_download }}" when: - home_shared_download.stat.exists - home_shared_download.stat.mimetype is match("application/zip") - completed_lock.stat.isdir is defined - completed_lock.stat.isdir # Fetch obr if required - note we validate it by mimetype rather than checksum due to https://ecosystem.atlassian.net/browse/AMKT-25526 - name: download_obr is true so fetch and do all the things block: - ansible.builtin.debug: var: atl_obr_download_url - ansible.builtin.debug: var: atl_obr_download # Fetch obr and copy to temp - name: Fetch obr ansible.builtin.get_url: url: "{{ atl_obr_download_url }}" dest: "{{ atl_obr_download }}" mode: 0755 force: true timeout: 600 register: atl_obr_completed - name: Confirm the output from the download task ansible.builtin.debug: var: atl_obr_completed # get details about the obr - name: Stat the new obr file ansible.builtin.stat: path: "{{ atl_obr_completed.dest }}" get_mime: yes register: atl_obr_stats when: - atl_obr_completed.dest is defined - name: fail if the downloaded OBR is not a zip file ansible.builtin.fail: msg: "The downloaded OBR was not detected as being a valid ZIP file: {{ atl_obr_stats }}" when: - (atl_obr_stats.stat.mimetype is not defined) or (atl_obr_stats.stat.mimetype is not match("application/zip")) # If obr was fetched make the lock directory - name: Create moving_lock. ansible.builtin.file: path: "{{ atl_obr_moving_lock }}" state: directory when: - atl_obr_completed is succeeded register: moving_lock_created # Directory lock was created by this run? # If so, then set a fact intending to move obr - name: Move obr Scenario - lock created by this run ansible.builtin.set_fact: move_obr: true when: - moving_lock_created is succeeded - moving_lock_created.changed # Otherwise directory lock was either already created or # could not be created. Fall back is to continue and install from temp when: download_obr | bool # If the intention is to move obr to home_shared - name: Move obr to home_shared block: - name: Copy temp installer to home_shared ansible.builtin.copy: src: "{{ atl_obr_download }}" dest: "{{ atl_obr_shared_download }}" remote_src: true register: copied - name: Create completed_lock once obr downloaded and copied ansible.builtin.file: path: "{{ atl_obr_completed_lock }}" state: directory when: copied is succeeded register: completed_lock_created - name: Remove moving_lock to show that obr is completed ansible.builtin.file: path: "{{ atl_obr_moving_lock }}" state: absent when: - completed_lock_created is succeeded - copied is succeeded register: moving_lock_removed - name: Delete old temp installer ansible.builtin.file: path: "{{ atl_obr_download }}" state: absent when: moving_lock_removed is succeeded register: temp_deleted - name: Set install to home_shared location ansible.builtin.set_fact: atl_obr_download: "{{ atl_obr_shared_download }}" when: temp_deleted is succeeded when: move_obr | bool # At this point the binary is in {{ atl_obr_download }} # (which is either on home_shared or temp) - name: Ensure instaled-plugins dir exists ansible.builtin.file: path: "{{ atl_product_home_shared }}/plugins/installed-plugins" state: directory mode: 0750 owner: "{{ atl_product_user }}" group: "{{ atl_product_user }}" # Note as ansible unarchive cant handle "-j junk paths" we need to ignore errors to bypass the path verify - name: Unpack the obr into the atlassian-bundled-plugins dir ansible.builtin.unarchive: remote_src: yes src: "{{ atl_obr_download }}" dest: "{{ atl_product_installation_versioned }}/atlassian-jira/WEB-INF/atlassian-bundled-plugins" creates: "{{ atl_product_installation_versioned }}/atlassian-jira/WEB-INF/atlassian-bundled-plugins/jira-servicedesk-application-{{ atl_jsd_build }}.jar" list_files: no exclude: - M* - obr.xml owner: "{{ atl_product_user }}" group: "{{ atl_product_user }}" mode: 0644 register: obr_unpack - name: Move JSD dependency jars into the bundled-plugins dir # noqa no-handler - ignore lint info about when changed ansible.builtin.copy: remote_src: yes src: "{{ atl_product_installation_versioned }}/atlassian-jira/WEB-INF/atlassian-bundled-plugins/dependencies/" dest: "{{ atl_product_installation_versioned }}/atlassian-jira/WEB-INF/atlassian-bundled-plugins/" when: obr_unpack.changed - name: Remove the empty dependencies folder # noqa no-handler - ignore lint info about when changed ansible.builtin.file: path: "{{ atl_product_installation_versioned }}/atlassian-jira/WEB-INF/atlassian-bundled-plugins/dependencies" state: absent when: obr_unpack.changed