Merge "Adding states to perform horizon upgrade"
diff --git a/horizon/map.jinja b/horizon/map.jinja
index 8e5f9fe..bac43f0 100644
--- a/horizon/map.jinja
+++ b/horizon/map.jinja
@@ -41,3 +41,4 @@
     },
 }, merge=salt['pillar.get']('horizon:server')) %}
 
+{% set upgrade = pillar.get('horizon', {}).get('upgrade', {}) %}
diff --git a/horizon/meta/salt.yml b/horizon/meta/salt.yml
index 1c0e954..104e09e 100644
--- a/horizon/meta/salt.yml
+++ b/horizon/meta/salt.yml
@@ -4,3 +4,8 @@
     require:
     - salt: keystone.server
 
+orchestration:
+  upgrade:
+    applications:
+      horizon:
+        priority: 1800
diff --git a/horizon/upgrade/pkgs_latest.sls b/horizon/upgrade/pkgs_latest.sls
new file mode 100644
index 0000000..812d9cd
--- /dev/null
+++ b/horizon/upgrade/pkgs_latest.sls
@@ -0,0 +1,65 @@
+{%- from "horizon/map.jinja" import server with context %}
+
+horizon_task_pkgs_latest:
+  test.show_notification:
+    - name: "dump_message_pkgs_latest_horizon"
+    - text: "Running horizon.upgrade.pkgs_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) %}
+
+horizon_packages:
+  pkg.latest:
+  - names: {{ server.pkgs|unique }}
+  - require:
+    - file: policy-rc.d_present
+  - require_in:
+    - file: policy-rc.d_absent
+
+horizon_apache_package_absent:
+  pkg.purged:
+  - name: openstack-dashboard-apache
+  - require:
+    - pkg: horizon_packages
+
+{%- endif %}
+
+{%- if server.plugin is defined %}
+
+{%- if server.plugin.horizon_theme is defined %}
+
+horizon_horizon_theme_package:
+  pkg.latest:
+  - name: {{ server.plugin.horizon_theme.source.name }}
+
+{%- endif %}
+
+{%- for plugin_name, plugin in server.get('plugin', {}).iteritems() %}
+
+{%- if plugin_name != "horizon_theme" %}
+
+horizon_{{ plugin_name }}_package:
+  pkg.latest:
+  - name: {{ plugin.source.name }}
+  {%- if server.get('plugin', {}).horizon_theme is defined %}
+  - require:
+    - pkg: horizon_horizon_theme_package
+  {%- endif %}
+
+{%- endif %}
+
+{%- endfor %}
+
+{%- endif %}
+
+policy-rc.d_absent:
+  file.absent:
+    - name: /usr/sbin/policy-rc.d
+
diff --git a/horizon/upgrade/post/init.sls b/horizon/upgrade/post/init.sls
new file mode 100644
index 0000000..38629fc
--- /dev/null
+++ b/horizon/upgrade/post/init.sls
@@ -0,0 +1,4 @@
+horizon_post:
+  test.show_notification:
+    - name: "dump_post-upgrade_message_horizon"
+    - text: "Running horizon.upgrade.post"
diff --git a/horizon/upgrade/pre/init.sls b/horizon/upgrade/pre/init.sls
new file mode 100644
index 0000000..fca7de7
--- /dev/null
+++ b/horizon/upgrade/pre/init.sls
@@ -0,0 +1,4 @@
+horizon_pre:
+  test.show_notification:
+    - name: "dump_pre-upgrade_message_horizon"
+    - text: "Running horizon.upgrade.pre"
diff --git a/horizon/upgrade/render_config.sls b/horizon/upgrade/render_config.sls
new file mode 100644
index 0000000..2379a91
--- /dev/null
+++ b/horizon/upgrade/render_config.sls
@@ -0,0 +1,62 @@
+{%- from "horizon/map.jinja" import server, upgrade with context %}
+
+horizon_render_config:
+  test.show_notification:
+    - name: "dump_message_render_config_horizon"
+    - text: "Running horizon.upgrade.render_config"
+
+{%- if server.get('enabled', false) %}
+
+horizon_config:
+  file.managed:
+  - name: {{ server.config }}
+  - source: salt://horizon/files/local_settings/{{ server.version }}_settings.py
+  - template: jinja
+  - mode: 640
+  - user: root
+  - group: horizon
+
+{%- for policy_name, policy in server.get('policy', {}).iteritems() %}
+
+{%- if policy.get('enabled', True) %}
+{%- if policy.get('source', 'file') == 'mine' %}
+
+{%- set service_grains = salt['mine.get'](policy['host'], 'grains.items') %}
+{%- set service_policy = service_grains.get(policy['host'], {}).get(policy['grain_name'], {}) %}
+
+{%- if service_policy %}
+
+horizon_policy_{{ policy_name }}_mine:
+  file.serialize:
+  - name: {{ policy.get('path', server.get('policy_files_path')) }}/{{ policy.get('name') }}
+  - dataset: {{ service_policy }}
+  - formatter: JSON
+  - require:
+    - file: horizon_config
+
+{%- endif %}
+
+{%- elif policy.get('source', 'file') == 'file' %}
+
+horizon_policy_{{ policy_name }}_file:
+  file.managed:
+  - name: {{ policy.get('path', server.get('policy_files_path')) }}/{{ policy.get('name') }}
+  - source: salt://horizon/files/policy/{{ server.version }}/{{ policy.get('name') }}
+  - require:
+    - file: horizon_config
+
+{%- endif %}
+{%- endif %}
+
+{%- endfor %}
+
+horizon_apache_config:
+  file.managed:
+  - name: {{ server.apache_config }}
+  - source: salt://horizon/files/openstack-dashboard.conf.{{ grains.os_family }}
+  - template: jinja
+  - mode: 644
+  - user: root
+  - group: root
+
+{%- endif %}
diff --git a/horizon/upgrade/service_running.sls b/horizon/upgrade/service_running.sls
new file mode 100644
index 0000000..7424175
--- /dev/null
+++ b/horizon/upgrade/service_running.sls
@@ -0,0 +1,15 @@
+{%- from "horizon/map.jinja" import server with context %}
+
+horizon_task_service_running:
+  test.show_notification:
+    - name: "dump_message_service_running_horizon"
+    - text: "Running horizon.upgrade.service_running"
+
+{%- if server.get('enabled', false) %}
+
+horizon_server_services:
+  service.running:
+  - name: {{ server.service }}
+  - enable: true
+
+{%- endif %}
diff --git a/horizon/upgrade/service_stopped.sls b/horizon/upgrade/service_stopped.sls
new file mode 100644
index 0000000..8cbc278
--- /dev/null
+++ b/horizon/upgrade/service_stopped.sls
@@ -0,0 +1,15 @@
+{%- from "horizon/map.jinja" import server with context %}
+
+dump_notification_service_stopped_horizon:
+  test.show_notification:
+    - name: "dump_message_service_stopped_horizon"
+    - text: "Running horizon.upgrade.service_stopped"
+
+{%- if server.get('enabled', false) %}
+
+horizon_server_services_stopped:
+  service.dead:
+  - name: {{ server.service }}
+  - enable: false
+
+{%- endif %}
diff --git a/horizon/upgrade/upgrade/init.sls b/horizon/upgrade/upgrade/init.sls
new file mode 100644
index 0000000..203fb8b
--- /dev/null
+++ b/horizon/upgrade/upgrade/init.sls
@@ -0,0 +1,12 @@
+{%- from "horizon/map.jinja" import server with context %}
+
+horizon_upgrade:
+  test.show_notification:
+    - name: "dump_message_upgrade_horizon"
+    - text: "Running horizon.upgrade.upgrade"
+
+include:
+ - horizon.upgrade.service_stopped
+ - horizon.upgrade.pkgs_latest
+ - horizon.upgrade.render_config
+ - horizon.upgrade.service_running
diff --git a/horizon/upgrade/verify/api.sls b/horizon/upgrade/verify/api.sls
new file mode 100644
index 0000000..72d5096
--- /dev/null
+++ b/horizon/upgrade/verify/api.sls
@@ -0,0 +1,16 @@
+{%- from "horizon/map.jinja" import server with context %}
+
+horizon_upgrade_verify_api:
+  test.show_notification:
+    - name: "dump_message_verify_api_horizon"
+    - text: "Running horizon.upgrade.verify.api"
+
+{%- if server.get('enabled', false) %}
+{%- set horizon_server = '127.0.0.1' if server.get('bind', {}).get('address') == '0.0.0.0' else server.get('bind', {}).get('address') %}
+
+horizon_http_listen:
+  http.query:
+    - name: http://{{ horizon_server }}:{{ server.get('bind', {}).get('port', 80) }}
+    - status: 200
+
+{%- endif %}