Use generated RSA key while accessing nodes via SSH

Generate RSA key pair (optionally it could be provided by
operator via environment variable) and use it for SSH
authentication instead of password.

Also it's possible to provide the key from a local file now.

Change-Id: I5fea4d55337f294cd7829392b91b2cca7b85ead5
Reviewed-on: https://review.gerrithub.io/367254
Reviewed-by: Victor Ryzhenkin <vryzhenkin@mirantis.com>
Reviewed-by: Dennis Dmitriev <dis.xcom@gmail.com>
Tested-by: Dennis Dmitriev <dis.xcom@gmail.com>
diff --git a/tcp_tests/managers/envmanager_devops.py b/tcp_tests/managers/envmanager_devops.py
index 8655675..958e7f1 100644
--- a/tcp_tests/managers/envmanager_devops.py
+++ b/tcp_tests/managers/envmanager_devops.py
@@ -48,7 +48,11 @@
         self.__config = config
 
         if config.hardware.conf_path is not None:
-            self._devops_config.load_template(config.hardware.conf_path)
+            options = {
+                'config': self.__config,
+            }
+            self._devops_config.load_template(config.hardware.conf_path,
+                                              options=options)
         else:
             raise Exception("Devops YAML template is not set in config object")
 
@@ -158,6 +162,7 @@
                 'host': self.node_ip(d_node),
                 'login': settings.SSH_NODE_CREDENTIALS['login'],
                 'password': settings.SSH_NODE_CREDENTIALS['password'],
+                'keys': [k['private'] for k in self.__config.underlay.ssh_keys]
             }
             config_ssh.append(ssh_data)
         return config_ssh
@@ -198,14 +203,16 @@
                  "dos.py revert {env_name} {snapshot_name};\n"
                  "dos.py resume {env_name};\n"
                  "# dos.py time-sync {env_name};  # Optional\n"
-                 "ssh {login}@{salt_master_host}  # Password: {password}\n"
+                 "ssh -i {key_file} {login}@{salt_master_host} "
+                 "# Optional password: {password}\n"
                  "************************************\n"
                  .format(venv_msg=venv_msg,
                          env_name=self._d_env_name,
                          snapshot_name=name,
                          login=settings.SSH_NODE_CREDENTIALS['login'],
                          password=settings.SSH_NODE_CREDENTIALS['password'],
-                         salt_master_host=self.__config.salt.salt_master_host))
+                         salt_master_host=self.__config.salt.salt_master_host,
+                         key_file=self.__config.underlay.ssh_key_file))
 
     def _get_snapshot_config_name(self, snapshot_name):
         """Get config name for the environment"""
diff --git a/tcp_tests/managers/underlay_ssh_manager.py b/tcp_tests/managers/underlay_ssh_manager.py
index 18095c6..f30d7a0 100644
--- a/tcp_tests/managers/underlay_ssh_manager.py
+++ b/tcp_tests/managers/underlay_ssh_manager.py
@@ -13,6 +13,7 @@
 #    under the License.
 
 import random
+import StringIO
 
 from devops.helpers import helpers
 from devops.helpers import ssh_client
@@ -233,7 +234,8 @@
             port=ssh_data['port'] or 22,
             username=ssh_data['login'],
             password=ssh_data['password'],
-            private_keys=ssh_data['keys'])
+            private_keys=[rsakey.RSAKey(file_obj=StringIO.StringIO(key))
+                          for key in ssh_data['keys']])
 
     def check_call(
             self, cmd,