Molecule tests for rancher role

Issue-ID: OOM-1775

Change-Id: I6ea11db932cd77e03909e4c72acc4b92a544eb4b
Signed-off-by: Samuli Silvius <s.silvius@partner.samsung.com>
diff --git a/ansible/roles/rancher/.yamllint b/ansible/roles/rancher/.yamllint
new file mode 100644
index 0000000..ad0be76
--- /dev/null
+++ b/ansible/roles/rancher/.yamllint
@@ -0,0 +1,11 @@
+extends: default
+
+rules:
+  braces:
+    max-spaces-inside: 1
+    level: error
+  brackets:
+    max-spaces-inside: 1
+    level: error
+  line-length: disable
+  truthy: disable
diff --git a/ansible/roles/rancher/defaults/main.yml b/ansible/roles/rancher/defaults/main.yml
index 8edc518..6ab52e6 100644
--- a/ansible/roles/rancher/defaults/main.yml
+++ b/ansible/roles/rancher/defaults/main.yml
@@ -2,3 +2,5 @@
 rancher_server_url: "http://{{ hostvars[groups.infrastructure.0].ansible_host }}:8080"
 rancher_remove_other_env: true
 rancher_redeploy_k8s_env: true
+rancher_cluster_health_state: healthy
+rancher_cluster_health_check_retries: 30
diff --git a/ansible/roles/rancher/molecule/default/cleanup.yml b/ansible/roles/rancher/molecule/default/cleanup.yml
new file mode 100644
index 0000000..13b4827
--- /dev/null
+++ b/ansible/roles/rancher/molecule/default/cleanup.yml
@@ -0,0 +1,14 @@
+---
+- name: Cleanup host
+  hosts: localhost
+  roles:
+    - role: cleanup-containers
+      vars:
+        container_list:
+          - rancher-agent
+          - rancher-server
+          # For some reason getting error "Device busy error" when trying to delete directory with root privileges and rancher-containers not anymore running.
+          # - role: cleanup-directories
+          #  vars:
+          #    directories_files_list_to_remove:
+          #      - /var/lib/rancher/
diff --git a/ansible/roles/rancher/molecule/default/group_vars/all.yml b/ansible/roles/rancher/molecule/default/group_vars/all.yml
new file mode 100644
index 0000000..107377c
--- /dev/null
+++ b/ansible/roles/rancher/molecule/default/group_vars/all.yml
@@ -0,0 +1,2 @@
+---
+app_name: molecule-test-app
diff --git a/ansible/roles/rancher/molecule/default/molecule.yml b/ansible/roles/rancher/molecule/default/molecule.yml
new file mode 100644
index 0000000..e6152d5
--- /dev/null
+++ b/ansible/roles/rancher/molecule/default/molecule.yml
@@ -0,0 +1,91 @@
+---
+dependency:
+  name: galaxy
+driver:
+  name: docker
+lint:
+  name: yamllint
+platforms:
+  - name: infrastructure-server
+    image: molecule-${PREBUILD_PLATFORM_DISTRO:-centos}:${PREBUILD_DISTRO_VERSION:-centos7.6}
+    pre_build_image: true
+    privileged: true
+    override_command: false
+    restart_policy: unless-stopped
+    env:
+      container: docker
+    volumes:
+      - /var/run/docker.sock:/var/run/docker.sock
+      - /var/lib/rancher:/var/lib/rancher:ro
+    groups:
+      - infrastructure
+    networks:
+      - name: rancher
+
+  - name: kubernetes-node-1
+    image: molecule-${PREBUILD_PLATFORM_DISTRO:-centos}:${PREBUILD_DISTRO_VERSION:-centos7.6}
+    pre_build_image: true
+    privileged: true
+    override_command: false
+    restart_policy: unless-stopped
+    env:
+      container: docker
+    volumes:
+      - /var/run/docker.sock:/var/run/docker.sock
+      - /var/lib/rancher:/var/lib/rancher:ro
+    groups:
+      - kubernetes
+    networks:
+      - name: rancher
+
+provisioner:
+  name: ansible
+  env:
+    ANSIBLE_ROLES_PATH: ../../../../test/roles
+    ANSIBLE_LIBRARY: ../../../../library
+  inventory:
+    links:
+      group_vars: ../../../../group_vars
+    # 1) When running with molecule-dev container, use this definition and comment out localhost under host_vars (2)
+    hosts:
+      all:
+        hosts:
+          localhost:
+            ansible_connection: ssh
+            ansible_host: ${LOCALHOST_ANSIBLE_HOST:-""}
+            ansible_user: ${LOCALHOST_ANSIBLE_USER:-""}
+            ansible_password: ${LOCALHOST_ANSIBLE_PASSWORD:-""}
+            ansible_sudo_pass: ${LOCALHOST_ANSIBLE_SUDO_PASS:-""}
+            # end of 1)
+            # 2) When running with native molecule installation, use this definition and comment out hosts section under inventory (1)
+            # host_vars:
+            # localhost:
+            #   ansible_sudo_pass: ${LOCALHOST_ANSIBLE_SUDO_PASS:-""}
+            #   ansible_ssh_pass: ${LOCALHOST_ANSIBLE_PASSWORD:-""}
+            # End of 2)
+  lint:
+    name: ansible-lint
+scenario:
+  name: default
+  test_sequence:
+    - lint
+    - cleanup
+    - destroy
+    - dependency
+    - syntax
+    - create
+    - prepare
+    - converge
+    # - idempotence
+    # --> Action: 'idempotence'
+    # ERROR: Idempotence test failed because of the following tasks:
+    # * [infrastructure-server] => rancher : Create rancher kubernetes environment
+    # * [kubernetes-node-1] => rancher : Add Rancher Agent
+    - side_effect
+    - verify
+    - cleanup
+    - destroy
+verifier:
+  name: testinfra
+  lint:
+    name: flake8
diff --git a/ansible/roles/rancher/molecule/default/playbook.yml b/ansible/roles/rancher/molecule/default/playbook.yml
new file mode 100644
index 0000000..e0ef086
--- /dev/null
+++ b/ansible/roles/rancher/molecule/default/playbook.yml
@@ -0,0 +1,28 @@
+---
+- name: Converge rancher master
+  hosts: infrastructure
+  roles:
+    - prepare-common  # molecule specific role needed here to populate cluster_ip
+    - role: rancher
+      vars:
+        mode: server
+        rancher_server_url: "http://{{ cluster_ip }}:8080"
+
+- name: Converge rancher agent
+  hosts: kubernetes
+  roles:
+    - role: rancher
+      vars:
+        mode: agent
+
+- name: Wait for Kubernetes environment to be healthy
+  hosts: infrastructure
+  roles:
+    - role: rancher
+      vars:
+        mode: health
+        rancher_server_url: "http://{{ cluster_ip }}:8080"
+        # Do not get rancher cluster healthy in this env (to be checked),
+        # but it's enough in molecule test to verify we get this unhealthy response
+        rancher_cluster_health_state: unhealthy
+        rancher_cluster_health_check_retries: 40
diff --git a/ansible/roles/rancher/molecule/default/prepare.yml b/ansible/roles/rancher/molecule/default/prepare.yml
new file mode 100644
index 0000000..90159c6
--- /dev/null
+++ b/ansible/roles/rancher/molecule/default/prepare.yml
@@ -0,0 +1,5 @@
+---
+- name: Prepare kube nodes
+  hosts: kubernetes
+  roles:
+    - prepare-docker
diff --git a/ansible/roles/rancher/tasks/rancher_health.yml b/ansible/roles/rancher/tasks/rancher_health.yml
index b032373..b6e8d68 100644
--- a/ansible/roles/rancher/tasks/rancher_health.yml
+++ b/ansible/roles/rancher/tasks/rancher_health.yml
@@ -3,6 +3,6 @@
   uri:
     url: "{{ rancher_server_url }}/v2-beta/projects/{{ k8s_env_id }}"
   register: env_info
-  retries: 30
+  retries: "{{ rancher_cluster_health_check_retries }}"
   delay: 15
-  until: "env_info.json.healthState == 'healthy'"
+  until: env_info.json.healthState == rancher_cluster_health_state
diff --git a/ansible/test/roles/cleanup-containers/tasks/main.yml b/ansible/test/roles/cleanup-containers/tasks/main.yml
new file mode 100644
index 0000000..3a800c9
--- /dev/null
+++ b/ansible/test/roles/cleanup-containers/tasks/main.yml
@@ -0,0 +1,6 @@
+---
+- name: Remove containers
+  docker_container:
+    name: "{{ item }}"
+    state: absent
+  loop: "{{ container_list }}"
diff --git a/ansible/test/roles/prepare-common/tasks/main.yml b/ansible/test/roles/prepare-common/tasks/main.yml
new file mode 100644
index 0000000..11dcbe7
--- /dev/null
+++ b/ansible/test/roles/prepare-common/tasks/main.yml
@@ -0,0 +1,31 @@
+---
+- name: Fetch docker host ip
+  block:
+    - name: Get docker host ip to access host where container running (as dood)
+      shell: |
+        set -o pipefail
+        ip route | awk '/default/ { print $3 }'
+      args:
+        executable: /bin/bash
+      register: ip
+      changed_when: false
+
+    - name: "set docker host ip {{ ip.stdout }} for cluster_ip"
+      set_fact:
+        cluster_ip: "{{ ip.stdout }}"
+  when: inventory_hostname != 'localhost'
+
+- name: Set fact for localhost OS
+  block:
+    - name: set localhost fact
+      set_fact:
+        localhost_ansible_os_family: "{{ hostvars['localhost'].ansible_os_family }}"
+
+    - name: debug
+      debug:
+        var: localhost_ansible_os_family
+  when: hostvars['localhost'].ansible_os_family is defined
+
+- name: debug
+  debug:
+    var: ansible_os_family
\ No newline at end of file