summaryrefslogtreecommitdiff
path: root/ironic/drivers/modules/ssh.py
diff options
context:
space:
mode:
Diffstat (limited to 'ironic/drivers/modules/ssh.py')
-rw-r--r--ironic/drivers/modules/ssh.py38
1 files changed, 31 insertions, 7 deletions
diff --git a/ironic/drivers/modules/ssh.py b/ironic/drivers/modules/ssh.py
index 2d8d470f8..50cc0270a 100644
--- a/ironic/drivers/modules/ssh.py
+++ b/ironic/drivers/modules/ssh.py
@@ -35,6 +35,7 @@ from ironic.common import utils
from ironic.conductor import task_manager
from ironic.drivers import base
from ironic.drivers import utils as driver_utils
+from ironic.openstack.common.gettextutils import _
from ironic.openstack.common import log as logging
from ironic.openstack.common import processutils
@@ -49,6 +50,27 @@ CONF.register_opts(libvirt_opts, group='ssh')
LOG = logging.getLogger(__name__)
+REQUIRED_PROPERTIES = {
+ 'ssh_address': _("IP address or hostname of the node to ssh into. "
+ "Required."),
+ 'ssh_username': _("username to authenticate as. Required."),
+ 'ssh_virt_type': _("virtualization software to use; one of vbox, virsh, "
+ "vmware. Required.")
+}
+OTHER_PROPERTIES = {
+ 'ssh_key_contents': _("private key(s). One of this, ssh_key_filename, "
+ "or ssh_password must be specified."),
+ 'ssh_key_filename': _("(list of) filename(s) of optional private key(s) "
+ "for authentication. One of this, ssh_key_contents, "
+ "or ssh_password must be specified."),
+ 'ssh_password': _("password to use for authentication or for unlocking a "
+ "private key. One of this, ssh_key_contents, or "
+ "ssh_key_filename must be specified."),
+ 'ssh_port': _("port on the node to connect to; default is 22. Optional.")
+}
+COMMON_PROPERTIES = REQUIRED_PROPERTIES.copy()
+COMMON_PROPERTIES.update(OTHER_PROPERTIES)
+
def _get_command_sets(virt_type):
if virt_type == 'vbox':
@@ -155,6 +177,12 @@ def _parse_driver_info(node):
"""
info = node.driver_info or {}
+ missing_info = [key for key in REQUIRED_PROPERTIES if not info.get(key)]
+ if missing_info:
+ raise exception.InvalidParameterValue(_(
+ "SSHPowerDriver requires the following to be set: %s.")
+ % missing_info)
+
address = info.get('ssh_address')
username = info.get('ssh_username')
password = info.get('ssh_password')
@@ -176,16 +204,9 @@ def _parse_driver_info(node):
'uuid': node.uuid
}
- if not virt_type:
- raise exception.InvalidParameterValue(_(
- "SSHPowerDriver requires virt_type be set."))
-
cmd_set = _get_command_sets(virt_type)
res['cmd_set'] = cmd_set
- if not address or not username:
- raise exception.InvalidParameterValue(_(
- "SSHPowerDriver requires both address and username be set."))
# Only one credential may be set (avoids complexity around having
# precedence etc).
if len(filter(None, (password, key_filename, key_contents))) != 1:
@@ -354,6 +375,9 @@ class SSHPower(base.PowerInterface):
NOTE: This driver does not currently support multi-node operations.
"""
+ def get_properties(self):
+ return COMMON_PROPERTIES
+
def validate(self, task):
"""Check that the node's 'driver_info' is valid.