Skip to content

Commit ba69870

Browse files
committed
compute: Fix weird option definition for 'server ssh'
argparse allows you to specify multiple options for a given argument when declaring the argument. For some reason, we weren't doing this for the 'server ssh' command. There's no apparent reason for doing things this way and it's been that way since the beginning (2013) so let's not do that. We also add unit tests since they were missing and should exist. Change-Id: I67a9e6516d7057266210cd4083e9ddeb1cfaa5de Signed-off-by: Stephen Finucane <[email protected]>
1 parent c10a4cd commit ba69870

2 files changed

Lines changed: 81 additions & 29 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4462,51 +4462,26 @@ def get_parser(self, prog_name):
44624462
help=_('Server (name or ID)'),
44634463
)
44644464
parser.add_argument(
4465-
'--login',
4465+
'--login', '-l',
44664466
metavar='<login-name>',
44674467
help=_('Login name (ssh -l option)'),
44684468
)
44694469
parser.add_argument(
4470-
'-l',
4471-
dest='login',
4472-
metavar='<login-name>',
4473-
help=argparse.SUPPRESS,
4474-
)
4475-
parser.add_argument(
4476-
'--port',
4470+
'--port', '-p',
44774471
metavar='<port>',
44784472
type=int,
44794473
help=_('Destination port (ssh -p option)'),
44804474
)
44814475
parser.add_argument(
4482-
'-p',
4483-
metavar='<port>',
4484-
dest='port',
4485-
type=int,
4486-
help=argparse.SUPPRESS,
4487-
)
4488-
parser.add_argument(
4489-
'--identity',
4476+
'--identity', '-i',
44904477
metavar='<keyfile>',
44914478
help=_('Private key file (ssh -i option)'),
44924479
)
44934480
parser.add_argument(
4494-
'-i',
4495-
metavar='<filename>',
4496-
dest='identity',
4497-
help=argparse.SUPPRESS,
4498-
)
4499-
parser.add_argument(
4500-
'--option',
4481+
'--option', '-o',
45014482
metavar='<config-options>',
45024483
help=_('Options in ssh_config(5) format (ssh -o option)'),
45034484
)
4504-
parser.add_argument(
4505-
'-o',
4506-
metavar='<option>',
4507-
dest='option',
4508-
help=argparse.SUPPRESS,
4509-
)
45104485
ip_group = parser.add_mutually_exclusive_group()
45114486
ip_group.add_argument(
45124487
'-4',

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8265,6 +8265,83 @@ def test_show_topology_pre_v278(self):
82658265
exceptions.CommandError, self.cmd.take_action, parsed_args)
82668266

82678267

8268+
@mock.patch('openstackclient.compute.v2.server.os.system')
8269+
class TestServerSsh(TestServer):
8270+
8271+
def setUp(self):
8272+
super().setUp()
8273+
8274+
self.cmd = server.SshServer(self.app, None)
8275+
8276+
self.app.client_manager.auth_ref = mock.Mock()
8277+
self.app.client_manager.auth_ref.username = 'cloud'
8278+
8279+
self.attrs = {
8280+
'addresses': {
8281+
'public': [
8282+
{
8283+
'addr': '192.168.1.30',
8284+
'OS-EXT-IPS-MAC:mac_addr': '00:0c:29:0d:11:74',
8285+
'OS-EXT-IPS:type': 'fixed',
8286+
'version': 4,
8287+
},
8288+
],
8289+
},
8290+
}
8291+
self.server = compute_fakes.FakeServer.create_one_server(
8292+
attrs=self.attrs, methods=self.methods,
8293+
)
8294+
self.servers_mock.get.return_value = self.server
8295+
8296+
def test_server_ssh_no_opts(self, mock_exec):
8297+
arglist = [
8298+
self.server.name,
8299+
]
8300+
verifylist = [
8301+
('server', self.server.name),
8302+
('login', None),
8303+
('port', None),
8304+
('identity', None),
8305+
('option', None),
8306+
('ipv4', False),
8307+
('ipv6', False),
8308+
('address_type', 'public'),
8309+
('verbose', False),
8310+
]
8311+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
8312+
8313+
result = self.cmd.take_action(parsed_args)
8314+
8315+
self.assertIsNone(result)
8316+
mock_exec.assert_called_once_with('ssh [email protected]')
8317+
8318+
def test_server_ssh_opts(self, mock_exec):
8319+
arglist = [
8320+
self.server.name,
8321+
'-l', 'username',
8322+
'-p', '2222',
8323+
]
8324+
verifylist = [
8325+
('server', self.server.name),
8326+
('login', 'username'),
8327+
('port', 2222),
8328+
('identity', None),
8329+
('option', None),
8330+
('ipv4', False),
8331+
('ipv6', False),
8332+
('address_type', 'public'),
8333+
('verbose', False),
8334+
]
8335+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
8336+
8337+
result = self.cmd.take_action(parsed_args)
8338+
8339+
self.assertIsNone(result)
8340+
mock_exec.assert_called_once_with(
8341+
'ssh -p 2222 [email protected]'
8342+
)
8343+
8344+
82688345
class TestServerStart(TestServer):
82698346

82708347
def setUp(self):

0 commit comments

Comments
 (0)