##############################################################################
# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
---
- name: get http server
  shell: awk -F'=' '/compass_server/ {print $2}' /etc/compass.conf
  register: http_server

- name: creat tacker_home, tacker_client_home, tacker_horizon_home
  shell: |
    mkdir -p /opt/tacker;
    mkdir -p /opt/tacker_client;
    mkdir -p /opt/tacker_horizon;

- name: download tacker package
  get_url:
    url: "http://{{ http_server.stdout_lines[0] }}/packages/tacker/{{ tacker_pkg_name }}"
    dest: /opt/{{ tacker_pkg_name }}

- name: download tacker_client package
  get_url:
    url: "http://{{ http_server.stdout_lines[0] }}/packages/tacker/{{ tacker_client_pkg_name }}"
    dest: /opt/{{ tacker_client_pkg_name }}

- name: download tacker_horizon package
  get_url:
    url: "http://{{ http_server.stdout_lines[0] }}/packages/tacker/{{ tacker_horizon_pkg_name }}"
    dest: /opt/{{ tacker_horizon_pkg_name }}

- name: extract tacker package
  command: |
    su -s /bin/sh -c "tar xzf /opt/{{ tacker_pkg_name }} -C {{ tacker_home }} \
        --strip-components 1 --no-overwrite-dir -k --skip-old-files"

- name: extract tacker_client package
  command: |
    su -s /bin/sh -c "tar xzf /opt/{{ tacker_client_pkg_name }} -C {{ tacker_client_home }} \
        --strip-components 1 --no-overwrite-dir -k --skip-old-files"

- name: extract tacker_horizon package
  command: |
    su -s /bin/sh -c "tar xzf /opt/{{ tacker_horizon_pkg_name }} -C {{ tacker_horizon_home }} \
        --strip-components 1 --no-overwrite-dir -k --skip-old-files"

- name: edit ml2_conf.ini
  shell: |
    crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 extension_drivers port_security;

- name: Restart neutron-server
  service: name=neutron-server state=restarted

- name: "create haproxy configuration for tacker"
  template:
    src: "haproxy-tacker-cfg.j2"
    dest: "/tmp/haproxy-tacker.cfg"

- name: get the current haproxy configuration
  shell: cat /etc/haproxy/haproxy.cfg
  register: ha_cfg

- name: "combination of the haproxy configuration"
  shell: "cat /tmp/haproxy-tacker.cfg >> /etc/haproxy/haproxy.cfg"
  when: ha_cfg.stdout.find('8888') == -1

- name: "delete temporary configuration file"
  file:
    dest: "/tmp/haproxy-tacker.cfg"
    state: "absent"

- name: "restart haproxy"
  service:
    name: "haproxy"
    state: "restarted"

- name: drop and recreate tacker database
  shell: |
    mysql -e "drop database if exists tacker;";
    mysql -e "create database tacker character set utf8;";
    mysql -e "grant all on tacker.* to 'tacker'@'%' identified by 'TACKER_DBPASS';";
  when: inventory_hostname == haproxy_hosts.keys()[0]

- name: get the openstack user info
  shell: . /opt/admin-openrc.sh; openstack user list
  register: user_info

- name: get the openstack service info
  shell: . /opt/admin-openrc.sh; openstack service list
  register: service_info

- name: get the openstack endpoint info
  shell: . /opt/admin-openrc.sh; openstack endpoint list
  register: endpoint_info

- name: delete the existed tacker endpoint
  shell: |
    . /opt/admin-openrc.sh;
    openstack endpoint delete \
        $(openstack endpoint list | grep tacker | awk '{print $2}')
  when: endpoint_info.stdout.find('tacker') != -1
        and inventory_hostname == haproxy_hosts.keys()[0]

- name: delete the existed tacker service
  shell: |
    . /opt/admin-openrc.sh;
    openstack service delete tacker;
  when: service_info.stdout.find('tacker') != -1
        and inventory_hostname == haproxy_hosts.keys()[0]

- name: delete the existed tacker user
  shell: |
    . /opt/admin-openrc.sh;
    openstack user delete tacker;
  when: user_info.stdout.find('tacker') != -1
        and inventory_hostname == haproxy_hosts.keys()[0]

- name: create tacker user with admin privileges
  shell: |
    . /opt/admin-openrc.sh;
    openstack user create --password console tacker;
    openstack role add --project service --user tacker admin;
  when: inventory_hostname == haproxy_hosts.keys()[0]

- name: creat tacker service
  shell: |
    . /opt/admin-openrc.sh;
    openstack service create --name tacker \
        --description "Tacker Project" nfv-orchestration
  when: inventory_hostname == haproxy_hosts.keys()[0]

- name: provide an endpoint to tacker service
  shell: |
    . /opt/admin-openrc.sh; \
    openstack endpoint create --region RegionOne \
        --publicurl 'http://{{ public_vip.ip }}:8888/' \
        --adminurl 'http://{{ internal_vip.ip }}:8888/' \
        --internalurl 'http://{{ internal_vip.ip }}:8888/' tacker
  when: inventory_hostname == haproxy_hosts.keys()[0]

- name: install pip package
  pip: name=Babel state=present version=2.3.4

- name: install pip packages
  shell: |
    pip install tosca-parser heat-translator oslosphinx;

- name: install tacker
  shell: |
    . /opt/admin-openrc.sh; cd {{ tacker_home }}; python setup.py install

- name: create 'tacker' directory in '/var/cache', set ownership and permissions
  shell: |
    mkdir -p /var/cache/tacker

- name: create 'tacker' directory in '/var/log'
  shell: mkdir -p /var/log/tacker

- name: copy tacker configs
  template: src={{ item.src }} dest=/opt/os_templates
  with_items: "{{ tacker_configs_templates }}"

- name: edit tacker configuration file
  shell: |
    crudini --merge /usr/local/etc/tacker/tacker.conf \
        < /opt/os_templates/tacker.j2

- name: populate tacker database
  shell: |
    . /opt/admin-openrc.sh; \
    /usr/local/bin/tacker-db-manage \
        --config-file /usr/local/etc/tacker/tacker.conf upgrade head
  when: inventory_hostname == haproxy_hosts.keys()[0]

- name: install tacker client
  shell: |
    . /opt/admin-openrc.sh; cd {{ tacker_client_home }};
    python setup.py install

- name: install tacker horizon
  shell: |
    . /opt/admin-openrc.sh; cd {{ tacker_horizon_home }};
    python setup.py install

- name: enable tacker horizon in dashboard
  shell: |
    cp {{ tacker_horizon_home }}/openstack_dashboard_extensions/* \
        /usr/share/openstack-dashboard/openstack_dashboard/enabled/

- name: restart apache server
  shell: service apache2 restart

- name: launch tacker-server
  shell: |
    . /opt/admin-openrc.sh; \
    python /usr/local/bin/tacker-server \
        --config-file /usr/local/etc/tacker/tacker.conf |
        --log-file /var/log/tacker/tacker.log
  async: 9999999999999
  poll: 0