ansible / galaxy_collection

Collection of modules and roles to configure Automation Hub
GNU General Public License v3.0
54 stars 50 forks source link

infra.ah_configuration.ah_collection can't delete collections from Private Automation Hub #410

Open Alex-Bron opened 2 weeks ago

Alex-Bron commented 2 weeks ago

Summary

Using infra.ah_configuration.ah_collection with state 'absent' as to delete collections from a repository appears not to be working. There are a couple of bugs present, and actual deletion does not happen.

Issue Type

Ansible, Collection, Private Automation Hub details

ansible --version
ansible [core 2.15.10]

Private Automation Hub version
Server version: 4.9.2
Pulp Ansible Version: 0.20.7
Pulp Container Version: 2.15.5
Pulp Core Version: 3.28.27
Ansible Automation Platform: 2.4

OS / ENVIRONMENT

Not applicable: management of Private Automation Hub via Ansible

Desired Behavior

Using the task:

    - name: Delete all found collections from the repos
      infra.ah_configuration.ah_collection:
        ah_host: "{{ ah_url }}"
        ah_token: "{{ ah_token }}"
        namespace: "{{ this_collection.namespace }}"
        name: "{{ this_collection.name }}"
        state: absent

I want to delete a specific collection from the system.

Actual Behavior

First error that happens is stating:

ansible_collections/infra/ah_configuration/plugins/modules/ah_collection.py\", line 146, in main\r\nAttributeError: 'NoneType' object has no attribute 'split'\r\n

It turns out that the parameter 'auto_approve' is checked regardless of the parameter 'state'; by setting 'auto_approve' to 'false' I can work around this problem.

With the added 'auto_approve: false' the task will run, but it will either return 'ok' for some collections, or it will raise an exception for others. Output of the exception is:

Traceback (most recent call last):\r\n  File \"/home/ansible/.ansible/tmp/ansible-tmp-1718827337.1524935-36-220491761771436/AnsiballZ_ah_collection.py\", line 107, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ansible/.ansible/tmp/ansible-tmp-1718827337.1524935-36-220491761771436/AnsiballZ_ah_collection.py\", line 99, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ansible/.ansible/tmp/ansible-tmp-1718827337.1524935-36-220491761771436/AnsiballZ_ah_collection.py\", line 48, in invoke_module\r\n    run_name='__main__', alter_sys=True)\r\n  File \"/usr/lib64/python3.6/runpy.py\", line 205, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib64/python3.6/runpy.py\", line 96, in _run_module_code\r\n    mod_name, mod_spec, pkg_name, script_name)\r\n  File \"/usr/lib64/python3.6/runpy.py\", line 85, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_infra.ah_configuration.ah_collection_payload_lfzhbfyb/ansible_infra.ah_configuration.ah_collection_payload.zip/ansible_collections/infra/ah_configuration/plugins/modules/ah_collection.py\", line 227, in <module>\r\n  File \"/tmp/ansible_infra.ah_configuration.ah_collection_payload_lfzhbfyb/ansible_infra.ah_configuration.ah_collection_payload.zip/ansible_collections/infra/ah_configuration/plugins/modules/ah_collection.py\", line 163, in main\r\nKeyError: 'task'\r\n"

It seems that this has to do with whether or not a collection has dependencies. However for the collections where the task returns 'ok', nothing is actually deleted.

STEPS TO REPRODUCE

Run the following playbook against a Private Automation Hub - fill in the hostname, username and password of the hub.

- name: Playbook to cleanup collections from Private Automation Hub
  hosts: hub
  gather_facts: false
  run_once: true
  vars:
    aap_platform_ah_username: "{{ uc_content_1 }}"
    aap_platform_ah_password: "{{ uc_content_2 }}"
    ah_collection_repos:
      - community
  tasks:
    - name: Get an authentication token from the Hub
      infra.ah_configuration.ah_token:
        ah_host: "{{ ah_url }}"
        ah_username: "{{ lookup('file', aap_platform_ah_username) }}"
        ah_password: "{{ lookup('file', aap_platform_ah_password) }}"
        state: present
      no_log: true
    - name: Query the Automation Hub for all collections it knows
      ansible.builtin.set_fact:
        ah_collections: |
          {{ ah_collections | default([]) +
            lookup('infra.ah_configuration.ah_api', 'collections', this_repo,
            host=ah_url,
            username=lookup('file', aap_platform_ah_username),
            password=lookup('file', aap_platform_ah_password),
            return_all=true) }}
      loop: "{{ ah_collection_repos }}"
      loop_control:
        loop_var: this_repo
      no_log: true
    - name: Delete all found collections from the repos
      infra.ah_configuration.ah_collection:
        ah_host: "{{ ah_url }}"
        ah_token: "{{ ah_token }}"
        namespace: "{{ this_collection.namespace }}"
        name: "{{ this_collection.name }}"
        state: absent
        auto_approve: false
      loop: "{{ ah_collections }}"
      loop_control:
        loop_var: this_collection
    - name: Delete this token
      infra.ah_configuration.ah_token:
        ah_host: "{{ ah_url }}"
        ah_token: "{{ ah_token }}"
        state: absent