summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDean Troyer <dtroyer@gmail.com>2013-07-26 16:26:50 -0500
committerDean Troyer <dtroyer@gmail.com>2013-07-29 19:18:00 -0500
commit978c2e7dec712c1dd355cf9f5eb6a7270fa2c385 (patch)
treeb55253e6414e3ef51ddb96a83f2b030300cf3231
parent65d2a14e3e834ce0c57c879ec7d42715058254bf (diff)
downloadpython-openstackclient-978c2e7dec712c1dd355cf9f5eb6a7270fa2c385.tar.gz
Add server ssh command
Change-Id: I9317ad6a47818d5479a046b4be8c5adbbce613ef
-rw-r--r--openstackclient/compute/v2/server.py159
-rw-r--r--setup.cfg1
2 files changed, 160 insertions, 0 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 8f81dfdb..eb4ccaba 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -15,6 +15,7 @@
"""Compute v2 Server action implementations"""
+import argparse
import getpass
import logging
import os
@@ -977,6 +978,164 @@ class ShowServer(show.ShowOne):
return zip(*sorted(data.iteritems()))
+class SshServer(command.Command):
+ """Ssh to server"""
+
+ log = logging.getLogger(__name__ + '.SshServer')
+
+ def get_parser(self, prog_name):
+ parser = super(SshServer, self).get_parser(prog_name)
+ parser.add_argument(
+ 'server',
+ metavar='<server>',
+ help='Server (name or ID)',
+ )
+ parser.add_argument(
+ '--login',
+ metavar='<login-name>',
+ help='Login name (ssh -l option)',
+ )
+ parser.add_argument(
+ '-l',
+ metavar='<login-name>',
+ help=argparse.SUPPRESS,
+ )
+ parser.add_argument(
+ '--port',
+ metavar='<port>',
+ type=int,
+ help='Destination port (ssh -p option)',
+ )
+ parser.add_argument(
+ '-p',
+ metavar='<port>',
+ dest='port',
+ type=int,
+ help=argparse.SUPPRESS,
+ )
+ parser.add_argument(
+ '--identity',
+ metavar='<keyfile>',
+ help='Private key file (ssh -i option)',
+ )
+ parser.add_argument(
+ '-i',
+ metavar='<filename>',
+ dest='identity',
+ help=argparse.SUPPRESS,
+ )
+ parser.add_argument(
+ '--option',
+ metavar='<config-options>',
+ help='Options in ssh_config(5) format (ssh -o option)',
+ )
+ parser.add_argument(
+ '-o',
+ metavar='<option>',
+ dest='option',
+ help=argparse.SUPPRESS,
+ )
+ ip_group = parser.add_mutually_exclusive_group()
+ ip_group.add_argument(
+ '-4',
+ dest='ipv4',
+ action='store_true',
+ default=False,
+ help='Use only IPv4 addresses only',
+ )
+ ip_group.add_argument(
+ '-6',
+ dest='ipv6',
+ action='store_true',
+ default=False,
+ help='Use only IPv6 addresses only',
+ )
+ type_group = parser.add_mutually_exclusive_group()
+ type_group.add_argument(
+ '--public',
+ dest='address_type',
+ action='store_const',
+ const='public',
+ default='public',
+ help='Use public IP address',
+ )
+ type_group.add_argument(
+ '--private',
+ dest='address_type',
+ action='store_const',
+ const='private',
+ default='public',
+ help='Use private IP address',
+ )
+ type_group.add_argument(
+ '--address-type',
+ metavar='<address-type>',
+ dest='address_type',
+ default='public',
+ help='Use other IP address (public, private, etc)',
+ )
+ parser.add_argument(
+ '-v',
+ dest='verbose',
+ action='store_true',
+ default=False,
+ help=argparse.SUPPRESS,
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ self.log.debug('take_action(%s)' % parsed_args)
+
+ compute_client = self.app.client_manager.compute
+ server = utils.find_resource(
+ compute_client.servers,
+ parsed_args.server,
+ )
+
+ # Build the command
+ cmd = "ssh"
+
+ # Look for address type
+ if parsed_args.address_type:
+ address_type = parsed_args.address_type
+ if address_type not in server.addresses:
+ raise SystemExit("ERROR: No %s IP address found" % address_type)
+
+ # Set up desired address family
+ ip_address_family = [4, 6]
+ if parsed_args.ipv4:
+ ip_address_family = [4]
+ cmd += " -4"
+ if parsed_args.ipv6:
+ ip_address_family = [6]
+ cmd += " -6"
+
+ # Grab the first matching IP address
+ ip_address = None
+ for addr in server.addresses[address_type]:
+ if int(addr['version']) in ip_address_family:
+ ip_address = addr['addr']
+ if not ip_address:
+ raise SystemExit("ERROR: No IP address found")
+
+ if parsed_args.port:
+ cmd += " -p %d" % parsed_args.port
+ if parsed_args.identity:
+ cmd += " -i %s" % parsed_args.identity
+ if parsed_args.option:
+ cmd += " -o %s" % parsed_args.option
+ if parsed_args.login:
+ login = parsed_args.login
+ else:
+ login = self.app.client_manager._username
+ if parsed_args.verbose:
+ cmd += " -v"
+
+ cmd += " %s@%s"
+ self.log.debug("ssh command: %s" % (cmd % (login, ip_address)))
+ os.system(cmd % (login, ip_address))
+
+
class SuspendServer(command.Command):
"""Suspend server"""
diff --git a/setup.cfg b/setup.cfg
index 7fd06a2e..f1f5cf82 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -225,6 +225,7 @@ openstack.compute.v2 =
server_resume = openstackclient.compute.v2.server:ResumeServer
server_set = openstackclient.compute.v2.server:SetServer
server_show = openstackclient.compute.v2.server:ShowServer
+ server_ssh = openstackclient.compute.v2.server:SshServer
server_suspend = openstackclient.compute.v2.server:SuspendServer
server_unlock = openstackclient.compute.v2.server:UnlockServer
server_unpause = openstackclient.compute.v2.server:UnpauseServer