Merge "Add tools to run jenkins jobs and remote commands"
diff --git a/tcp_tests/helpers/oslo_cfg_types.py b/tcp_tests/helpers/oslo_cfg_types.py
index 8b322b7..0430076 100644
--- a/tcp_tests/helpers/oslo_cfg_types.py
+++ b/tcp_tests/helpers/oslo_cfg_types.py
@@ -102,15 +102,31 @@
     """
     def __init__(self, *args, **kwargs):
 
-        env_var_name = args[0].upper()
-        if 'default' in kwargs:
-            # Load a default environment variable with expected type
-            kwargs['default'] = args[1](
-                os.environ.get(env_var_name, kwargs.get('default', None))
-            )
+        # if 'default' in kwargs:
+        #    # Load a default environment variable with expected type
+        #    kwargs['default'] = args[1](
+        #        os.environ.get(env_var_name, kwargs.get('default', None))
+        #    )
+
         super(Cfg, self).__init__(*args, **kwargs)
 
+        env_var_name = args[0].upper()
+        if env_var_name not in os.environ:
+            env_var_name = args[0]
+        if env_var_name in os.environ:
+            self.environment_value = self.type(os.environ.get(env_var_name))
+            print('{}={}  # {}'.format(env_var_name,
+                                       self.environment_value,
+                                       kwargs.get('help', '')))
+
         # Print info about default environment variables to console
-        print('{}={}  # {}'.format(env_var_name,
-                                   kwargs.get('default', ''),
-                                   kwargs.get('help', '')))
+        # print('{}={}  # {}'.format(env_var_name,
+        #                           kwargs.get('default', ''),
+        #                           kwargs.get('help', '')))
+
+    def _get_from_namespace(self, namespace, group_name):
+        res = super(Cfg, self)._get_from_namespace(namespace, group_name)
+        # Use the value from enviroment variable instead of config
+        if hasattr(self, 'environment_value'):
+            res = (self.environment_value, res[1])
+        return res
diff --git a/tcp_tests/managers/envmanager_devops.py b/tcp_tests/managers/envmanager_devops.py
index d17c6bd..d02cff5 100644
--- a/tcp_tests/managers/envmanager_devops.py
+++ b/tcp_tests/managers/envmanager_devops.py
@@ -307,29 +307,58 @@
             raise exceptions.EnvironmentIsNotSet()
         self.__env.start()
         LOG.info('Environment "{0}" started'.format(self.__env.name))
+        check_cloudinit_started = '[ -f /is_cloud_init_started ]'
+        check_cloudinit_finished = '[ -f /is_cloud_init_finished ]'
+        passed = {}
         for node in self.__env.get_nodes(role__in=underlay_node_roles):
             LOG.info("Waiting for SSH on node '{0}' / {1} ...".format(
                 node.name, self.node_ip(node)))
 
-            def _ssh_wait(host,
-                          port,
-                          username=settings.SSH_NODE_CREDENTIALS['login'],
-                          password=settings.SSH_NODE_CREDENTIALS['password'],
-                          timeout=0):
+            def _ssh_check(host,
+                           port,
+                           username=settings.SSH_NODE_CREDENTIALS['login'],
+                           password=settings.SSH_NODE_CREDENTIALS['password'],
+                           timeout=0):
                 try:
                     ssh = ssh_client.SSHClient(
                         host=host, port=port,
                         auth=ssh_client.SSHAuth(
                             username=username,
                             password=password))
-                except AuthenticationException:
-                    return True
-                except BadAuthenticationType:
+
+                    # If '/is_cloud_init_started' exists, then wait for
+                    # the flag /is_cloud_init_finished
+                    if ssh.execute(check_cloudinit_started)['exit_code'] == 0:
+                        status = ssh.execute(
+                            check_cloudinit_finished)['exit_code'] == 0
+                    # Else, just wait for SSH
+                    else:
+                        status = ssh.execute('echo ok')['exit_code'] == 0
+                    return status
+
+                except (AuthenticationException, BadAuthenticationType):
                     return True
                 except Exception:
                     return False
 
-                return ssh.execute('echo ok')['exit_code'] == 0
+            def _ssh_wait(host,
+                          port,
+                          username=settings.SSH_NODE_CREDENTIALS['login'],
+                          password=settings.SSH_NODE_CREDENTIALS['password'],
+                          timeout=0):
+
+                if host in passed and passed[host] >= 2:
+                    # host already passed the check
+                    return True
+
+                for node in self.__env.get_nodes(role__in=underlay_node_roles):
+                    ip = self.node_ip(node)
+                    if ip not in passed:
+                        passed[ip] = 0
+                    if _ssh_check(ip, port):
+                        passed[ip] += 1
+                    else:
+                        passed[ip] = 0
 
             helpers.wait(
                 lambda: _ssh_wait(self.node_ip(node), 22),