# Copyright (c) 2018 Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- hosts: jumphost
  become: yes
  vars:
    yardstick_dir: "{{ YARDSTICK_DIR | default('/home/opnfv/repos/yardstick') }}"
    virtual_environment: "{{ VIRTUAL_ENVIRONMENT | default(False) }}"
    nsb_dir: "{{ NSB_DIR | default('/opt/nsb_bin/') }}"

  pre_tasks:

    - name: Create NSB binaries directory, accessible to any user
      file:
        path: "{{ nsb_dir }}"
        state: directory
        owner: root
        mode: 0777
      when:
        - installation_mode != inst_mode_container_pull

  roles:
    - add_repos_jumphost
    - install_dependencies_jumphost
    - { role: install_yardstick, when: installation_mode != inst_mode_container_pull }
    - { role: configure_uwsgi, when: installation_mode != inst_mode_container_pull }
    - { role: configure_nginx, when: installation_mode != inst_mode_container_pull }
    - { role: configure_gui, when: installation_mode != inst_mode_container_pull }
    - { role: download_trex, when: installation_mode != inst_mode_container_pull }
    - { role: install_trex, when: installation_mode != inst_mode_container_pull }
    - { role: configure_rabbitmq, when: installation_mode == inst_mode_baremetal }


  post_tasks:

    - service:
        name: nginx
        state: restarted
      when: installation_mode == inst_mode_baremetal

    - shell: uwsgi -i /etc/yardstick/yardstick.ini
      when: installation_mode == inst_mode_baremetal


- name: Prepare baremetal and standalone servers
  hosts: yardstick-baremetal,yardstick-standalone
  become: yes
  vars_files:
    - roles/download_dpdk/defaults/main.yml
  environment: "{{ proxy_env }}"

  roles:
    - add_custom_repos
    - role: set_package_installer_proxy
      when: proxy_env is defined and proxy_env
    # can't update grub in chroot/docker
    - enable_hugepages_on_boot
    - enable_iommu_on_boot
    # needed for collectd plugins
    - increase_open_file_limits
    - install_image_dependencies
    - role: download_dpdk
      dpdk_version: "{{ dpdk_version_for_PROX }}"
    - role: install_dpdk
      dpdk_version: "{{ dpdk_version_for_PROX }}"
    - download_samplevnfs
    - role: install_samplevnf
      vnf_name: PROX
    - download_dpdk
    - install_dpdk
    - download_trex
    - install_trex
    - download_civetweb
    - install_civetweb
    - role: install_samplevnf
      vnf_name: UDP_Replay
    - role: install_samplevnf
      vnf_name: ACL
    - role: install_samplevnf
      vnf_name: FW
    - role: install_samplevnf
      vnf_name: CGNAPT
    # build shared DPDK for collectd only, required DPDK downloaded already
    - install_dpdk_shared
    - install_rabbitmq
    - download_intel_cmt_cat
    - install_intel_cmt_cat
    - download_pmu_tools
    - install_pmu_tools
    - download_collectd
    - install_collectd
    - docker
    - barometer_collectd


- name: Prepare to build VM
  hosts: jumphost
  become: yes
  vars:
    img_prop_item: "{{ IMG_PROPERTY }}"
    img_arch: "{{ YARD_IMG_ARCH }}"

  tasks:
    - name: Include pre-build
      include_role:
        name: build_yardstick_image
        tasks_from: pre_build.yml
      when:
        - installation_mode != inst_mode_container
        - IMG_PROPERTY == 'nsb' or IMG_PROPERTY == 'normal'


- name: Build VM in chroot
  hosts: chroot_image
  connection: chroot
  become: yes
  vars:
    img_property: "{{ IMG_PROPERTY }}"
  environment: "{{ proxy_env }}"

  tasks:
    - name: Include image build
      include_role:
        name: build_yardstick_image
        tasks_from: "cloudimg_modify_{{ img_property }}.yml"
      when:
        - installation_mode != inst_mode_container
        - IMG_PROPERTY == 'nsb' or IMG_PROPERTY == 'normal'


- name: Clear up after VM is built
  hosts: jumphost
  become: yes

  tasks:
    - name: Include post-build
      include_role:
        name: build_yardstick_image
        tasks_from: post_build.yml
      when:
        - installation_mode != inst_mode_container
        - IMG_PROPERTY == 'nsb' or IMG_PROPERTY == 'normal'


- name: Add OpenStack variables, image
  hosts: jumphost
  vars:
    openrc_flag: false
  vars_files:
    - yardstick_config.yml

  pre_tasks:
    - name: Get information about external VM image
      stat:
        path: "{{ path_to_img }}"
      register: image_file_stat
      when:
        - path_to_img is defined
        - imgfile is not defined

    - set_fact:
        imgfile: "{{ path_to_img }}"
      when:
        - path_to_img is defined
        - imgfile is not defined
        - image_file_stat.stat.islnk is defined
        - not image_file_stat.stat.islnk

    - set_fact:
        openrc_flag: true
      when:
        - openrc_file is defined
        - imgfile is defined

  roles:
    - { role: convert_openrc, when: openrc_file is defined }
    - { role: clean_images, when: openrc_flag }
    - { role: clean_flavors, when: openrc_flag }
    - { role: create_samplevnfs_image, when: openrc_flag }
  environment:
    "{{ openrc | default({}) }}"


- name: Start yardstick container on jumphost
  hosts: jumphost

  tasks:
    - name: Install docker needed to pull Yardstick container
      include_role:
        name: docker
      when: installation_mode == inst_mode_container_pull

    - name: Start yardstick container
      docker_container:
        name: yardstick
        pull: yes
        recreate: yes
        image: "{{ yardstick_docker_image|default('opnfv/yardstick:latest') }}"
        state: started
        restart_policy: always
        privileged: yes
        interactive: yes
        volumes:
          - "{{ openrc_file|default('/dev/null') }}:/etc/yardstick/openstack.creds:ro"
          - /var/run/docker.sock:/var/run/docker.sock
          - /opt:/opt
          - /etc/localtime:/etc/localtime:ro
      when: installation_mode == inst_mode_container_pull