summaryrefslogtreecommitdiff
path: root/cinderclient/tests/unit/v3/test_shell.py
diff options
context:
space:
mode:
Diffstat (limited to 'cinderclient/tests/unit/v3/test_shell.py')
-rw-r--r--cinderclient/tests/unit/v3/test_shell.py103
1 files changed, 97 insertions, 6 deletions
diff --git a/cinderclient/tests/unit/v3/test_shell.py b/cinderclient/tests/unit/v3/test_shell.py
index 8f00525..58caddc 100644
--- a/cinderclient/tests/unit/v3/test_shell.py
+++ b/cinderclient/tests/unit/v3/test_shell.py
@@ -99,6 +99,14 @@ class ShellTest(utils.TestCase):
api_versions.APIVersion('3.99'))):
self.shell.main(cmd.split())
+ def run_command_with_server_api_max(self, api_max, cmd):
+ # version negotiation will use the supplied api_max, which must be
+ # a string value, as the server's max supported version
+ with mock.patch('cinderclient.api_versions._get_server_version_range',
+ return_value=(api_versions.APIVersion('3.0'),
+ api_versions.APIVersion(api_max))):
+ self.shell.main(cmd.split())
+
def assert_called(self, method, url, body=None,
partial_body=None, **kwargs):
return self.shell.cs.assert_called(method, url, body,
@@ -344,7 +352,7 @@ class ShellTest(utils.TestCase):
self.run_command(command)
self.assert_called('GET', '/volumes/detail?group_id=fake_id')
- @mock.patch("cinderclient.utils.print_list")
+ @mock.patch("cinderclient.shell_utils.print_list")
def test_list_duplicate_fields(self, mock_print):
self.run_command('list --field Status,id,Size,status')
self.assert_called('GET', '/volumes/detail')
@@ -520,7 +528,7 @@ class ShellTest(utils.TestCase):
self.run_command(command)
self.assert_called('GET', '/attachments%s' % expected)
- @mock.patch('cinderclient.utils.print_list')
+ @mock.patch('cinderclient.shell_utils.print_list')
@mock.patch.object(cinderclient.v3.attachments.VolumeAttachmentManager,
'list')
def test_attachment_list_setattr(self, mock_list, mock_print):
@@ -918,6 +926,41 @@ class ShellTest(utils.TestCase):
f'snapshot-create --force {force_value} 123456')
self.assert_called_anytime('POST', '/snapshots', body=snap_body_3_65)
+ @mock.patch('cinderclient.shell.CinderClientArgumentParser.exit')
+ def test_snapshot_create_pre_3_66_with_naked_force(
+ self, mock_exit):
+ mock_exit.side_effect = Exception("mock exit")
+ try:
+ self.run_command('--os-volume-api-version 3.65 '
+ 'snapshot-create --force 123456')
+ except Exception as e:
+ # ignore the exception (it's raised to simulate an exit),
+ # but make sure it's the exception we expect
+ self.assertEqual('mock exit', str(e))
+
+ exit_code = mock_exit.call_args.args[0]
+ self.assertEqual(2, exit_code)
+
+ @mock.patch('cinderclient.utils.find_resource')
+ def test_snapshot_create_pre_3_66_with_force_None(
+ self, mock_find_vol):
+ """We will let the API detect the problematic value."""
+ mock_find_vol.return_value = volumes.Volume(
+ self, {'id': '123456'}, loaded=True)
+ snap_body_3_65 = {
+ 'snapshot': {
+ 'volume_id': '123456',
+ # note: this is a string, NOT None!
+ 'force': 'None',
+ 'name': None,
+ 'description': None,
+ 'metadata': {}
+ }
+ }
+ self.run_command('--os-volume-api-version 3.65 '
+ 'snapshot-create --force None 123456')
+ self.assert_called_anytime('POST', '/snapshots', body=snap_body_3_65)
+
SNAP_BODY_3_66 = {
'snapshot': {
'volume_id': '123456',
@@ -953,6 +996,17 @@ class ShellTest(utils.TestCase):
self.assertIn('not allowed after microversion 3.65', str(uae))
@mock.patch('cinderclient.utils.find_resource')
+ def test_snapshot_create_3_66_with_force_None(
+ self, mock_find_vol):
+ mock_find_vol.return_value = volumes.Volume(
+ self, {'id': '123456'}, loaded=True)
+ uae = self.assertRaises(exceptions.UnsupportedAttribute,
+ self.run_command,
+ '--os-volume-api-version 3.66 '
+ 'snapshot-create --force None 123456')
+ self.assertIn('not allowed after microversion 3.65', str(uae))
+
+ @mock.patch('cinderclient.utils.find_resource')
def test_snapshot_create_3_66(self, mock_find_vol):
mock_find_vol.return_value = volumes.Volume(
self, {'id': '123456'}, loaded=True)
@@ -961,6 +1015,28 @@ class ShellTest(utils.TestCase):
self.assert_called_anytime('POST', '/snapshots',
body=self.SNAP_BODY_3_66)
+ @mock.patch('cinderclient.utils.find_resource')
+ def test_snapshot_create_3_66_not_supported(self, mock_find_vol):
+ mock_find_vol.return_value = volumes.Volume(
+ self, {'id': '123456'}, loaded=True)
+ self.run_command_with_server_api_max(
+ '3.64',
+ '--os-volume-api-version 3.66 snapshot-create 123456')
+ # call should be made, but will use the pre-3.66 request body
+ # because the client in use has been downgraded to 3.64
+ pre_3_66_request_body = {
+ 'snapshot': {
+ 'volume_id': '123456',
+ # default value is False
+ 'force': False,
+ 'name': None,
+ 'description': None,
+ 'metadata': {}
+ }
+ }
+ self.assert_called_anytime('POST', '/snapshots',
+ body=pre_3_66_request_body)
+
def test_snapshot_manageable_list(self):
self.run_command('--os-volume-api-version 3.8 '
'snapshot-manageable-list fakehost')
@@ -1209,7 +1285,7 @@ class ShellTest(utils.TestCase):
get_levels_mock.assert_not_called()
@mock.patch('cinderclient.v3.services.ServiceManager.get_log_levels')
- @mock.patch('cinderclient.utils.print_list')
+ @mock.patch('cinderclient.shell_utils.print_list')
def test_service_get_log_no_params(self, print_mock, get_levels_mock):
self.run_command('--os-volume-api-version 3.32 service-get-log')
get_levels_mock.assert_called_once_with('', '', '')
@@ -1220,7 +1296,7 @@ class ShellTest(utils.TestCase):
@ddt.data('*', 'cinder-api', 'cinder-volume', 'cinder-scheduler',
'cinder-backup')
@mock.patch('cinderclient.v3.services.ServiceManager.get_log_levels')
- @mock.patch('cinderclient.utils.print_list')
+ @mock.patch('cinderclient.shell_utils.print_list')
def test_service_get_log(self, binary, print_mock, get_levels_mock):
server = 'host1'
prefix = 'sqlalchemy'
@@ -1378,7 +1454,7 @@ class ShellTest(utils.TestCase):
'availability_zone': 'AZ2'}}
self.assert_called('POST', '/backups', body=expected)
- @mock.patch("cinderclient.utils.print_list")
+ @mock.patch("cinderclient.shell_utils.print_list")
def test_snapshot_list(self, mock_print_list):
"""Ensure we always present all existing fields when listing snaps."""
self.run_command('--os-volume-api-version 3.65 snapshot-list')
@@ -1847,7 +1923,7 @@ class ShellTest(utils.TestCase):
},
)
@ddt.unpack
- @mock.patch('cinderclient.utils.print_dict')
+ @mock.patch('cinderclient.shell_utils.print_dict')
@mock.patch('cinderclient.tests.unit.v3.fakes_base._stub_restore')
def test_do_backup_restore(self,
mock_stub_restore,
@@ -1895,3 +1971,18 @@ class ShellTest(utils.TestCase):
'volume_id': '1234',
'volume_name': volume_name,
})
+
+ def test_reimage(self):
+ self.run_command('--os-volume-api-version 3.68 reimage 1234 1')
+ expected = {'os-reimage': {'image_id': '1',
+ 'reimage_reserved': False}}
+ self.assert_called('POST', '/volumes/1234/action', body=expected)
+
+ @ddt.data('False', 'True')
+ def test_reimage_reserved(self, reimage_reserved):
+ self.run_command(
+ '--os-volume-api-version 3.68 reimage --reimage-reserved %s 1234 1'
+ % reimage_reserved)
+ expected = {'os-reimage': {'image_id': '1',
+ 'reimage_reserved': reimage_reserved}}
+ self.assert_called('POST', '/volumes/1234/action', body=expected)