Adding role for application handling

this ansible role contains application specific tasks, it is
written in generic way and different helm charts can be used as
application. In addition operator can provide proprietary pre_install
and post_install hooks.

Change-Id: Ibe4b330e5a725dde41aca9f6a59d702cfaba6f52
Issue-ID: OOM-1551
Signed-off-by: Michal Ptacek <m.ptacek@partner.samsung.com>
diff --git a/ansible/roles/application-install/tasks/custom_role.yml b/ansible/roles/application-install/tasks/custom_role.yml
new file mode 100644
index 0000000..3c6237e
--- /dev/null
+++ b/ansible/roles/application-install/tasks/custom_role.yml
@@ -0,0 +1,9 @@
+---
+# Caller fills application_custom_role variable with actual role name.
+- name: "Execute custom role {{ application_custom_role }} {{ phase }} Helm install."
+  include_role:
+    name: "{{ application_custom_role }}"
+  when:
+    - application_custom_role is defined
+    - application_custom_role is not none
+    - application_custom_role | trim != ''
diff --git a/ansible/roles/application-install/tasks/install.yml b/ansible/roles/application-install/tasks/install.yml
index 54b6443..7ff6b62 100644
--- a/ansible/roles/application-install/tasks/install.yml
+++ b/ansible/roles/application-install/tasks/install.yml
@@ -5,9 +5,14 @@
      --upgrade
      --skip-refresh
 
-- name: Wait for helm
-  wait_for: timeout=10
-  delegate_to: localhost
+#A correct way to implement this would be using --wait option in helm init invocation.
+#However, it does not work due to https://github.com/helm/helm/issues/4031 (fixed in newer helm release)
+- name: "Wait for helm upgrade to finish"
+  command: "{{ helm_bin_dir }}/helm version --tiller-connection-timeout 10"
+  register: result
+  until: result.rc == 0
+  delay: 10
+  retries: 12
 
 - name: Get all helm repos
   command: "{{ helm_bin_dir }}/helm repo list"
@@ -27,8 +32,10 @@
 
 - name: Helm Make All
   make:
-    chdir: "{{ app_helm_charts_directory }}"
+    chdir: "{{ app_helm_charts_infra_directory }}"
     target: all
+  environment:
+    PATH: "{{ helm_bin_dir }}:{{ ansible_env.PATH }}"
 
 - name: Helm Install application {{ app_name }}
-  command: "helm install {{ helm_repository_name }}/{{ app_helm_chart_name }} --name {{ app_helm_release_name }} --namespace {{ app_kubernetes_namespace }}"
+  command: "{{ helm_bin_dir }}/helm install {{ helm_repository_name }}/{{ app_helm_chart_name }} --name {{ app_helm_release_name }} --namespace {{ app_kubernetes_namespace }}"
diff --git a/ansible/roles/application-install/tasks/post-install.yml b/ansible/roles/application-install/tasks/post-install.yml
new file mode 100644
index 0000000..1059423
--- /dev/null
+++ b/ansible/roles/application-install/tasks/post-install.yml
@@ -0,0 +1,5 @@
+---
+- name: "Execute custome role {{ application_post_install_role }} if defined."
+  include_tasks: custom_role.yml
+  vars:
+    application_custom_role: "{{ application_post_install_role }}"
diff --git a/ansible/roles/application-install/tasks/pre-install.yml b/ansible/roles/application-install/tasks/pre-install.yml
new file mode 100644
index 0000000..b782ca7
--- /dev/null
+++ b/ansible/roles/application-install/tasks/pre-install.yml
@@ -0,0 +1,23 @@
+---
+# before custom specific code is executed we need to move helm charts to infra
+- name: Distribute helm charts to infra node
+  block:
+    - name: Archive helm charts
+      archive:
+        path: "{{ app_helm_charts_install_directory }}/*"
+        dest: "{{ app_helm_charts_install_directory }}.tgz"
+      delegate_to: localhost
+    - name: Create helm charts dir on infra
+      file:
+        path: "{{ app_helm_charts_infra_directory }}"
+        state: directory
+        mode: 0755
+    - name: Unarchive helm charts on infra node
+      unarchive:
+        src: "{{ app_helm_charts_install_directory }}.tgz"
+        dest: "{{ app_helm_charts_infra_directory }}"
+
+- name: "Execute custome role {{ application_pre_install_role }} if defined."
+  include_tasks: custom_role.yml
+  vars:
+    application_custom_role: "{{ application_pre_install_role }}"