CLOUDSTACK-7408: Fixed - Private key of the ssh keypair was getting corrupted

Signed-off-by: SrikanteswaraRao Talluri <talluri@apache.org>
This commit is contained in:
Gaurav Aradhye 2014-09-23 14:18:18 +05:30 committed by SrikanteswaraRao Talluri
parent 9e5da759b3
commit e921ec6ec7
3 changed files with 27 additions and 8 deletions

View File

@ -552,7 +552,7 @@ class VirtualMachine:
def get_ssh_client(
self, ipaddress=None, reconnect=False, port=None,
keyPairFileLocation=None):
keyPairFileLocation=None, knownHostsFilePath=None):
"""Get SSH object of VM"""
# If NAT Rules are not created while VM deployment in Advanced mode
@ -571,14 +571,16 @@ class VirtualMachine:
self.ssh_port,
self.username,
self.password,
keyPairFileLocation=keyPairFileLocation
keyPairFileLocation=keyPairFileLocation,
knownHostsFilePath=knownHostsFilePath
)
self.ssh_client = self.ssh_client or is_server_ssh_ready(
self.ssh_ip,
self.ssh_port,
self.username,
self.password,
keyPairFileLocation=keyPairFileLocation
keyPairFileLocation=keyPairFileLocation,
knownHostsFilePath=knownHostsFilePath
)
return self.ssh_client

View File

@ -121,7 +121,9 @@ def cleanup_resources(api_client, resources):
obj.delete(api_client)
def is_server_ssh_ready(ipaddress, port, username, password, retries=20, retryinterv=30, timeout=10.0, keyPairFileLocation=None):
def is_server_ssh_ready(ipaddress, port, username, password, retries=20,
retryinterv=30, timeout=10.0, keyPairFileLocation=None,
knownHostsFilePath=None):
'''
@Name: is_server_ssh_ready
@Input: timeout: tcp connection timeout flag,
@ -140,7 +142,8 @@ def is_server_ssh_ready(ipaddress, port, username, password, retries=20, retryin
keyPairFiles=keyPairFileLocation,
retries=retries,
delay=retryinterv,
timeout=timeout)
timeout=timeout,
knownHostsFilePath=knownHostsFilePath)
except Exception, e:
raise Exception("SSH connection has Failed. Waited %ss. Error is %s" % (retries * retryinterv, str(e)))
else:

View File

@ -24,6 +24,7 @@ from paramiko import (BadHostKeyException,
SFTPClient)
import socket
import time
import os
from marvin.cloudstackException import (
internalError,
GetDetailExceptionInfo
@ -49,7 +50,8 @@ class SshClient(object):
'''
def __init__(self, host, port, user, passwd, retries=60, delay=10,
log_lvl=logging.DEBUG, keyPairFiles=None, timeout=10.0):
log_lvl=logging.DEBUG, keyPairFiles=None, timeout=10.0,
knownHostsFilePath=None):
self.host = None
self.port = 22
self.user = user
@ -77,6 +79,18 @@ class SshClient(object):
self.timeout = timeout
if port is not None and port >= 0:
self.port = port
# If the known_hosts file is not at default location,
# then its location can be passed, or else the default
# path will be considered (which is ~/.ssh/known_hosts)
if knownHostsFilePath:
self.knownHostsFilePath = knownHostsFilePath
else:
self.knownHostsFilePath = os.path.expanduser(
os.path.join(
"~",
".ssh",
"known_hosts"))
if self.createConnection() == FAILED:
raise internalError("SSH Connection Failed")
@ -120,14 +134,14 @@ class SshClient(object):
password=self.passwd,
timeout=self.timeout)
else:
self.ssh.load_host_keys(self.keyPairFiles)
self.ssh.load_host_keys(self.knownHostsFilePath)
self.ssh.connect(hostname=self.host,
port=self.port,
username=self.user,
password=self.passwd,
key_filename=self.keyPairFiles,
timeout=self.timeout,
look_for_keys=True
look_for_keys=False
)
self.logger.debug("===SSH to Host %s port : %s SUCCESSFUL==="
% (str(self.host), str(self.port)))