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