Adjust Panko formula granularity

- added upgrade states
- added client state

Change-Id: I2a8b94e429f6b11b8c718ea88678f9a35aa77d32
Related-Prod: https://mirantis.jira.com/browse/PROD-21939
diff --git a/.travis.yml b/.travis.yml
index 513e74e..3262a14 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,8 +21,6 @@
   - bundle install
 
 env:
-  - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 OS_VERSION=pike SUITE=server-cluster
-  - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2016.3 OS_VERSION=pike SUITE=server-single
   - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 OS_VERSION=pike SUITE=server-cluster
   - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 OS_VERSION=pike SUITE=server-single
   - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 OS_VERSION=pike SUITE=server-cluster
diff --git a/panko/client.sls b/panko/client.sls
new file mode 100644
index 0000000..54fc75f
--- /dev/null
+++ b/panko/client.sls
@@ -0,0 +1,8 @@
+{%- from "panko/map.jinja" import client with context %}
+{%- if client.enabled %}
+
+panko_client_packages:
+  pkg.installed:
+  - names: {{ client.pkgs }}
+
+{%- endif %}
\ No newline at end of file
diff --git a/panko/db/offline_sync.sls b/panko/db/offline_sync.sls
new file mode 100644
index 0000000..251e2bb
--- /dev/null
+++ b/panko/db/offline_sync.sls
@@ -0,0 +1,8 @@
+{%- from "panko/map.jinja" import server with context %}
+
+panko_syncdb:
+  cmd.run:
+  - name: panko-dbsync
+  {%- if grains.get('noservices') or server.get('role', 'primary') == 'secondary' %}
+  - onlyif: /bin/false
+  {%- endif %}
diff --git a/panko/init.sls b/panko/init.sls
index bfdf23f..00d92bf 100644
--- a/panko/init.sls
+++ b/panko/init.sls
@@ -3,3 +3,6 @@
 {%- if pillar.panko.server is defined %}
 - panko.server
 {%- endif %}
+{%- if pillar.panko.client is defined %}
+- panko.client
+{%- endif %}
diff --git a/panko/map.jinja b/panko/map.jinja
index c0f1e3f..2108f6d 100644
--- a/panko/map.jinja
+++ b/panko/map.jinja
@@ -3,6 +3,7 @@
 Debian:
   pkgs:
     - panko-api
+  service_name: apache2
   cacert_file: '/etc/ssl/certs/ca-certificates.crt'
   expirer:
     cron:
@@ -16,4 +17,14 @@
 
 {%- endload %}
 
+{%- load_yaml as client_defaults %}
+
+Debian:
+  enabled: false
+  pkgs:
+    - python-pankoclient
+{%- endload %}
+
 {%- set server = salt['grains.filter_by'](base_defaults, merge=salt['pillar.get']('panko:server')) %}
+{%- set client = salt['grains.filter_by'](client_defaults, merge=salt['pillar.get']('panko:client')) %}
+{%- set upgrade = pillar.get('panko', {}).get('upgrade', {}) %}
diff --git a/panko/meta/salt.yml b/panko/meta/salt.yml
new file mode 100644
index 0000000..4d48208
--- /dev/null
+++ b/panko/meta/salt.yml
@@ -0,0 +1,5 @@
+orchestration:
+  upgrade:
+    applications:
+      panko:
+        priority: 1900
diff --git a/panko/server.sls b/panko/server.sls
index c3efa2c..2e85687 100644
--- a/panko/server.sls
+++ b/panko/server.sls
@@ -5,12 +5,14 @@
 include:
   - apache
   - panko._ssl.mysql
+  - panko.db.offline_sync
 
 panko_server_packages:
   pkg.installed:
   - names: {{ server.pkgs }}
   - require_in:
     - sls: panko._ssl.mysql
+    - sls: panko.db.offline_sync
 
 /etc/panko/panko.conf:
   file.managed:
@@ -21,6 +23,8 @@
   - require:
     - sls: panko._ssl.mysql
     - pkg: panko_server_packages
+  - require_in:
+    - sls: panko.db.offline_sync
 
 {% if server.logging.log_appender %}
 
@@ -50,6 +54,8 @@
 {%- if server.logging.log_handlers.get('fluentd', {}).get('enabled', False) %}
       - pkg: panko_fluentd_logger_package
 {%- endif %}
+    - require_in:
+      - sls: panko.db.offline_sync
     - watch_in:
       - service: panko_apache_restart
 {% endif %}
@@ -78,15 +84,6 @@
       - file: /etc/panko/panko.conf
 {%- endif %}
 
-panko_syncdb:
-  cmd.run:
-  - name: panko-dbsync
-  {%- if grains.get('noservices') %}
-  - onlyif: /bin/false
-  {%- endif %}
-  - require:
-    - file: /etc/panko/panko.conf
-
 {#- Creation of sites using templates is deprecated, sites should be generated by apache pillar, and enabled by panko formula #}
 {%- if pillar.get('apache', {}).get('server', {}).get('site', {}).panko is defined %}
 
@@ -122,7 +119,7 @@
 panko_apache_restart:
   service.running:
   - enable: true
-  - name: apache2
+  - name: {{ server.service_name }}
   {%- if grains.get('noservices') %}
   - onlyif: /bin/false
   {%- endif %}
@@ -131,5 +128,6 @@
     - apache_enable_panko_wsgi
   - require:
     - sls: panko._ssl.mysql
+    - sls: panko.db.offline_sync
 
 {%- endif %}
diff --git a/panko/upgrade/pkgs_latest.sls b/panko/upgrade/pkgs_latest.sls
new file mode 100644
index 0000000..8607425
--- /dev/null
+++ b/panko/upgrade/pkgs_latest.sls
@@ -0,0 +1,33 @@
+{%- from "panko/map.jinja" import server,client,upgrade with context %}
+
+panko_task_pkg_latest:
+  test.show_notification:
+    - text: "Running panko.upgrade.pkg_latest"
+
+policy-rc.d_present:
+  file.managed:
+    - name: /usr/sbin/policy-rc.d
+    - mode: 755
+    - contents: |
+        #!/bin/sh
+        exit 101
+
+{%- set pkgs = [] %}
+{%- if server.enabled %}
+  {%- do pkgs.extend(server.pkgs) %}
+{%- endif %}
+{%- if client.enabled %}
+  {%- do pkgs.extend(client.pkgs) %}
+{%- endif %}
+
+panko_pkg_latest:
+  pkg.latest:
+  - names: {{ pkgs|unique }}
+  - require:
+    - file: policy-rc.d_present
+  - require_in:
+    - file: policy-rc.d_absent
+
+policy-rc.d_absent:
+  file.absent:
+    - name: /usr/sbin/policy-rc.d
diff --git a/panko/upgrade/post/init.sls b/panko/upgrade/post/init.sls
new file mode 100644
index 0000000..a0df2ce
--- /dev/null
+++ b/panko/upgrade/post/init.sls
@@ -0,0 +1,7 @@
+panko_post:
+  test.show_notification:
+    - text: "Running panko.upgrade.post"
+
+keystone_os_client_config_absent:
+  file.absent:
+    - name: /etc/openstack/clouds.yml
diff --git a/panko/upgrade/pre/init.sls b/panko/upgrade/pre/init.sls
new file mode 100644
index 0000000..2a7ec69
--- /dev/null
+++ b/panko/upgrade/pre/init.sls
@@ -0,0 +1,14 @@
+panko_pre:
+  test.show_notification:
+    - text: "Running panko.upgrade.pre"
+
+{%- set os_content = salt['mine.get']('I@keystone:client:os_client_config:enabled:true', 'keystone_os_client_config', 'compound').values()[0] %}
+keystone_os_client_config:
+  file.managed:
+    - name: /etc/openstack/clouds.yml
+    - contents: |
+        {{ os_content |yaml(False)|indent(8) }}
+    - user: 'root'
+    - group: 'root'
+    - makedirs: True
+    - unless: test -f /etc/openstack/clouds.yml
\ No newline at end of file
diff --git a/panko/upgrade/render_config.sls b/panko/upgrade/render_config.sls
new file mode 100644
index 0000000..c4683eb
--- /dev/null
+++ b/panko/upgrade/render_config.sls
@@ -0,0 +1,12 @@
+{%- from "panko/map.jinja" import server with context %}
+
+panko_render_config:
+  test.show_notification:
+    - text: "Running panko.upgrade.render_config"
+
+{%- if server.enabled %}
+/etc/panko/panko.conf:
+  file.managed:
+  - source: salt://panko/files/{{ server.version }}/panko.conf.{{ grains.os_family }}
+  - template: jinja
+{%- endif %}
diff --git a/panko/upgrade/service_running.sls b/panko/upgrade/service_running.sls
new file mode 100644
index 0000000..c9c8cc5
--- /dev/null
+++ b/panko/upgrade/service_running.sls
@@ -0,0 +1,12 @@
+{%- from "panko/map.jinja" import server,upgrade with context %}
+
+panko_task_service_running:
+  test.show_notification:
+    - text: "Running panko.upgrade.service_running"
+
+{%- if server.enabled %}
+panko_service_running_{{ server.service_name }}:
+  service.running:
+  - name: {{ server.service_name }}
+  - enable: True
+{%- endif %}
diff --git a/panko/upgrade/service_stopped.sls b/panko/upgrade/service_stopped.sls
new file mode 100644
index 0000000..ed1b9c6
--- /dev/null
+++ b/panko/upgrade/service_stopped.sls
@@ -0,0 +1,12 @@
+{%- from "panko/map.jinja" import server,upgrade with context %}
+
+panko_task_service_stopped:
+  test.show_notification:
+    - text: "Running panko.upgrade.service_stopped"
+
+{%- if server.enabled %}
+panko_service_stopped_{{ server.service_name }}:
+  service.dead:
+  - name: {{ server.service_name }}
+  - enable: False
+{%- endif %}
diff --git a/panko/upgrade/upgrade/init.sls b/panko/upgrade/upgrade/init.sls
new file mode 100644
index 0000000..a45935f
--- /dev/null
+++ b/panko/upgrade/upgrade/init.sls
@@ -0,0 +1,8 @@
+{%- from "panko/map.jinja" import server with context %}
+
+include:
+ - panko.upgrade.service_stopped
+ - panko.upgrade.pkgs_latest
+ - panko.upgrade.render_config
+ - panko.db.offline_sync
+ - panko.upgrade.service_running
diff --git a/panko/upgrade/upgrade/post.sls b/panko/upgrade/upgrade/post.sls
new file mode 100644
index 0000000..6ebaae0
--- /dev/null
+++ b/panko/upgrade/upgrade/post.sls
@@ -0,0 +1,3 @@
+panko_upgrade_uprade_post:
+  test.show_notification:
+    - text: "Running panko.upgrade.upgrade.post"
diff --git a/panko/upgrade/upgrade/pre.sls b/panko/upgrade/upgrade/pre.sls
new file mode 100644
index 0000000..4de2a38
--- /dev/null
+++ b/panko/upgrade/upgrade/pre.sls
@@ -0,0 +1,3 @@
+panko_upgrade_upgrade_pre:
+  test.show_notification:
+    - text: "Running panko.upgrade.upgrade.pre"
diff --git a/panko/upgrade/verify/_api.sls b/panko/upgrade/verify/_api.sls
new file mode 100644
index 0000000..3ed0036
--- /dev/null
+++ b/panko/upgrade/verify/_api.sls
@@ -0,0 +1,7 @@
+
+panko_upgrade_verify_api:
+  test.show_notification:
+    - text: "Running panko.upgrade.verify.api"
+
+# TODO: Implement api checks when panko salt
+# modules are implemented
diff --git a/panko/upgrade/verify/init.sls b/panko/upgrade/verify/init.sls
new file mode 100644
index 0000000..6337d18
--- /dev/null
+++ b/panko/upgrade/verify/init.sls
@@ -0,0 +1,2 @@
+include:
+ - panko.upgrade.verify._api