Merge "Move to Mirantis owned docker images for tests         - This is a temporary solution until we have our own images"
diff --git a/_states/designatev2.py b/_states/designatev2.py
index 3f98815..54e532a 100644
--- a/_states/designatev2.py
+++ b/_states/designatev2.py
@@ -1,4 +1,6 @@
+import functools
 import logging
+import time
 
 
 def __virtual__():
@@ -12,12 +14,12 @@
     return __salt__['designatev2.{}'.format(fname)](*args, **kwargs)  # noqa
 
 
-def _resource_present(resource, name, cloud_name, **kwargs):
+def _resource_present(resource, name, cloud_name, waiter=None, **kwargs):
     try:
         method_name = '{}_get_details'.format(resource)
         exact_resource = _designatev2_call(
             method_name, name, cloud_name=cloud_name
-        )[resource]
+        )
     except Exception as e:
         if 'ResourceNotFound' in repr(e):
             try:
@@ -29,6 +31,10 @@
                 log.exception('Designate {0} create failed with {1}'.
                     format(resource, e))
                 return _failed('create', name, resource)
+            if waiter:
+                if not waiter(name, cloud_name):
+                    return _failed('create', name, resource)
+                resp['status'] = 'ACTIVE'
             return _succeeded('create', name, resource, resp)
         elif 'MultipleResourcesFound' in repr(e):
             return _failed('find', name, resource)
@@ -39,23 +45,25 @@
     for key in kwargs:
         if key not in exact_resource or kwargs[key] != exact_resource[key]:
             to_update[key] = kwargs[key]
-    try:
-        method_name = '{}_update'.format(resource)
-        resp = _designatev2_call(
-            method_name, name, cloud_name=cloud_name, **to_update
-        )
-    except Exception as e:
-        log.exception('Designate {0} update failed with {1}'.format(resource, e))
-        return _failed('update', name, resource)
-    return _succeeded('update', name, resource, resp)
+    if to_update:
+        try:
+            method_name = '{}_update'.format(resource)
+            resp = _designatev2_call(
+                method_name, name, cloud_name=cloud_name, **to_update
+            )
+        except Exception as e:
+            log.exception('Designate {0} update failed with {1}'.format(resource, e))
+            return _failed('update', name, resource)
+        return _succeeded('update', name, resource, resp)
+    return _succeeded('no_changes', name, resource)
 
 
-def _resource_absent(resource, name, cloud_name):
+def _resource_absent(resource, name, cloud_name, waiter=None):
     try:
         method_name = '{}_get_details'.format(resource)
         _designatev2_call(
             method_name, name, cloud_name=cloud_name
-        )[resource]
+        )
     except Exception as e:
         if 'ResourceNotFound' in repr(e):
             return _succeeded('absent', name, resource)
@@ -69,16 +77,41 @@
     except Exception as e:
         log.error('Designate delete {0} failed with {1}'.format(resource, e))
         return _failed('delete', name, resource)
+    if waiter:
+        if not waiter:
+            return _failed('delete', name, resource)
     return _succeeded('delete', name, resource)
 
 
+def _poll_for_zone(zone_name, cloud_name, checker, retry=5, timeout=2):
+    while retry:
+        zones = _designatev2_call('zone_list', name=zone_name,
+                                  cloud_name=cloud_name)['zones']
+        if checker(zones):
+            return True
+        time.sleep(timeout)
+        retry -= 1
+    return False
+
+
 def zone_present(name, cloud_name, email, **kwargs):
     kwargs.update({'email': email})
-    return _resource_present('zone', name, cloud_name, **kwargs)
+    return _resource_present(
+        'zone', name, cloud_name,
+        functools.partial(
+            _poll_for_zone,
+            checker=lambda zones: len(zones) and
+                                  zones[0]['status'] == 'ACTIVE',
+            **kwargs.pop('waiter_config', {})),
+        **kwargs)
 
 
-def zone_absent(name, cloud_name):
-    return _resource_absent('zone', name, cloud_name)
+def zone_absent(name, cloud_name, **kwargs):
+    return _resource_absent(
+        'zone', name, cloud_name,
+        waiter=functools.partial(
+            _poll_for_zone, checker=lambda zones: not len(zones),
+            **kwargs.pop('waiter_config', {})))
 
 
 def _succeeded(op, name, resource, changes=None):
diff --git a/designate/upgrade/service_running.sls b/designate/upgrade/service_running.sls
index 4d5dcb1..9af69d0 100644
--- a/designate/upgrade/service_running.sls
+++ b/designate/upgrade/service_running.sls
@@ -1,20 +1,26 @@
-{%- from "designate/map.jinja" import server, pool_manager, agent with context %}
+{%- from "designate/map.jinja" import server, worker, pool_manager, agent with context %}
 
 designate_task_service_running:
   test.show_notification:
     - name: "dump_message_service_running_designate"
     - text: "Running designate.upgrade.service_running"
 
+{%- set dservices = [] %}
+
 {%- if server.get('enabled', false) %}
-  {%- set dservices = server.services %}
+  {%- do dservices.extend(server.services) %}
 {%- endif %}
 
 {%- if pool_manager.get('enabled', false) %}
-  {%- do dservices.append(pool_manager.services) %}
+  {%- do dservices.extend(pool_manager.services) %}
+{%- endif %}
+
+{%- if worker.get('enabled', false) %}
+  {%- do dservices.extend(worker.services) %}
 {%- endif %}
 
 {%- if agent.get('enabled', false) %}
-  {%- do dservices.append(agent.services) %}
+  {%- do dservices.extend(agent.services) %}
 {%- endif %}
 
 {%- for dservice in dservices %}
diff --git a/designate/upgrade/service_stopped.sls b/designate/upgrade/service_stopped.sls
index 83cee90..8f0d981 100644
--- a/designate/upgrade/service_stopped.sls
+++ b/designate/upgrade/service_stopped.sls
@@ -1,20 +1,26 @@
-{%- from "designate/map.jinja" import server, pool_manager, agent with context %}
+{%- from "designate/map.jinja" import server, worker, pool_manager, agent with context %}
 
 designate_task_service_stopped:
   test.show_notification:
     - name: "dump_message_service_stopped_designate"
     - text: "Running dsignate.upgrade.service_stopped"
 
+{%- set dservices = [] %}
+
 {%- if server.get('enabled', false) %}
-  {%- set dservices = server.services %}
+  {%- do dservices.extend(server.services) %}
 {%- endif %}
 
 {%- if pool_manager.get('enabled', false) %}
-  {%- do dservices.append(pool_manager.services) %}
+  {%- do dservices.extend(pool_manager.services) %}
+{%- endif %}
+
+{%- if worker.get('enabled', false) %}
+  {%- do dservices.extend(worker.services) %}
 {%- endif %}
 
 {%- if agent.get('enabled', false) %}
-  {%- do dservices.append(agent.services) %}
+  {%- do dservices.extend(agent.services) %}
 {%- endif %}
 
 {%- for dservice in dservices %}
diff --git a/designate/upgrade/verify/_api.sls b/designate/upgrade/verify/_api.sls
new file mode 100644
index 0000000..927f4e1
--- /dev/null
+++ b/designate/upgrade/verify/_api.sls
@@ -0,0 +1,41 @@
+{%- from "designate/map.jinja" import server with context %}
+
+designate_upgrade_verify_api:
+  test.show_notification:
+    - name: "dump_message_verify_api"
+    - text: "Running designate.upgrade.verify.api"
+
+{%- if server.get('role', 'primary') == 'primary' %}
+{% set Designate_Test_Zone = 'upgradetest.tld.' %}
+designatev2_zone_present:
+  designatev2.zone_present:
+  - cloud_name: admin_identity
+  - name: {{ Designate_Test_Zone }}
+  - email: 'example@doc.com'
+
+designatev2_zone_list:
+  module.run:
+    - name: designatev2.zone_list
+    - kwargs:
+        cloud_name: admin_identity
+
+designatev2_zone_get_details:
+  module.run:
+    - name: designatev2.zone_get_details
+    - kwargs:
+        cloud_name: admin_identity
+        zone_id: {{ Designate_Test_Zone }}
+
+designatev2_zone_get_name_servers:
+  module.run:
+    - name: designatev2.zone_get_name_servers
+    - kwargs:
+        cloud_name: admin_identity
+        zone_id: {{ Designate_Test_Zone }}
+
+
+designatev2_zone_absent:
+  designatev2.zone_absent:
+  - cloud_name: admin_identity
+  - name: {{ Designate_Test_Zone }}
+{%- endif %}
\ No newline at end of file
diff --git a/designate/upgrade/verify/api.sls b/designate/upgrade/verify/api.sls
deleted file mode 100644
index 810026c..0000000
--- a/designate/upgrade/verify/api.sls
+++ /dev/null
@@ -1,7 +0,0 @@
-designate_upgrade_verify_api:
-  test.show_notification:
-    - name: "dump_message_verify_api"
-    - text: "Running designate.upgrade.verify.api"
-
-#TODO: comprehensive designate module should be created to have
-#      a chanse perform managment and monitor actions
diff --git a/designate/upgrade/verify/init.sls b/designate/upgrade/verify/init.sls
new file mode 100644
index 0000000..1afebd4
--- /dev/null
+++ b/designate/upgrade/verify/init.sls
@@ -0,0 +1,2 @@
+include:
+ - designate.upgrade.verify._api