Add more roles to designate formulas

Provide roles:
pool_manager
worker
agent

The idea was proposed by Aleš Komárek:
https://gerrit.mcp.mirantis.net/6723

Make adjustments to designate.conf.Debian to be able
to take into account pool_manager changes in
reclass model.

Provide default roles description in pillars for tests.

Change-Id: I214d8db39365648b5ef9348b52edd839327ca197
Related-PROD: https://mirantis.jira.com/browse/PROD-14396
diff --git a/README.rst b/README.rst
index d0b267e..0192058 100644
--- a/README.rst
+++ b/README.rst
@@ -74,9 +74,10 @@
                   rndc_host: 127.0.0.1
                   rndc_port: 953
                   rndc_key_file: /etc/designate/rndc.key
-
+      worker:
+        enabled: true
 .. note::
-   *domain_id* parameter is UUID of DNS zone managed by designate-sink service. This zone will 
+   *domain_id* parameter is UUID of DNS zone managed by designate-sink service. This zone will
    be populated by A records for fixed and floating ip addresses of spawned VMs. After designate
    is deployed and zone is created, this parameter should be updated accordingly to UUID of
    newly created zone. Then designate state should be reapplied.
@@ -86,6 +87,14 @@
    useful in cases when, designate-api is deployed under proxy server. If not overriden in reclass,
    it defaults to http://*server:bind:api:address*:9001/.
 
+.. note::
+   *worker:enabled* sets worker role and installs designate-worker and designate-producer packages
+   which services will push changes to backend DNS servers.
+   *pool_manager:enabled* should be a default role for older releases of OpenStack, older than
+   Newton in which designate-worker and designate-producer were represented.
+   In releases starting from Newton, only Designate pool manager service still allows live syncs
+   with Power DNS server for now.
+
 Pools pillar for BIND9 master and multiple slaves setup:
 
 .. code:: yaml
diff --git a/designate/agent.sls b/designate/agent.sls
new file mode 100644
index 0000000..672eaf6
--- /dev/null
+++ b/designate/agent.sls
@@ -0,0 +1,8 @@
+{%- from "designate/map.jinja" import agent with context %}
+{%- if agent.enabled %}
+
+designate_agent_packages:
+  pkg.installed:
+  - names: {{ agent.pkgs }}
+
+{%- endif %}
diff --git a/designate/files/ocata/designate.conf.Debian b/designate/files/ocata/designate.conf.Debian
index 834a5f6..1cc491a 100644
--- a/designate/files/ocata/designate.conf.Debian
+++ b/designate/files/ocata/designate.conf.Debian
@@ -1,4 +1,5 @@
 {%- from "designate/map.jinja" import server with context %}
+{%- from "designate/map.jinja" import pool_manager with context %}
 [DEFAULT]
 # Where an option is commented out, but filled in this shows the default
 # value of that option
@@ -348,8 +349,8 @@
 #-----------------------
 [service:pool_manager]
 # Number of Pool Manager worker processes to spawn
-{%- if server.pool_manager.workers is defined %}
-workers = {{ server.pool_manager.workers }}
+{%- if pool_manager.workers is defined %}
+workers = {{ pool_manager.workers }}
 {%- else %}
 #workers = None
 {%- endif %}
@@ -358,8 +359,8 @@
 #threads = 1000
 
 # The ID of the pool managed by this instance of the Pool Manager
-{%- if server.pool_manager.pool_id is defined %}
-pool_id = {{ server.pool_manager.pool_id }}
+{%- if pool_manager.pool_id is defined %}
+pool_id = {{ pool_manager.pool_id }}
 {%- else %}
 #pool_id = 794ccc2c-d751-44fe-b57f-8894c9f5c842
 {%- endif %}
@@ -389,17 +390,17 @@
 #periodic_recovery_interval = 120
 
 # Enable the sync thread
-enable_sync_timer = {{ server.pool_manager.get('enable_sync_timer', 'True') }}
+enable_sync_timer = {{ pool_manager.get('enable_sync_timer', 'True') }}
 
 # The time between synchronizing the servers with storage
-periodic_sync_interval = {{ server.pool_manager.get('periodic_sync_interval', '1800') }}
+periodic_sync_interval = {{ pool_manager.get('periodic_sync_interval', '1800') }}
 
 # Zones Updated within last N seconds will be syncd. Use None to sync all zones
-periodic_sync_seconds = {{ server.pool_manager.get('periodic_sync_seconds', '') }}
+periodic_sync_seconds = {{ pool_manager.get('periodic_sync_seconds', '') }}
 
 # Perform multiple update attempts during periodic_sync
-periodic_sync_max_attempts = {{ server.pool_manager.get('periodic_sync_max_attempts', '3') }}
-periodic_sync_retry_interval = {{ server.pool_manager.get('periodic_sync_retry_interval', '30') }}
+periodic_sync_max_attempts = {{ pool_manager.get('periodic_sync_max_attempts', '3') }}
+periodic_sync_retry_interval = {{ pool_manager.get('periodic_sync_retry_interval', '30') }}
 
 # The cache driver to use
 #cache_driver = memcache
@@ -411,7 +412,7 @@
 [service:worker]
 {# TODO: remove enabled option when https://bugs.launchpad.net/designate/+bug/1676827 is fixed #}
 # Whether to send events to worker instead of Pool Manager
-{%- if server.pool_manager.enabled is defined and server.pool_manager.enabled == true %}
+{%- if pool_manager.enabled is defined and pool_manager.enabled == true %}
 enabled = False
 {%- else %}
 enabled = True
diff --git a/designate/init.sls b/designate/init.sls
index 58ccc9b..2d64202 100644
--- a/designate/init.sls
+++ b/designate/init.sls
@@ -6,4 +6,13 @@
 {%- if pillar.designate.client is defined %}
 - designate.client
 {%- endif %}
+{%- if pillar.designate.pool_manager is defined %}
+- designate.pool_manager
+{%- endif %}
+{%- if pillar.designate.worker is defined %}
+- designate.worker
+{%- endif %}
+{%- if pillar.designate.agent is defined %}
+- designate.agent
+{%- endif %}
 {%- endif %}
diff --git a/designate/map.jinja b/designate/map.jinja
index 6d161ec..5b78e51 100644
--- a/designate/map.jinja
+++ b/designate/map.jinja
@@ -1,41 +1,54 @@
 {%- set version = salt['pillar.get']('designate:server:version') -%}
 {%- set api_address = salt['pillar.get']('designate:server:bind:api:address', '127.0.0.1') -%}
 {%- set api_port = salt['pillar.get']('designate:server:bind:api:port', '9001') -%}
-{%- if version not in ['mitaka','liberty', 'juno', 'kilo'] %}
 {% set server = salt['grains.filter_by']({
     'default': {
-        'pool_manager': {},
         'api': {
             'base_uri': 'http://' + api_address + ':' + api_port + '/'
         }
     },
     'Debian': {
-        'pkgs': ['designate', 'designate-producer', 'designate-mdns', 'designate-sink', 'designate-worker'],
-        'services': ['designate-agent', 'designate-api', 'designate-central', 'designate-mdns', 'designate-producer', 'designate-sink', 'designate-worker'],
+        'pkgs': ['designate-api', 'designate-central', 'designate-sink'],
+        'services': ['designate-api', 'designate-central', 'designate-sink'],
     },
     'RedHat': {
-        'pkgs': ['openstack-designate-api', 'openstack-designate-central', 'openstack-designate-sink', 'openstack-designate-producer', 'openstack-designate-worker', 'openstack-designate-mdns', 'openstack-designate-common', 'python-designate', 'python-designateclient', 'openstack-designate-agent'],
-        'services': ['designate-central', 'designate-api', 'designate-mdns', 'designate-producer', 'designate-worker'],
+        'pkgs': ['openstack-designate-api', 'openstack-designate-central', 'openstack-designate-sink'],
+        'services': ['designate-api', 'designate-central', 'designate-sink'],
     },
 }, merge=pillar.designate.get('server', {}), base='default') %}
-{%- else %}
-{% set server = salt['grains.filter_by']({
-    'default': {
-        'pool_manager': {},
-        'api': {
-            'base_uri': 'http://' + api_address + ':' + api_port + '/'
-        }
-    },
+
+{% set pool_manager = salt['grains.filter_by']({
     'Debian': {
-        'pkgs': ['designate', 'designate-pool-manager', 'designate-mdns', 'designate-sink', 'designate-zone-manager'],
-        'services': ['designate-agent', 'designate-api', 'designate-central', 'designate-mdns', 'designate-pool-manager', 'designate-sink', 'designate-zone-manager'],
+        'pkgs': ['designate-pool-manager', 'designate-mdns', 'designate-zone-manager'],
+        'services': ['designate-pool-manager', 'designate-mdns', 'designate-zone-manager'],
     },
     'RedHat': {
-        'pkgs': ['openstack-designate-api', 'openstack-designate-central', 'openstack-designate-sink', 'openstack-designate-pool-manager', 'openstack-designate-zone-manager', 'openstack-designate-mdns', 'openstack-designate-common', 'python-designate', 'python-designateclient', 'openstack-designate-agent'],
-        'services': ['designate-central', 'designate-api', 'designate-mdns', 'designate-pool-manager', 'designate-zone-manager'],
+        'pkgs': ['openstack-designate-pool-manager', 'openstack-designate-mdns', 'openstack-designate-zone-manager'],
+        'services': ['designate-pool-manager', 'designate-mdns', 'designate-zone-manager'],
     },
-}, merge=pillar.designate.get('server', {}), base='default') %}
-{%- endif %}
+}, merge=pillar.designate.get('pool_manager')) %}
+
+{% set worker = salt['grains.filter_by']({
+    'Debian': {
+        'pkgs': ['designate-worker', 'designate-mdns', 'designate-producer'],
+        'services': ['designate-worker', 'designate-mdns', 'designate-producer'],
+    },
+    'RedHat': {
+        'pkgs': ['openstack-designate-worker', 'openstack-designate-mdns', 'openstack-designate-producer'],
+        'services': ['designate-worker', 'designate-mdns', 'designate-producer'],
+    },
+}, merge=pillar.designate.get('worker', {})) %}
+
+{% set agent = salt['grains.filter_by']({
+    'Debian': {
+        'pkgs': ['designate-agent'],
+        'services': ['designate-agent'],
+    },
+    'RedHat': {
+        'pkgs': ['openstack-designate-agent'],
+        'services': ['designate-agent'],
+    },
+}, merge=pillar.designate.get('agent', {})) %}
 
 {% set client = salt['grains.filter_by']({
     'Debian': {
diff --git a/designate/pool_manager.sls b/designate/pool_manager.sls
new file mode 100644
index 0000000..cc2a609
--- /dev/null
+++ b/designate/pool_manager.sls
@@ -0,0 +1,8 @@
+{%- from "designate/map.jinja" import pool_manager with context %}
+{%- if pool_manager.enabled %}
+
+designate_pool_manager_packages:
+  pkg.installed:
+  - names: {{ pool_manager.pkgs }}
+
+{%- endif %}
diff --git a/designate/worker.sls b/designate/worker.sls
new file mode 100644
index 0000000..67bb8f7
--- /dev/null
+++ b/designate/worker.sls
@@ -0,0 +1,8 @@
+{%- from "designate/map.jinja" import worker with context %}
+{%- if worker.enabled %}
+
+designate_worker_packages:
+  pkg.installed:
+  - names: {{ worker.pkgs }}
+
+{%- endif %}
diff --git a/tests/pillar/designate_liberty.sls b/tests/pillar/designate_liberty.sls
index be528eb..bef5e4a 100644
--- a/tests/pillar/designate_liberty.sls
+++ b/tests/pillar/designate_liberty.sls
@@ -1,4 +1,6 @@
 designate:
+  pool_manager:
+    enabled: true
   server:
     enabled: true
     region: RegionOne
@@ -25,4 +27,4 @@
         uuid: f26e0b32-736f-4f0a-831b-039a415c481e
         options: 'port: 53, host: 127.0.0.1'
         masters: 127.0.0.1:5354
-        type:  bind9
\ No newline at end of file
+        type:  bind9
diff --git a/tests/pillar/designate_mitaka.sls b/tests/pillar/designate_mitaka.sls
index 8543c76..e0e3f67 100644
--- a/tests/pillar/designate_mitaka.sls
+++ b/tests/pillar/designate_mitaka.sls
@@ -1,4 +1,6 @@
 designate:
+  pool_manager:
+    enabled: true
   server:
     enabled: true
     region: RegionOne
diff --git a/tests/pillar/designate_ocata.sls b/tests/pillar/designate_ocata.sls
index 630cccc..adbd8ad 100644
--- a/tests/pillar/designate_ocata.sls
+++ b/tests/pillar/designate_ocata.sls
@@ -65,6 +65,8 @@
         also_notifies:
           - host: 127.0.3.1
             port: 53
+  worker:
+    enabled: true
 mysql:
   client:
     enabled: true