Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion SoftLayer/CLI/environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@ def list_commands(self, *path):

# offset is used to exclude the path that the caller requested.
offset = len(path_str) + 1 if path_str else 0
commands.append(command[offset:])
if ':' not in command[offset:]:
commands.append(command[offset:])

return sorted(commands)

Expand Down
32 changes: 22 additions & 10 deletions SoftLayer/CLI/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,18 +332,30 @@
('securitygroup:event-log', 'SoftLayer.CLI.securitygroup.event_log:get_by_request_id'),

('sshkey', 'SoftLayer.CLI.sshkey'),
('sshkey:add', 'SoftLayer.CLI.sshkey.add:cli'),
('sshkey:remove', 'SoftLayer.CLI.sshkey.remove:cli'),
('sshkey:edit', 'SoftLayer.CLI.sshkey.edit:cli'),
('sshkey:list', 'SoftLayer.CLI.sshkey.list:cli'),
('sshkey:print', 'SoftLayer.CLI.sshkey.print:cli'),
('sshkey:add', 'SoftLayer.CLI.security.sshkey_add:cli'),
('sshkey:remove', 'SoftLayer.CLI.security.sshkey_remove:cli'),
('sshkey:edit', 'SoftLayer.CLI.security.sshkey_edit:cli'),
('sshkey:list', 'SoftLayer.CLI.security.sshkey_list:cli'),
('sshkey:print', 'SoftLayer.CLI.security.sshkey_print:cli'),

('ssl', 'SoftLayer.CLI.ssl'),
('ssl:add', 'SoftLayer.CLI.ssl.add:cli'),
('ssl:download', 'SoftLayer.CLI.ssl.download:cli'),
('ssl:edit', 'SoftLayer.CLI.ssl.edit:cli'),
('ssl:list', 'SoftLayer.CLI.ssl.list:cli'),
('ssl:remove', 'SoftLayer.CLI.ssl.remove:cli'),
('ssl:add', 'SoftLayer.CLI.security.cert_add:cli'),
('ssl:download', 'SoftLayer.CLI.security.cert_download:cli'),
('ssl:edit', 'SoftLayer.CLI.security.cert_edit:cli'),
('ssl:list', 'SoftLayer.CLI.security.cert_list:cli'),
('ssl:remove', 'SoftLayer.CLI.security.cert_remove:cli'),

('security', 'SoftLayer.CLI.security'),
('security:sshkey-add', 'SoftLayer.CLI.security.sshkey_add:cli'),
('security:sshkey-remove', 'SoftLayer.CLI.security.sshkey_remove:cli'),
('security:sshkey-edit', 'SoftLayer.CLI.security.sshkey_edit:cli'),
('security:sshkey-list', 'SoftLayer.CLI.security.sshkey_list:cli'),
('security:sshkey-print', 'SoftLayer.CLI.security.sshkey_print:cli'),
('security:cert-add', 'SoftLayer.CLI.security.cert_add:cli'),
('security:cert-download', 'SoftLayer.CLI.security.cert_download:cli'),
('security:cert-edit', 'SoftLayer.CLI.security.cert_edit:cli'),
('security:cert-list', 'SoftLayer.CLI.security.cert_list:cli'),
('security:cert-remove', 'SoftLayer.CLI.security.cert_remove:cli'),

('subnet', 'SoftLayer.CLI.subnet'),
('subnet:cancel', 'SoftLayer.CLI.subnet.cancel:cli'),
Expand Down
2 changes: 2 additions & 0 deletions SoftLayer/CLI/security/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
"""SSH Keys and SSL Certificates."""
# :license: MIT, see LICENSE for more details.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
84 changes: 84 additions & 0 deletions docs/cli/security.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
.. _cli_security:

SSH Keys and SSL Certificates
========

.. click:: SoftLayer.CLI.security.sshkey_add:cli
:prog: security sshkey-add
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_add:cli
:prog: sshkey add
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_remove:cli
:prog: security sshkey-remove
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_remove:cli
:prog: sshkey remove
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_edit:cli
:prog: security sshkey-edit
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_edit:cli
:prog: sshkey edit
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_list:cli
:prog: security sshkey-list
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_list:cli
:prog: sshkey list
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_print:cli
:prog: security sshkey-print
:show-nested:

.. click:: SoftLayer.CLI.security.sshkey_print:cli
:prog: sshkey print
:show-nested:

.. click:: SoftLayer.CLI.security.cert_add:cli
:prog: security cert-add
:show-nested:

.. click:: SoftLayer.CLI.security.cert_add:cli
:prog: ssl add
:show-nested:

.. click:: SoftLayer.CLI.security.cert_download:cli
:prog: security cert-download
:show-nested:

.. click:: SoftLayer.CLI.security.cert_download:cli
:prog: ssl download
:show-nested:

.. click:: SoftLayer.CLI.security.cert_edit:cli
:prog: security cert-edit
:show-nested:

.. click:: SoftLayer.CLI.security.cert_edit:cli
:prog: ssl edit
:show-nested:

.. click:: SoftLayer.CLI.security.cert_list:cli
:prog: security cert-list
:show-nested:

.. click:: SoftLayer.CLI.security.cert_list:cli
:prog: ssl list
:show-nested:

.. click:: SoftLayer.CLI.security.cert_remove:cli
:prog: security cert-remove
:show-nested:

.. click:: SoftLayer.CLI.security.cert_remove:cli
:prog: ssl remove
:show-nested:
5 changes: 5 additions & 0 deletions docs/cli/sshkey.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,26 @@ SSH Keys
========

.. click:: SoftLayer.CLI.sshkey.add:cli
This command is an alias for `slcli security sshkey-add`
:prog: sshkey add
:show-nested:

.. click:: SoftLayer.CLI.sshkey.remove:cli
This command is an alias for `slcli security sshkey-remove`
:prog: sshkey remove
:show-nested:

.. click:: SoftLayer.CLI.sshkey.edit:cli
This command is an alias for `slcli security sshkey-edit`
:prog: sshkey edit
:show-nested:

.. click:: SoftLayer.CLI.sshkey.list:cli
This command is an alias for `slcli security sshkey-list`
:prog: sshkey list
:show-nested:

.. click:: SoftLayer.CLI.sshkey.print:cli
This command is an alias for `slcli security sshkey-print`
:prog: sshkey print
:show-nested:
5 changes: 5 additions & 0 deletions docs/cli/ssl.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,27 @@ SSL Certificates
================

.. click:: SoftLayer.CLI.ssl.add:cli
This command is an alias for `slcli security cert_add`
:prog: ssl add
:show-nested:

.. click:: SoftLayer.CLI.ssl.download:cli
This command is an alias for `slcli security cert_download`
:prog: ssl download
:show-nested:

.. click:: SoftLayer.CLI.ssl.edit:cli
This command is an alias for `slcli security cert_edit`
:prog: ssl edit
:show-nested:

.. click:: SoftLayer.CLI.ssl.list:cli
This command is an alias for `slcli security cert_list`
:prog: ssl list
:show-nested:

.. click:: SoftLayer.CLI.ssl.remove:cli
This command is an alias for `slcli security cert_remove`
:prog: ssl remove
:show-nested:

154 changes: 154 additions & 0 deletions tests/CLI/modules/security_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
"""
SoftLayer.tests.CLI.modules.security_tests
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:license: MIT, see LICENSE for more details.
"""
import json
import os.path
import sys
import tempfile

from unittest import mock as mock

from SoftLayer.CLI import exceptions
from SoftLayer import testing


class SecurityTests(testing.TestCase):
def test_add_sshkey_without_key_errors(self):
result = self.run_command(['security', 'sshkey-add', 'key1'])

self.assertEqual(result.exit_code, 2)
self.assertIsInstance(result.exception, exceptions.ArgumentError)

def test_add_sshkey_with_key_file_and_key_argument_errors(self):
path = os.path.join(testing.FIXTURE_PATH, 'id_rsa.pub')
result = self.run_command(['security', 'sshkey-add', 'key1',
'--key=some_key',
'--in-file=%s' % path])

self.assertEqual(result.exit_code, 2)
self.assertIsInstance(result.exception, exceptions.ArgumentError)

def test_add_sshkey_by_option(self):
service = self.client['Security_Ssh_Key']
mock_key = service.getObject()['key']

result = self.run_command(['security', 'sshkey-add', 'key1',
'--key=%s' % mock_key,
'--note=my key'])

self.assert_no_fail(result)
self.assertEqual(json.loads(result.output),
"SSH key added: aa:bb:cc:dd")
self.assert_called_with('SoftLayer_Security_Ssh_Key', 'createObject',
args=({'notes': 'my key',
'key': mock_key,
'label': 'key1'},))

def test_add_sshkey_by_file(self):
path = os.path.join(testing.FIXTURE_PATH, 'id_rsa.pub')

result = self.run_command(['security', 'sshkey-add', 'key1',
'--in-file=%s' % path])

self.assert_no_fail(result)
self.assertEqual(json.loads(result.output),
"SSH key added: aa:bb:cc:dd")
service = self.client['Security_Ssh_Key']
mock_key = service.getObject()['key']
self.assert_called_with('SoftLayer_Security_Ssh_Key', 'createObject',
args=({'notes': None,
'key': mock_key,
'label': 'key1'},))

def test_remove_sshkey_key(self):
result = self.run_command(['--really', 'security', 'sshkey-remove', '1234'])

self.assert_no_fail(result)
self.assert_called_with('SoftLayer_Security_Ssh_Key', 'deleteObject',
identifier=1234)

@mock.patch('SoftLayer.CLI.formatting.no_going_back')
def test_remove_sshkey_fail(self, ngb_mock):
ngb_mock.return_value = False
result = self.run_command(['security', 'sshkey-remove', '1234'])

self.assertEqual(result.exit_code, 2)

def test_edit_sshkey(self):
result = self.run_command(['security', 'sshkey-edit', '1234',
'--label=key1', '--note=my key'])

self.assert_no_fail(result)
self.assert_called_with('SoftLayer_Security_Ssh_Key', 'editObject',
args=({'notes': 'my key',
'label': 'key1'},),
identifier=1234)

def test_edit_sshkey_fail(self):
fixture = self.set_mock('SoftLayer_Security_Ssh_Key', 'editObject')
fixture.return_value = False

result = self.run_command(['security', 'sshkey-edit', '1234',
'--label=key1', '--note=my key'])

self.assertEqual(result.exit_code, 2)

def test_list_sshkeys(self):
result = self.run_command(['security', 'sshkey-list'])

self.assert_no_fail(result)
self.assertEqual(json.loads(result.output),
[{'notes': '-',
'fingerprint': None,
'id': '100',
'label': 'Test 1'},
{'notes': 'my key',
'fingerprint': None,
'id': '101',
'label': 'Test 2'}])

def test_print_sshkey(self):
result = self.run_command(['security', 'sshkey-print', '1234'])

self.assert_no_fail(result)
self.assertEqual(json.loads(result.output),
{'id': 1234, 'label': 'label', 'notes': 'notes'})

def test_print_sshkey_file(self):
if sys.platform.startswith("win"):
self.skipTest("Test doesn't work in Windows")
with tempfile.NamedTemporaryFile() as sshkey_file:
service = self.client['Security_Ssh_Key']
mock_key = service.getObject()['key']
result = self.run_command(['security', 'sshkey-print', '1234',
'--out-file=%s' % sshkey_file.name])

self.assert_no_fail(result)
self.assertEqual(mock_key, sshkey_file.read().decode("utf-8"))

def test_list_certficates(self):
result = self.run_command(['security', 'cert-list', '--status', 'all'])
self.assert_no_fail(result)
self.assertEqual(json.loads(result.output), [
{
"id": 1234,
"common_name": "cert",
"days_until_expire": 0,
"notes": None
}
])

@mock.patch('SoftLayer.CLI.formatting.no_going_back')
def test_remove_certficate(self, confirm_mock):
confirm_mock.return_value = True
result = self.run_command(['security', 'cert-remove', '123456'])
self.assert_no_fail(result)
self.assertEqual(result.exit_code, 0)

def test_download_certficate(self):
result = self.run_command(['security', 'cert-download', '123456'])
self.assert_no_fail(result)
self.assertEqual(result.exit_code, 0)
1 change: 0 additions & 1 deletion tests/CLI/modules/ssl_tests.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"""
SoftLayer.tests.CLI.modules.ssl_tests
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:license: MIT, see LICENSE for more details.
"""
from SoftLayer import testing
Expand Down