diff options
| author | Zuul <zuul@review.opendev.org> | 2022-12-05 12:59:52 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2022-12-05 12:59:52 +0000 |
| commit | 29129a7715feb750b7738a5884f9d2f49491a511 (patch) | |
| tree | ce638cf37587869c165ac958ab56fa2f7801a43c /openstackclient/tests/unit | |
| parent | 8248efa8d9f264bdeb267d3eb666d87edf9b7574 (diff) | |
| parent | 4eea3408dc492e948671b625ffc4379212b5857c (diff) | |
| download | python-openstackclient-29129a7715feb750b7738a5884f9d2f49491a511.tar.gz | |
Merge "image: Add 'image import' command"
Diffstat (limited to 'openstackclient/tests/unit')
| -rw-r--r-- | openstackclient/tests/unit/image/v2/fakes.py | 37 | ||||
| -rw-r--r-- | openstackclient/tests/unit/image/v2/test_image.py | 191 |
2 files changed, 223 insertions, 5 deletions
diff --git a/openstackclient/tests/unit/image/v2/fakes.py b/openstackclient/tests/unit/image/v2/fakes.py index 8ce2a7d5..ded9ff31 100644 --- a/openstackclient/tests/unit/image/v2/fakes.py +++ b/openstackclient/tests/unit/image/v2/fakes.py @@ -19,6 +19,7 @@ import uuid from openstack.image.v2 import image from openstack.image.v2 import member from openstack.image.v2 import metadef_namespace +from openstack.image.v2 import service_info as _service_info from openstack.image.v2 import task from openstackclient.tests.unit import fakes @@ -39,6 +40,7 @@ class FakeImagev2Client: self.reactivate_image = mock.Mock() self.deactivate_image = mock.Mock() self.stage_image = mock.Mock() + self.import_image = mock.Mock() self.members = mock.Mock() self.add_member = mock.Mock() @@ -49,17 +51,15 @@ class FakeImagev2Client: self.metadef_namespaces = mock.Mock() self.tasks = mock.Mock() + self.tasks.resource_class = fakes.FakeResource(None, {}) self.get_task = mock.Mock() + self.get_import_info = mock.Mock() + self.auth_token = kwargs['token'] self.management_url = kwargs['endpoint'] self.version = 2.0 - self.tasks = mock.Mock() - self.tasks.resource_class = fakes.FakeResource(None, {}) - - self.metadef_namespaces = mock.Mock() - class TestImagev2(utils.TestCommand): @@ -143,6 +143,33 @@ def create_one_image_member(attrs=None): return member.Member(**image_member_info) +def create_one_import_info(attrs=None): + """Create a fake import info. + + :param attrs: A dictionary with all attributes of import info + :type attrs: dict + :return: A fake Import object. + :rtype: `openstack.image.v2.service_info.Import` + """ + attrs = attrs or {} + + import_info = { + 'import-methods': { + 'description': 'Import methods available.', + 'type': 'array', + 'value': [ + 'glance-direct', + 'web-download', + 'glance-download', + 'copy-image', + ] + } + } + import_info.update(attrs) + + return _service_info.Import(**import_info) + + def create_one_task(attrs=None): """Create a fake task. diff --git a/openstackclient/tests/unit/image/v2/test_image.py b/openstackclient/tests/unit/image/v2/test_image.py index 8dea7f05..010c4a9d 100644 --- a/openstackclient/tests/unit/image/v2/test_image.py +++ b/openstackclient/tests/unit/image/v2/test_image.py @@ -1823,6 +1823,197 @@ class TestImageStage(TestImage): ) +class TestImageImport(TestImage): + + image = image_fakes.create_one_image( + { + 'container_format': 'bare', + 'disk_format': 'qcow2', + } + ) + import_info = image_fakes.create_one_import_info() + + def setUp(self): + super().setUp() + + self.client.find_image.return_value = self.image + self.client.get_import_info.return_value = self.import_info + + self.cmd = _image.ImportImage(self.app, None) + + def test_import_image__glance_direct(self): + self.image.status = 'uploading' + arglist = [ + self.image.name, + ] + verifylist = [ + ('image', self.image.name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.client.import_image.assert_called_once_with( + self.image, + method='glance-direct', + stores=None, + all_stores=None, + all_stores_must_succeed=False, + ) + + def test_import_image__web_download(self): + self.image.status = 'queued' + arglist = [ + self.image.name, + '--method', 'web-download', + '--uri', 'https://example.com/', + ] + verifylist = [ + ('image', self.image.name), + ('import_method', 'web-download'), + ('uri', 'https://example.com/'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.client.import_image.assert_called_once_with( + self.image, + method='web-download', + # uri='https://example.com/', + stores=None, + all_stores=None, + all_stores_must_succeed=False, + ) + + # NOTE(stephenfin): We don't do this for all combinations since that would + # be tedious af. You get the idea... + def test_import_image__web_download_missing_options(self): + arglist = [ + self.image.name, + '--method', 'web-download', + ] + verifylist = [ + ('image', self.image.name), + ('import_method', 'web-download'), + ('uri', None), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args, + ) + self.assertIn("The '--uri' option is required ", str(exc)) + + self.client.import_image.assert_not_called() + + # NOTE(stephenfin): Ditto + def test_import_image__web_download_invalid_options(self): + arglist = [ + self.image.name, + '--method', 'glance-direct', # != web-download + '--uri', 'https://example.com/', + ] + verifylist = [ + ('image', self.image.name), + ('import_method', 'glance-direct'), + ('uri', 'https://example.com/'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args, + ) + self.assertIn("The '--uri' option is only supported ", str(exc)) + + self.client.import_image.assert_not_called() + + def test_import_image__web_download_invalid_image_state(self): + self.image.status = 'uploading' # != 'queued' + arglist = [ + self.image.name, + '--method', 'web-download', + '--uri', 'https://example.com/', + ] + verifylist = [ + ('image', self.image.name), + ('import_method', 'web-download'), + ('uri', 'https://example.com/'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args, + ) + self.assertIn( + "The 'web-download' import method can only be used with " + "an image in status 'queued'", + str(exc), + ) + + self.client.import_image.assert_not_called() + + def test_import_image__copy_image(self): + self.image.status = 'active' + arglist = [ + self.image.name, + '--method', 'copy-image', + '--store', 'fast', + ] + verifylist = [ + ('image', self.image.name), + ('import_method', 'copy-image'), + ('stores', ['fast']), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.client.import_image.assert_called_once_with( + self.image, + method='copy-image', + stores=['fast'], + all_stores=None, + all_stores_must_succeed=False, + ) + + def test_import_image__glance_download(self): + arglist = [ + self.image.name, + '--method', 'glance-download', + '--remote-region', 'eu/dublin', + '--remote-image', 'remote-image-id', + '--remote-service-interface', 'private', + ] + verifylist = [ + ('image', self.image.name), + ('import_method', 'glance-download'), + ('remote_region', 'eu/dublin'), + ('remote_image', 'remote-image-id'), + ('remote_service_interface', 'private'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.client.import_image.assert_called_once_with( + self.image, + method='glance-download', + # remote_region='eu/dublin', + # remote_image='remote-image-id', + # remote_service_interface='private', + stores=None, + all_stores=None, + all_stores_must_succeed=False, + ) + + class TestImageSave(TestImage): image = image_fakes.create_one_image({}) |
