diff --git a/changelogs/fragments/galaxy-collection-fallback.yml b/changelogs/fragments/galaxy-collection-fallback.yml new file mode 100644 index 00000000000..dad92bd8221 --- /dev/null +++ b/changelogs/fragments/galaxy-collection-fallback.yml @@ -0,0 +1,2 @@ +bugfixes: +- ansible-galaxy collection install - fix fallback mechanism if the AH server did not have the collection requested - https://github.com/ansible/ansible/issues/70940 diff --git a/lib/ansible/galaxy/collection.py b/lib/ansible/galaxy/collection.py index bdc287e5927..21d76c1244f 100644 --- a/lib/ansible/galaxy/collection.py +++ b/lib/ansible/galaxy/collection.py @@ -525,11 +525,17 @@ class CollectionRequirement: else: versions = api.get_collection_versions(namespace, name) except GalaxyError as err: - if err.http_code == 404: - display.vvv("Collection '%s' is not available from server %s %s" - % (collection, api.name, api.api_server)) - continue - raise + if err.http_code != 404: + raise + + versions = [] + + # Automation Hub doesn't return a 404 but an empty version list so we check that to align both AH and + # Galaxy when the collection is not available on that server. + if not versions: + display.vvv("Collection '%s' is not available from server %s %s" % (collection, api.name, + api.api_server)) + continue display.vvv("Collection '%s' obtained from server %s %s" % (collection, api.name, api.api_server)) break diff --git a/test/integration/targets/ansible-galaxy-collection/tasks/main.yml b/test/integration/targets/ansible-galaxy-collection/tasks/main.yml index bbbe372cc0b..c4cc9edbb82 100644 --- a/test/integration/targets/ansible-galaxy-collection/tasks/main.yml +++ b/test/integration/targets/ansible-galaxy-collection/tasks/main.yml @@ -154,5 +154,22 @@ - name: automation_hub server: '{{ fallaxy_ah_server }}' +# fake.fake does not exist but we check the output to ensure it checked all 3 +# servers defined in the config. We hardcode to -vvv as that's what level the +# message is shown +- name: test install fallback on server list + command: ansible-galaxy collection install fake.fake -vvv + ignore_errors: yes + environment: + ANSIBLE_CONFIG: '{{ galaxy_dir }}/ansible.cfg' + register: missing_fallback + +- name: assert test install fallback on server list + assert: + that: + - missing_fallback.rc == 1 + - '"Collection ''fake.fake'' is not available from server galaxy" in missing_fallback.stdout' + - '"Collection ''fake.fake'' is not available from server automation_hub" in missing_fallback.stdout' + - name: run ansible-galaxy collection download tests include_tasks: download.yml