ansible-community / molecule-plugins

Collection on molecule plugins
MIT License
101 stars 67 forks source link

Docker plugin tries to create / delete the same network multiple times #245

Open ollie1 opened 4 months ago

ollie1 commented 4 months ago

When using the docker plugin, if multiple platforms are specified with the same network, the create and destroy playbooks loop through the same network multiple times, trying to create / delete the docker network. This doesn't cause any major problem, as the create / delete network operation is idempotent, but it's inefficient, especially when there are lots of platforms in the same molecule scenario, all sharing the same network.

A minimal example of the molecule.yml to produce this is below:

---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: test1.local
    image: alpine
    pre_build_image: true
    command: ${MOLECULE_DOCKER_COMMAND:-""}
    networks:
      - name: "my-test-network"
    network_mode: "my-test-network"
  - name: test2.local
    image: alpine
    pre_build_image: true
    command: ${MOLECULE_DOCKER_COMMAND:-""}
    networks:
      - name: "my-test-network"
    network_mode: "my-test-network"
provisioner:
  name: ansible
verifier:
  name: ansible

When molecule create is run with the above, it gives the following output (other output removed for clarity) - note that it calls the "create_network.yml" twice:

...
TASK [Create docker network(s)] ************************************************
included: /usr/local/lib/python3.9/site-packages/molecule_plugins/docker/playbooks/tasks/create_network.yml for localhost => (item=my-test-network)
included: /usr/local/lib/python3.9/site-packages/molecule_plugins/docker/playbooks/tasks/create_network.yml for localhost => (item=my-test-network)

TASK [Check if network exist] **************************************************
ok: [localhost]

TASK [Create docker network(s)] ************************************************
changed: [localhost]

TASK [Check if network exist] **************************************************
ok: [localhost]

TASK [Create docker network(s)] ************************************************
skipping: [localhost]
...

This could be easily solved by adding a unique filter to the with_items statements in create.yml and destroy.yml playbooks - i.e. in https://github.com/ansible-community/molecule-plugins/blob/main/src/molecule_plugins/docker/playbooks/create.yml#L90 , change:

      with_items: "{{ molecule_yml.platforms | molecule_get_docker_networks(molecule_labels) }}"

to

      with_items: "{{ molecule_yml.platforms | molecule_get_docker_networks(molecule_labels) | unique }}"

and in https://github.com/ansible-community/molecule-plugins/blob/main/src/molecule_plugins/docker/playbooks/destroy.yml#L49 , change

      loop: "{{ molecule_yml.platforms | molecule_get_docker_networks() }}"

to

      loop: "{{ molecule_yml.platforms | molecule_get_docker_networks() | unique }}"

Happy to submit a PR for this if helpful?