Add rabbitmq.upgrade states

This patch adds granular upgrade states for rabbitmq service.

Change-Id: I886f0cb096794d411fcd85b5a7b6b77f4acbb3a4
Realted-Prod: PROD-29461
diff --git a/README.rst b/README.rst
index 8ffeab8..973164f 100644
--- a/README.rst
+++ b/README.rst
@@ -231,6 +231,50 @@
 to our shutdown script - but that would break any other Erlang apps
 running on the system; it's more "global" than RabbitMQ.
 
+Upgrades
+========
+
+The rabbitmq formula provide set of phases (logical bloks) that will help to
+build flexible upgrade orchestration logic for particular components. The list
+of phases might and theirs descriptions are listed in table below:
+
++-------------------------------+------------------------------------------------------+
+| State                         | Description                                          |
++===============================+======================================================+
+| <app>.upgrade.service_running | Ensure that all services for particular application  |
+|                               | are enabled for autostart and running                |
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.service_stopped | Ensure that all services for particular application  |
+|                               | disabled for autostart and dead                      |
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.pkgs_latest     | Ensure that packages used by particular application  |
+|                               | are installed to latest available version.           |
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.render_config   | Ensure configuration is rendered actual version.     +
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.pre             | We assume this state is applied on all nodes in the  |
+|                               | cloud before running upgrade.                        |
+|                               | Only non destructive actions will be applied during  |
+|                               | this phase. Perform service built in service check   |
+|                               | like (rabbitmqctl cluster_status)                    |
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.upgrade.pre     | Do nothing for now                                   |
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.upgrade         | This state will basically upgrade application on     |
+|                               | particular target. Stop services, render             |
+|                               | configuration, install new packages, start services  |
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.upgrade.post    | Do nothing for now                                   |
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.post            | This phase should be launched only when upgrade of   |
+|                               | the cloud is completed. Cleanup temporary files,     |
+|                               | perform other post upgrade tasks.                    |
++-------------------------------+------------------------------------------------------+
+| <app>.upgrade.verify          | Verify current node is present in running_nodes on   |
+|                               | the cluster.                                         |
++-------------------------------+------------------------------------------------------+
+
+
 Read more
 =========
 
diff --git a/rabbitmq/meta/salt.yml b/rabbitmq/meta/salt.yml
index 4a661a9..9049e44 100644
--- a/rabbitmq/meta/salt.yml
+++ b/rabbitmq/meta/salt.yml
@@ -3,4 +3,8 @@
     priority: 130
   cluster:
     priority: 130
-
+orchestration:
+  upgrade:
+    applications:
+      rabbitmq:
+        priority: 910
diff --git a/rabbitmq/upgrade/pkgs_latest.sls b/rabbitmq/upgrade/pkgs_latest.sls
new file mode 100644
index 0000000..6f4c59a
--- /dev/null
+++ b/rabbitmq/upgrade/pkgs_latest.sls
@@ -0,0 +1,39 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+
+rabbitmq_task_pkgs_latest:
+  test.show_notification:
+    - name: "dump_message_pkgs_latest"
+    - text: "Running rabbitmq.upgrade.pkg_latest"
+
+policy-rc.d_present:
+  file.managed:
+    - name: /usr/sbin/policy-rc.d
+    - mode: 755
+    - contents: |
+        #!/bin/sh
+        exit 101
+
+{%- if server.get('enabled', false) %}
+  {%- if server.version is defined %}
+rabbitmq_packages:
+  pkg.installed:
+  - name: {{ server.pkg }}
+  - version: {{ server.version }}
+  - require:
+    - file: policy-rc.d_present
+  - require_in:
+    - file: policy-rc.d_absent
+  {%- else %}
+rabbitmq_packages:
+  pkg.latest:
+  - name: {{ server.pkg }}
+  - require:
+    - file: policy-rc.d_present
+  - require_in:
+    - file: policy-rc.d_absent
+  {%- endif %}
+{%- endif %}
+
+policy-rc.d_absent:
+  file.absent:
+    - name: /usr/sbin/policy-rc.d
diff --git a/rabbitmq/upgrade/post/init.sls b/rabbitmq/upgrade/post/init.sls
new file mode 100644
index 0000000..2523fec
--- /dev/null
+++ b/rabbitmq/upgrade/post/init.sls
@@ -0,0 +1,17 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+
+rabbitmq_post:
+  test.show_notification:
+    - name: "dump_message_post-upgrade"
+    - text: "Running rabbitmq.upgrade.post"
+
+{%- if server.get('enabled') %}
+
+rabbitmq_status:
+  cmd.run:
+    - name: rabbitmqctl cluster_status
+  {%- if grains.get('noservices') %}
+    - onlyif: /bin/false
+  {%- endif %}
+
+{%- endif %}
diff --git a/rabbitmq/upgrade/pre/init.sls b/rabbitmq/upgrade/pre/init.sls
new file mode 100644
index 0000000..0abec5d
--- /dev/null
+++ b/rabbitmq/upgrade/pre/init.sls
@@ -0,0 +1,17 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+
+rabbitmq_pre:
+  test.show_notification:
+    - name: "dump_message_pre-upgrade_rabbitmq"
+    - text: "Running rabbitmq.upgrade.pre"
+
+{%- if server.get('enabled') %}
+
+rabbitmq_status:
+  cmd.run:
+    - name: rabbitmqctl cluster_status
+  {%- if grains.get('noservices') %}
+    - onlyif: /bin/false
+  {%- endif %}
+
+{%- endif %}
diff --git a/rabbitmq/upgrade/render_config.sls b/rabbitmq/upgrade/render_config.sls
new file mode 100644
index 0000000..2e1ff32
--- /dev/null
+++ b/rabbitmq/upgrade/render_config.sls
@@ -0,0 +1,20 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+
+rabbitmq_render_config:
+  test.show_notification:
+    - name: "dump_message_render_config_rabbitmq"
+    - text: "Running rabbitmq.upgrade.render_config"
+
+{%- if server.get('enabled', false) %}
+
+rabbitmq_config:
+  file.managed:
+  - name: {{ server.config_file }}
+  - source: salt://rabbitmq/files/rabbitmq.config
+  - template: jinja
+  - user: rabbitmq
+  - group: rabbitmq
+  - makedirs: True
+  - mode: 440
+
+{%- endif %}
diff --git a/rabbitmq/upgrade/service_running.sls b/rabbitmq/upgrade/service_running.sls
new file mode 100644
index 0000000..397e0c1
--- /dev/null
+++ b/rabbitmq/upgrade/service_running.sls
@@ -0,0 +1,18 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+
+rabbitmq_task_service_running:
+  test.show_notification:
+    - name: "dump_message_service_running_rabbitmq"
+    - text: "Running rabbitmq.upgrade.service_running"
+
+{%- if server.get('enabled') %}
+
+rabbitmq_service_running:
+  service.running:
+  - enable: true
+  - name: {{ server.service }}
+  {%- if grains.get('noservices') %}
+  - onlyif: /bin/false
+  {%- endif %}
+
+{%- endif %}
diff --git a/rabbitmq/upgrade/service_stopped.sls b/rabbitmq/upgrade/service_stopped.sls
new file mode 100644
index 0000000..25509d2
--- /dev/null
+++ b/rabbitmq/upgrade/service_stopped.sls
@@ -0,0 +1,19 @@
+{%- from "rabbitmq/map.jinja" import server  with context %}
+
+rabbitmq_task_service_stopped:
+  test.show_notification:
+    - name: "dump_message_service_stopped_rabbitmq"
+    - text: "Running rabbitmq.upgrade.service_stopped"
+
+{%- if server.get('enabled') %}
+
+rabbitmq_service_stopped:
+  service.dead:
+  - enable: false
+  - name: {{ server.service }}
+  {%- if grains.get('noservices') %}
+  - onlyif: /bin/false
+  {%- endif %}
+
+{%- endif %}
+
diff --git a/rabbitmq/upgrade/upgrade/init.sls b/rabbitmq/upgrade/upgrade/init.sls
new file mode 100644
index 0000000..d2c83c8
--- /dev/null
+++ b/rabbitmq/upgrade/upgrade/init.sls
@@ -0,0 +1,12 @@
+{%- from "rabbitmq/map.jinja" import service with context %}
+
+rabbitmq_upgrade:
+  test.show_notification:
+    - name: "dump_message_upgrade_rabbitmq"
+    - text: "Running rabbitmq.upgrade.upgrade"
+
+include:
+ - rabbitmq.upgrade.service_stopped
+ - rabbitmq.upgrade.pkgs_latest
+ - rabbitmq.upgrade.render_config
+ - rabbitmq.upgrade.service_running
diff --git a/rabbitmq/upgrade/upgrade/post.sls b/rabbitmq/upgrade/upgrade/post.sls
new file mode 100644
index 0000000..28d112d
--- /dev/null
+++ b/rabbitmq/upgrade/upgrade/post.sls
@@ -0,0 +1,6 @@
+{%- from "rabbitmq/map.jinja" import service with context %}
+
+rabbitmq_upgrade_post:
+  test.show_notification:
+    - name: "dump_message_upgrade_rabbitmq_post"
+    - text: "Running rabbitmq.upgrade.upgrade.post"
diff --git a/rabbitmq/upgrade/upgrade/pre.sls b/rabbitmq/upgrade/upgrade/pre.sls
new file mode 100644
index 0000000..e0ec32f
--- /dev/null
+++ b/rabbitmq/upgrade/upgrade/pre.sls
@@ -0,0 +1,6 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+
+rabbitmq_upgrade_pre:
+  test.show_notification:
+    - name: "dump_message_upgrade_rabbitmq_pre"
+    - text: "Running rabbitmq.upgrade.upgrade.pre"
diff --git a/rabbitmq/upgrade/verify/_service.sls b/rabbitmq/upgrade/verify/_service.sls
new file mode 100644
index 0000000..e212b2a
--- /dev/null
+++ b/rabbitmq/upgrade/verify/_service.sls
@@ -0,0 +1,17 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+
+rabbitmq_task_uprade_verify_service:
+  test.show_notification:
+    - text: "Running rabbitmq.upgrade.verify.service"
+
+{%- if server.get('enabled') %}
+{% set host_id = salt['network.get_hostname']() %}
+
+rabbitmq_status:
+  cmd.run:
+    - name: rabbitmqctl cluster_status |grep -w running_nodes |grep -w {{ host_id }}
+  {%- if grains.get('noservices') %}
+    - onlyif: /bin/false
+  {%- endif %}
+
+{% endif %}
diff --git a/rabbitmq/upgrade/verify/init.sls b/rabbitmq/upgrade/verify/init.sls
new file mode 100644
index 0000000..2b1e44c
--- /dev/null
+++ b/rabbitmq/upgrade/verify/init.sls
@@ -0,0 +1,7 @@
+rabbitmq_upgrade_verify:
+  test.show_notification:
+    - name: "dump_message_upgrade_rabbitmq_verify"
+    - text: "Running rabbitmq.upgrade.verify"
+
+include:
+ - rabbitmq.upgrade.verify._service