---
- name: Create
  hosts: localhost
  connection: local
  gather_facts: false
  no_log: "{{ not (lookup('env', 'MOLECULE_DEBUG') | bool or molecule_yml.provisioner.log|default(false) | bool) }}"
  tasks:
    - name: Log into a Docker registry
      docker_login:
        username: "{{ item.registry.credentials.username }}"
        password: "{{ item.registry.credentials.password }}"
        email: "{{ item.registry.credentials.email | default(omit) }}"
        registry: "{{ item.registry.url }}"
        docker_host: "{{ item.docker_host | default(lookup('env', 'DOCKER_HOST') or 'unix://var/run/docker.sock') }}"
      with_items: "{{ molecule_yml.platforms }}"
      when:
        - item.registry is defined
        - item.registry.credentials is defined
        - item.registry.credentials.username is defined

    - name: Create Dockerfiles from image names
      template:
        src: "{{ molecule_scenario_directory }}/Dockerfile.j2"
        dest: "{{ molecule_ephemeral_directory }}/Dockerfile_{{ item.image | regex_replace('[^a-zA-Z0-9_]', '_') }}"
      with_items: "{{ molecule_yml.platforms }}"
      when: not item.pre_build_image | default(false)
      register: platforms

    - name: Discover local Docker images
      docker_image_facts:
        name: "molecule_local/{{ item.item.name }}"
        docker_host: "{{ item.item.docker_host | default(lookup('env', 'DOCKER_HOST') or 'unix://var/run/docker.sock') }}"
      with_items: "{{ platforms.results }}"
      when: not item.pre_build_image | default(false)
      register: docker_images

    - name: Build an Ansible compatible image
      docker_image:
        path: "{{ molecule_ephemeral_directory }}"
        name: "molecule_local/{{ item.item.image }}"
        docker_host: "{{ item.item.docker_host | default(lookup('env', 'DOCKER_HOST') or 'unix://var/run/docker.sock') }}"
        dockerfile: "{{ item.item.dockerfile | default(item.invocation.module_args.dest) }}"
        force: "{{ item.item.force | default(true) }}"
        pull: "{{ item.item.pull | default(omit) }}"
      with_items: "{{ platforms.results }}"
      when:
        - platforms.changed or docker_images.results | map(attribute='images') | select('equalto', []) | list | count >= 0
        - not item.item.pre_build_image | default(false)

    - name: Create docker network(s)
      docker_network:
        name: "{{ item }}"
        docker_host: "{{ item.docker_host | default(lookup('env', 'DOCKER_HOST') or 'unix://var/run/docker.sock') }}"
        state: present
        driver: l2bridge
        driver_options:
          com.docker.network.windowsshim.interface: Ethernet0
      with_items: "{{ molecule_yml.platforms | molecule_get_docker_networks }}"

    - name: Create molecule instance(s)
      docker_container:
        name: "{{ item.name }}"
        docker_host: "{{ item.docker_host | default(lookup('env', 'DOCKER_HOST') or 'unix://var/run/docker.sock') }}"
        hostname: "{{ item.hostname | default(item.name) }}"
        image: "{{ item.pre_build_image | default(false) | ternary('', 'molecule_local/') }}{{ item.image }}"
        state: started
        recreate: false
        log_driver: json-file
        command: "{{ item.command | default('bash -c \"while true; do sleep 10000; done\"') }}"
        privileged: "{{ item.privileged | default(omit) }}"
        security_opts: "{{ item.security_opts | default(omit) }}"
        volumes: "{{ item.volumes | default(omit) }}"
        tmpfs: "{{ item.tmpfs | default(omit) }}"
        capabilities: "{{ item.capabilities | default(omit) }}"
        exposed_ports: "{{ item.exposed_ports | default(omit) }}"
        published_ports: "{{ item.published_ports | default(omit) }}"
        ulimits: "{{ item.ulimits | default(omit) }}"
        networks: "{{ item.networks | default(omit) }}"
        network_mode: "{{ item.network_mode | default(omit) }}"
        dns_servers: "{{ item.dns_servers | default(omit) }}"
        env: "{{ item.env | default(omit) }}"
        restart_policy: "{{ item.restart_policy | default(omit) }}"
        restart_retries: "{{ item.restart_retries | default(omit) }}"
      register: server
      with_items: "{{ molecule_yml.platforms }}"
      async: 7200
      poll: 0

    - name: Wait for instance(s) creation to complete
      async_status:
        jid: "{{ item.ansible_job_id }}"
      register: docker_jobs
      until: docker_jobs.finished
      retries: 300
      with_items: "{{ server.results }}"