Add k8s keepalived failover test

Rewrite openstack_actions to remove hardware dependency from it.
Rewrite conformance method to allow more flexibility.
Add timeout after restarting keepalived workaround because
sometimes it did not have time to go into MASTER state before
test starts.

Change-Id: I668844f91f4a8fb473e199977f1ebe6ca7ddc35a
Related-PROD: PROD-20878
diff --git a/tcp_tests/managers/envmanager_devops.py b/tcp_tests/managers/envmanager_devops.py
index d02cff5..0e56756 100644
--- a/tcp_tests/managers/envmanager_devops.py
+++ b/tcp_tests/managers/envmanager_devops.py
@@ -420,6 +420,22 @@
                          timeout_msg=('Node {0} failed '
                                       'to become active'.format(node)))
 
+    def warm_shutdown_nodes(self, underlay, nodes_prefix, timeout=600):
+        node_names = underlay.get_target_node_names(nodes_prefix)
+        for node in node_names:
+            LOG.debug('Shutdown node {0}'.format(node))
+            underlay.check_call(cmd="shutdown +1", node_name=node)
+        for node in node_names:
+            self.wait_for_node_state(node, state='offline', timeout=timeout)
+
+    def warm_restart_nodes(self, underlay, nodes_prefix, timeout=600):
+        self.warm_shutdown_nodes(underlay, nodes_prefix, timeout)
+        node_names = underlay.get_target_node_names(nodes_prefix)
+        for node in node_names:
+            LOG.debug('Starting node {0}'.format(node))
+            self.start_node(node)
+            self.wait_for_node_state(node, state='active', timeout=timeout)
+
     def has_snapshot(self, name):
         return self.__env.has_snapshot(name)