Add HA test "kill keepalived, haproxy"

- also added time sync on '*' minions
  after reverting snapshot in the salt_deployed fixture;
  and after making a snapshot in the other fixtures

Change-Id: Ia5c5363bf55399422785f66e88e861c23cfab531
diff --git a/tcp_tests/managers/common_services_manager.py b/tcp_tests/managers/common_services_manager.py
index e29cdd6..1e783a8 100644
--- a/tcp_tests/managers/common_services_manager.py
+++ b/tcp_tests/managers/common_services_manager.py
@@ -41,6 +41,9 @@
         """Get minion ID where keepalived VIP is at the moment"""
         tgt = 'I@keepalived:cluster:enabled:True'
         grains = 'ip_interfaces'
+        # Refresh grains first
+        self._salt.run_state(tgt, 'saltutil.refresh_grains')
+        # Get grains
         result = self._salt.get_grains(tgt=tgt, grains=grains)[0]
         minion_ids = [
             minion_id for minion_id, interfaces in result.items()
diff --git a/tcp_tests/managers/rallymanager.py b/tcp_tests/managers/rallymanager.py
index 87f8805..8282bcc 100644
--- a/tcp_tests/managers/rallymanager.py
+++ b/tcp_tests/managers/rallymanager.py
@@ -72,8 +72,8 @@
         docker_cmd = ('docker exec -i {docker_id} bash -c "{cmd}"'
                       .format(cmd=cmd, docker_id=self.docker_id))
         LOG.info("Executing: {docker_cmd}".format(docker_cmd=docker_cmd))
-        self._underlay.check_call(docker_cmd, node_name=self._node_name,
-                                  verbose=verbose, timeout=timeout)
+        return self._underlay.check_call(docker_cmd, node_name=self._node_name,
+                                         verbose=verbose, timeout=timeout)
 
     def _run(self):
         """Start the rally container in the background"""
@@ -148,20 +148,26 @@
             task_path=task_path, task_content=task_content)
         self._underlay.check_call(cmd, node_name=self._node_name)
 
-    def run_task(self, task='', timeout=None, raise_on_timeout=True):
+    def run_task(self, task='', timeout=None, raise_on_timeout=True,
+                 verbose=False):
         """Run rally task
 
         :param taks: path to json or yaml file with the task definition
         :param raise_on_timeout: bool, ignore TimeoutError if False
+        :param verbose: show rally output to console if True
         """
         try:
-            self._docker_exec("rally task start {task}".format(task=task),
-                              timeout=timeout, verbose=True)
+            res = self._docker_exec(
+                "rally task start {task}".format(task=task),
+                timeout=timeout,
+                verbose=verbose)
         except error.TimeoutError:
             if raise_on_timeout:
                 raise
             else:
+                res = None
                 pass
+        return res
 
     # Updated to replace the OpenStackManager method run_tempest
     def run_tempest(self, conf_name='/var/lib/lvm_mcp.conf',
diff --git a/tcp_tests/managers/saltmanager.py b/tcp_tests/managers/saltmanager.py
index 5249186..1ff5324 100644
--- a/tcp_tests/managers/saltmanager.py
+++ b/tcp_tests/managers/saltmanager.py
@@ -17,7 +17,8 @@
 from collections import defaultdict
 
 from datetime import datetime
-from pepper.libpepper import Pepper
+from pepper import libpepper
+from tcp_tests.helpers import utils
 from tcp_tests import settings
 from tcp_tests import logger
 from tcp_tests.managers.execute_commands import ExecuteCommandsMixin
@@ -94,7 +95,7 @@
         url = "http://{host}:{port}".format(
             host=self.host, port=self.port)
         LOG.info("Connecting to Salt API {0}".format(url))
-        self.__api = Pepper(url)
+        self.__api = libpepper.Pepper(url)
         self.__session_start = login()
         return self.__api
 
@@ -208,3 +209,18 @@
     def service_stop(self, tgt, service):
         result = self.local(tgt=tgt, fun='service.stop', args=service)
         return result['return']
+
+    @utils.retry(3, exception=libpepper.PepperException)
+    def sync_time(self, tgt='*'):
+        LOG.info("NTP time sync on the salt minions '{0}'".format(tgt))
+        # Force authentication update on the next API access
+        # because previous authentication most probably is not valid
+        # before or after time sync.
+        self.__api = None
+        self.run_state(
+            tgt,
+            'cmd.run', 'service ntp stop; ntpd -gq; service ntp start')
+        new_time_res = self.run_state(tgt, 'cmd.run', 'date')
+        for node_name, time in sorted(new_time_res[0]['return'][0].items()):
+            LOG.info("{0}: {1}".format(node_name, time))
+        self.__api = None