From 762d5bb38fc39327a318f301291687c6e312f008 Mon Sep 17 00:00:00 2001 From: Chris Krelle Date: Thu, 28 Feb 2013 08:11:54 -0800 Subject: Add ssh port and key based auth to VPD. This patch adds the ablity to set ssh port, and use key based authentication for VPD. This patch adds config options: virtual_power_ssh_port: port to ssh to on virtual power host virtual_power_host_key: private key file for ssh auth Note: Key file must be able to be read by user nova is running as. This patch switches the default virtual_power_type from 'vbox' to 'virsh' to match the most common usage. Fix Bug 1136010 Change-Id: Id89878d63d26602bb3eacc2a2ce7902d9bd33d61 Authored-by: Chris Krelle --- nova/tests/baremetal/test_virtual_power_driver.py | 21 ++++++++++++++++++++- nova/virt/baremetal/virtual_power_driver.py | 19 +++++++++++++++---- nova/virt/powervm/common.py | 6 ++++-- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/nova/tests/baremetal/test_virtual_power_driver.py b/nova/tests/baremetal/test_virtual_power_driver.py index 5a38ed87b..4b140f66a 100644 --- a/nova/tests/baremetal/test_virtual_power_driver.py +++ b/nova/tests/baremetal/test_virtual_power_driver.py @@ -49,6 +49,7 @@ BAREMETAL_FLAGS = dict( virtual_power_type='vbox', virtual_power_host_user=None, virtual_power_host_pass=None, + virtual_power_host_key=None, group='baremetal', ) @@ -128,7 +129,7 @@ class VPDClassMethodsTestCase(BareMetalVPDTestCase): self.flags(virtual_power_host_user='user', group="baremetal") self.flags(virtual_power_host_pass='password', group="baremetal") - def test_get_conn_success(self): + def test_get_conn_success_pass(self): self._create_node() self._create_pm() self._conn = self.pm._get_conn() @@ -139,6 +140,24 @@ class VPDClassMethodsTestCase(BareMetalVPDTestCase): self.assertEqual(self.pm.connection_data.host, '127.0.0.1') self.assertEqual(self.pm.connection_data.username, 'user') self.assertEqual(self.pm.connection_data.password, 'password') + self.assertEqual(self.pm.connection_data.keyfile, None) + self.mox.VerifyAll() + + def test_get_conn_success_key(self): + self.flags(virtual_power_host_pass='', group="baremetal") + self.flags(virtual_power_host_key='/id_rsa_file.txt', + group="baremetal") + self._create_node() + self._create_pm() + self._conn = self.pm._get_conn() + self.mox.StubOutWithMock(connection, 'ssh_connect') + connection.ssh_connect(mox.IsA(self._conn)).AndReturn(True) + self.mox.ReplayAll() + self.pm._set_connection() + self.assertEqual(self.pm.connection_data.host, '127.0.0.1') + self.assertEqual(self.pm.connection_data.username, 'user') + self.assertEqual(self.pm.connection_data.password, '') + self.assertEqual(self.pm.connection_data.keyfile, '/id_rsa_file.txt') self.mox.VerifyAll() def test_get_full_node_list(self): diff --git a/nova/virt/baremetal/virtual_power_driver.py b/nova/virt/baremetal/virtual_power_driver.py index a18a2f9d3..d3f612ddd 100644 --- a/nova/virt/baremetal/virtual_power_driver.py +++ b/nova/virt/baremetal/virtual_power_driver.py @@ -31,8 +31,11 @@ opts = [ cfg.StrOpt('virtual_power_ssh_host', default='', help='ip or name to virtual power host'), + cfg.StrOpt('virtual_power_ssh_port', + default='22', + help='Port to use for ssh to virtual power host'), cfg.StrOpt('virtual_power_type', - default='vbox', + default='virsh', help='base command to use for virtual power(vbox,virsh)'), cfg.StrOpt('virtual_power_host_user', default='', @@ -40,6 +43,10 @@ opts = [ cfg.StrOpt('virtual_power_host_pass', default='', help='password for virtual power host_user'), + cfg.StrOpt('virtual_power_host_key', + default=None, + help='ssh key for virtual power host_user'), + ] baremetal_vp = cfg.OptGroup(name='baremetal', @@ -101,13 +108,17 @@ class VirtualPowerManager(base.PowerManager): _('virtual_power_host_user not defined. Can not Start')) if not CONF.baremetal.virtual_power_host_pass: - raise exception.NovaException( - _('virtual_power_host_pass not defined. Can not Start')) + # it is ok to not have a password if you have a keyfile + if CONF.baremetal.virtual_power_host_key is None: + raise exception.NovaException( + _('virtual_power_host_pass/key not set. Can not Start')) _conn = connection.Connection( CONF.baremetal.virtual_power_ssh_host, CONF.baremetal.virtual_power_host_user, - CONF.baremetal.virtual_power_host_pass) + CONF.baremetal.virtual_power_host_pass, + CONF.baremetal.virtual_power_ssh_port, + CONF.baremetal.virtual_power_host_key) return _conn def _set_connection(self): diff --git a/nova/virt/powervm/common.py b/nova/virt/powervm/common.py index d98d4ae89..86f99b2d5 100644 --- a/nova/virt/powervm/common.py +++ b/nova/virt/powervm/common.py @@ -31,11 +31,12 @@ LOG = logging.getLogger(__name__) class Connection(object): - def __init__(self, host, username, password, port=22): + def __init__(self, host, username, password, port=22, keyfile=None): self.host = host self.username = username self.password = password self.port = port + self.keyfile = keyfile def ssh_connect(connection): @@ -51,7 +52,8 @@ def ssh_connect(connection): ssh.connect(connection.host, username=connection.username, password=connection.password, - port=connection.port) + port=connection.port, + key_filename=connection.keyfile) return ssh except Exception: LOG.exception(_('Connection error connecting PowerVM manager')) -- cgit