---
- name: Restart ovsdpdk-db container
  vars:
    service_name: "ovsdpdk-db"
    service: "{{ ovsdpdk_services[service_name] }}"
    config_json: "{{ ovsdpdk_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
    ovsdpdk_db_container: "{{ check_ovsdpdk_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
  become: true
  kolla_docker:
    action: "recreate_or_restart_container"
    common_options: "{{ docker_common_options }}"
    name: "{{ service.container_name }}"
    image: "{{ service.image }}"
    volumes: "{{ service.volumes }}"
    dimensions: "{{ service.dimensions }}"
  when:
    - kolla_action != "config"
    - service.enabled | bool
    - service.host_in_groups | bool
    - config_json | changed
      or ovsdpdk_db_container | changed
  notify:
    - Waiting the ovs db service to be ready
    - Ensuring ovsdpdk bridges are properly setup indexed
    - Restart ovsdpdk-vswitchd container
    - Ensuring ovsdpdk bridges are properly setup named
    - wait for dpdk tunnel ip
    - ovs-dpdk gather facts

- name: Waiting the ovs db service to be ready
  vars:
    service_name: "ovsdpdk-db"
    service: "{{ ovsdpdk_services[service_name] }}"
  command: docker exec "{{ service.container_name }}" ovs-vsctl --no-wait show
  register: check_result
  until: check_result | success
  changed_when: False
  retries: 30
  delay: 2

- name: Ensuring ovsdpdk bridges are properly setup indexed
  vars:
    service_name: "ovsdpdk-db"
    service: "{{ ovsdpdk_services[service_name] }}"
  command: "docker exec {{ service.container_name }} /bin/sh -c 'CONFIG_FILE={{ container_config_directory }}/ovs-dpdkctl.conf {{ container_config_directory }}/ovs-dpdkctl.sh init'"
  register: status
  changed_when: status.stdout.find('changed') != -1
  when:
    - (inventory_hostname in groups['compute']
       or (enable_manila | bool and inventory_hostname in groups['manila-share'])
       or inventory_hostname in groups['neutron-dhcp-agent']
       or inventory_hostname in groups['neutron-l3-agent']
       or inventory_hostname in groups['neutron-metadata-agent']
    - ovs_physical_port_policy == 'indexed'

- name: Restart ovsdpdk-vswitchd container
  vars:
    service_name: "ovsdpdk-vswitchd"
    service: "{{ ovsdpdk_services[service_name] }}"
    config_json: "{{ ovsdpdk_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
    ovsdpdk_vswitchd_container: "{{ check_ovsdpdk_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
  become: true
  kolla_docker:
    action: "recreate_or_restart_container"
    common_options: "{{ docker_common_options }}"
    name: "{{ service.container_name }}"
    image: "{{ service.image }}"
    volumes: "{{ service.volumes }}"
    privileged: "{{ service.privileged | default(True) }}"
    dimensions: "{{ service.dimensions }}"
  when:
    - kolla_action != "config"
    - service.enabled | bool
    - service.host_in_groups | bool
    - config_json | changed
      or ovsdpdk_vswitchd_container | changed

- name: Ensuring ovsdpdk bridges are properly setup named
  vars:
    service_name: "ovsdpdk-db"
    service: "{{ ovsdpdk_services[service_name] }}"
  command: "docker exec {{ service.container_name }} /bin/sh -c 'CONFIG_FILE={{ container_config_directory }}/ovs-dpdkctl.conf {{ container_config_directory }}/ovs-dpdkctl.sh init'"
  register: status
  changed_when: status.stdout.find('changed') != -1
  when:
    - (inventory_hostname in groups['compute']
       or (enable_manila | bool and inventory_hostname in groups['manila-share'])
       or inventory_hostname in groups['neutron-dhcp-agent']
       or inventory_hostname in groups['neutron-l3-agent']
       or inventory_hostname in groups['neutron-metadata-agent']
    - ovs_physical_port_policy == 'named'

- name: wait for dpdk tunnel ip
  wait_for:
    host: "{{ dpdk_tunnel_interface_address }}"
    timeout: 300
    sleep: 5

- name: ovs-dpdk gather facts
  setup:
    filter: ansible_*
  when:
    - (inventory_hostname in groups['compute']
       or (enable_manila | bool and inventory_hostname in groups['manila-share'])
       or inventory_hostname in groups['neutron-dhcp-agent']
       or inventory_hostname in groups['neutron-l3-agent']
       or inventory_hostname in groups['neutron-metadata-agent']