
# Copyright 2017-present Open Networking Foundation
#
# 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.


---
# head-diag/tasks/main.yml

- name: Create diag_dir subdirs
  file:
    dest="~/{{ diag_dir }}/{{ item }}"
    state=directory
  with_items:
  - head
  - juju
  - openstack
  - onos
  - onos_fabric
  - docker

- name: Head node diag collection
  shell: "{{ item }} > ~/{{ diag_dir }}/head/{{ item | regex_replace('[^\\w-]', '_')}}"
  ignore_errors: yes
  args:
    creates: "~/{{ diag_dir }}/head/{{ item | regex_replace('[^\\w-]', '_')}}"
  with_items:
   - "ifconfig -a"
   - "route -n"
   - "arp -n"
   - "date"
   - "brctl show"
   - "cat /etc/resolv.conf"
   - "cat /etc/lsb-release"
   - "sudo virsh list"
   - "sudo lxc list"
   - "sudo docker ps -a"

- name: Juju diag collection
  shell: "{{ item }} > ~/{{ diag_dir }}/juju/{{ item | regex_replace('[^\\w-]', '_')}}"
  ignore_errors: yes
  args:
    creates: "~/{{ diag_dir }}/juju/{{ item | regex_replace('[^\\w-]', '_')}}"
  with_items:
   - "juju status --format=summary"
   - "juju status --format=tabular"
   - "juju status --format=json"

- name: OpenStack diag collection
  shell: "source /opt/cord_profile/admin-openrc.sh && {{ item }} > ~/{{ diag_dir }}/openstack/{{ item | regex_replace('[^\\w-]', '_')}}"
  ignore_errors: yes
  args:
    executable: "/bin/bash"
    creates: "~/{{ diag_dir }}/openstack/{{ item | regex_replace('[^\\w-]', '_')}}"
  with_items:
   - "glance image-list"
   - "nova list --all-tenants"
   - "nova host-list"
   - "nova hypervisor-list"
   - "keystone tenant-list"
   - "keystone user-list"
   - "neutron net-list"
   - "neutron subnet-list"
   - "neutron port-list"

- name: ONOS diag collection - REST API
  shell: "curl -X GET -u karaf:karaf http://onos-cord:8182/onos/v1/{{ item }} | python -m json.tool > ~/{{ diag_dir }}/onos/rest_{{ item | regex_replace('[^\\w-]', '_') }}"
  ignore_errors: yes
  args:
    creates: "~/{{ diag_dir }}/onos/rest_{{ item | regex_replace('[^\\w-]', '_')}}"
    warn: False # get_url or uri can't easily redirect to a file
  with_items:
   - "hosts"

- name: ONOS diag collection - ONOS CLI
  shell: "sshpass -p 'karaf' ssh -p 8102 karaf@onos-cord {{ item }} > ~/{{ diag_dir }}/onos/{{ item | regex_replace('[^\\w-]', '_') }}"
  ignore_errors: yes
  args:
    creates: "~/{{ diag_dir }}/onos/{{ item | regex_replace('[^\\w-]', '_')}}"
  with_items:
   - "apps -s -a"
   - "bundle:list"
   - "cordvtn-node-check compute1"
   - "cordvtn-nodes"
   - "cordvtn-networks"
   - "cordvtn-ports"
   - "dhcp-list"
   - "devices"
   - "flows"
   - "hosts"
   - "log:display"
   - "nodes"
   - "netcfg"
   - "ports"
   - "summary"

- name: ONOS_FABRIC diag collection - REST API
  shell: "curl -X GET -u karaf:karaf http://onos-fabric:8182/onos/v1/{{ item }} | python -m json.tool > ~/{{ diag_dir }}/onos_fabric/rest_{{ item | regex_replace('[^\\w-]', '_') }}"
  ignore_errors: yes
  args:
    creates: "~/{{ diag_dir }}/onos_fabric/rest_{{ item | regex_replace('[^\\w-]', '_')}}"
    warn: False # get_url or uri can't easily redirect to a file
  with_items:
   - "hosts"

- name: ONOS_FABRIC diag collection - ONOS CLI
  shell: "sshpass -p 'karaf' ssh -p 8101 karaf@onos-fabric {{ item }} > ~/{{ diag_dir }}/onos_fabric/{{ item | regex_replace('[^\\w-]', '_') }}"
  ignore_errors: yes
  args:
    creates: "~/{{ diag_dir }}/onos_fabric/{{ item | regex_replace('[^\\w-]', '_')}}"
  with_items:
   - "apps -s -a"
   - "bundle:list"
   - "hosts"
   - "log:display"
   - "netcfg"
   - "ports"
   - "summary"

- name: Docker diag collection - Find names for all running Docker containers
  command: sudo docker ps --format '{{'{{'}} .Names {{'}}'}}'
  ignore_errors: yes
  register: docker_containers
  tags:
    - skip_ansible_lint # collecting docker container names

- name: Docker diag collection - Collect logs from Docker containers
  shell: "sudo docker logs {{ item }} > ~/{{ diag_dir }}/docker/{{ item | regex_replace('[^\\w-]', '_')}} 2>&1"
  ignore_errors: yes
  args:
    creates: "~/{{ diag_dir }}/docker/{{ item | regex_replace('[^\\w-]', '_')}}"
  with_items: "{{ docker_containers.stdout_lines }}"
  tags:
    - skip_ansible_lint # ansible-lint interprets the \n incorrectly

