diff options
Diffstat (limited to 'openstackclient/tests/image')
| -rw-r--r-- | openstackclient/tests/image/__init__.py | 0 | ||||
| -rw-r--r-- | openstackclient/tests/image/v1/__init__.py | 0 | ||||
| -rw-r--r-- | openstackclient/tests/image/v1/fakes.py | 76 | ||||
| -rw-r--r-- | openstackclient/tests/image/v1/test_image.py | 701 | ||||
| -rw-r--r-- | openstackclient/tests/image/v2/__init__.py | 0 | ||||
| -rw-r--r-- | openstackclient/tests/image/v2/fakes.py | 309 | ||||
| -rw-r--r-- | openstackclient/tests/image/v2/test_image.py | 1316 |
7 files changed, 0 insertions, 2402 deletions
diff --git a/openstackclient/tests/image/__init__.py b/openstackclient/tests/image/__init__.py deleted file mode 100644 index e69de29b..00000000 --- a/openstackclient/tests/image/__init__.py +++ /dev/null diff --git a/openstackclient/tests/image/v1/__init__.py b/openstackclient/tests/image/v1/__init__.py deleted file mode 100644 index e69de29b..00000000 --- a/openstackclient/tests/image/v1/__init__.py +++ /dev/null diff --git a/openstackclient/tests/image/v1/fakes.py b/openstackclient/tests/image/v1/fakes.py deleted file mode 100644 index 1e49f173..00000000 --- a/openstackclient/tests/image/v1/fakes.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2013 Nebula Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -import mock - -from openstackclient.tests import fakes -from openstackclient.tests import utils -from openstackclient.tests.volume.v1 import fakes as volume_fakes - - -image_id = 'im1' -image_name = 'graven' -image_owner = 'baal' -image_protected = False -image_public = True -image_properties = { - 'Alpha': 'a', - 'Beta': 'b', - 'Gamma': 'g', -} -image_properties_str = "Alpha='a', Beta='b', Gamma='g'" -image_data = 'line 1\nline 2\n' - -IMAGE = { - 'id': image_id, - 'name': image_name, - 'container_format': '', - 'disk_format': '', - 'owner': image_owner, - 'min_disk': 0, - 'min_ram': 0, - 'is_public': image_public, - 'protected': image_protected, - 'properties': image_properties, -} - -IMAGE_columns = tuple(sorted(IMAGE)) -IMAGE_output = dict(IMAGE) -IMAGE_output['properties'] = image_properties_str -IMAGE_data = tuple((IMAGE_output[x] for x in sorted(IMAGE_output))) - - -class FakeImagev1Client(object): - - def __init__(self, **kwargs): - self.images = mock.Mock() - self.images.resource_class = fakes.FakeResource(None, {}) - self.auth_token = kwargs['token'] - self.management_url = kwargs['endpoint'] - - -class TestImagev1(utils.TestCommand): - - def setUp(self): - super(TestImagev1, self).setUp() - - self.app.client_manager.image = FakeImagev1Client( - endpoint=fakes.AUTH_URL, - token=fakes.AUTH_TOKEN, - ) - self.app.client_manager.volume = volume_fakes.FakeVolumev1Client( - endpoint=fakes.AUTH_URL, - token=fakes.AUTH_TOKEN, - ) diff --git a/openstackclient/tests/image/v1/test_image.py b/openstackclient/tests/image/v1/test_image.py deleted file mode 100644 index cf08d138..00000000 --- a/openstackclient/tests/image/v1/test_image.py +++ /dev/null @@ -1,701 +0,0 @@ -# Copyright 2013 Nebula Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -import copy -import mock - -from osc_lib import exceptions - -from openstackclient.image.v1 import image -from openstackclient.tests import fakes -from openstackclient.tests.image.v1 import fakes as image_fakes - - -class TestImage(image_fakes.TestImagev1): - - def setUp(self): - super(TestImage, self).setUp() - - # Get a shortcut to the ServerManager Mock - self.images_mock = self.app.client_manager.image.images - self.images_mock.reset_mock() - - -class TestImageCreate(TestImage): - - def setUp(self): - super(TestImageCreate, self).setUp() - - self.images_mock.create.return_value = fakes.FakeResource( - None, - copy.deepcopy(image_fakes.IMAGE), - loaded=True, - ) - # This is the return value for utils.find_resource() - self.images_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(image_fakes.IMAGE), - loaded=True, - ) - self.images_mock.update.return_value = fakes.FakeResource( - None, - copy.deepcopy(image_fakes.IMAGE), - loaded=True, - ) - - # Get the command object to test - self.cmd = image.CreateImage(self.app, None) - - def test_image_reserve_no_options(self): - mock_exception = { - 'find.side_effect': exceptions.CommandError('x'), - 'get.side_effect': exceptions.CommandError('x'), - } - self.images_mock.configure_mock(**mock_exception) - arglist = [ - image_fakes.image_name, - ] - verifylist = [ - ('container_format', image.DEFAULT_CONTAINER_FORMAT), - ('disk_format', image.DEFAULT_DISK_FORMAT), - ('name', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - - # ImageManager.create(name=, **) - self.images_mock.create.assert_called_with( - name=image_fakes.image_name, - container_format=image.DEFAULT_CONTAINER_FORMAT, - disk_format=image.DEFAULT_DISK_FORMAT, - data=mock.ANY, - ) - - # Verify update() was not called, if it was show the args - self.assertEqual(self.images_mock.update.call_args_list, []) - - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_data, data) - - def test_image_reserve_options(self): - mock_exception = { - 'find.side_effect': exceptions.CommandError('x'), - 'get.side_effect': exceptions.CommandError('x'), - } - self.images_mock.configure_mock(**mock_exception) - arglist = [ - '--container-format', 'ovf', - '--disk-format', 'fs', - '--min-disk', '10', - '--min-ram', '4', - '--protected', - '--private', - '--project', 'q', - image_fakes.image_name, - ] - verifylist = [ - ('container_format', 'ovf'), - ('disk_format', 'fs'), - ('min_disk', 10), - ('min_ram', 4), - ('protected', True), - ('unprotected', False), - ('public', False), - ('private', True), - ('project', 'q'), - ('name', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - - # ImageManager.create(name=, **) - self.images_mock.create.assert_called_with( - name=image_fakes.image_name, - container_format='ovf', - disk_format='fs', - min_disk=10, - min_ram=4, - protected=True, - is_public=False, - owner='q', - data=mock.ANY, - ) - - # Verify update() was not called, if it was show the args - self.assertEqual(self.images_mock.update.call_args_list, []) - - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_data, data) - - @mock.patch('openstackclient.image.v1.image.io.open', name='Open') - def test_image_create_file(self, mock_open): - mock_file = mock.MagicMock(name='File') - mock_open.return_value = mock_file - mock_open.read.return_value = image_fakes.image_data - mock_exception = { - 'find.side_effect': exceptions.CommandError('x'), - 'get.side_effect': exceptions.CommandError('x'), - } - self.images_mock.configure_mock(**mock_exception) - - arglist = [ - '--file', 'filer', - '--unprotected', - '--public', - '--property', 'Alpha=1', - '--property', 'Beta=2', - image_fakes.image_name, - ] - verifylist = [ - ('file', 'filer'), - ('protected', False), - ('unprotected', True), - ('public', True), - ('private', False), - ('properties', {'Alpha': '1', 'Beta': '2'}), - ('name', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - - # Ensure input file is opened - mock_open.assert_called_with('filer', 'rb') - - # Ensure the input file is closed - mock_file.close.assert_called_with() - - # ImageManager.get(name) not to be called since update action exists - self.images_mock.get.assert_not_called() - - # ImageManager.create(name=, **) - self.images_mock.create.assert_called_with( - name=image_fakes.image_name, - container_format=image.DEFAULT_CONTAINER_FORMAT, - disk_format=image.DEFAULT_DISK_FORMAT, - protected=False, - is_public=True, - properties={ - 'Alpha': '1', - 'Beta': '2', - }, - data=mock_file, - ) - - # Verify update() was not called, if it was show the args - self.assertEqual(self.images_mock.update.call_args_list, []) - - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_data, data) - - -class TestImageDelete(TestImage): - - def setUp(self): - super(TestImageDelete, self).setUp() - - # This is the return value for utils.find_resource() - self.images_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(image_fakes.IMAGE), - loaded=True, - ) - self.images_mock.delete.return_value = None - - # Get the command object to test - self.cmd = image.DeleteImage(self.app, None) - - def test_image_delete_no_options(self): - arglist = [ - image_fakes.image_id, - ] - verifylist = [ - ('images', [image_fakes.image_id]), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.images_mock.delete.assert_called_with(image_fakes.image_id) - self.assertIsNone(result) - - -class TestImageList(TestImage): - - columns = ( - 'ID', - 'Name', - 'Status', - ) - datalist = ( - ( - image_fakes.image_id, - image_fakes.image_name, - '', - ), - ) - - def setUp(self): - super(TestImageList, self).setUp() - - self.api_mock = mock.Mock() - self.api_mock.image_list.side_effect = [ - [copy.deepcopy(image_fakes.IMAGE)], [], - ] - self.app.client_manager.image.api = self.api_mock - - # Get the command object to test - self.cmd = image.ListImage(self.app, None) - - def test_image_list_no_options(self): - arglist = [] - verifylist = [ - ('public', False), - ('private', False), - ('long', False), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - detailed=True, - marker=image_fakes.image_id, - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - def test_image_list_public_option(self): - arglist = [ - '--public', - ] - verifylist = [ - ('public', True), - ('private', False), - ('long', False), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - detailed=True, - public=True, - marker=image_fakes.image_id, - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - def test_image_list_private_option(self): - arglist = [ - '--private', - ] - verifylist = [ - ('public', False), - ('private', True), - ('long', False), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - detailed=True, - private=True, - marker=image_fakes.image_id, - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - def test_image_list_long_option(self): - arglist = [ - '--long', - ] - verifylist = [ - ('long', True), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - detailed=True, - marker=image_fakes.image_id, - ) - - collist = ( - 'ID', - 'Name', - 'Disk Format', - 'Container Format', - 'Size', - 'Checksum', - 'Status', - 'Visibility', - 'Protected', - 'Project', - 'Properties', - ) - - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - '', - '', - '', - '', - 'public', - False, - image_fakes.image_owner, - "Alpha='a', Beta='b', Gamma='g'", - ), ) - self.assertEqual(datalist, tuple(data)) - - @mock.patch('openstackclient.api.utils.simple_filter') - def test_image_list_property_option(self, sf_mock): - sf_mock.side_effect = [ - [copy.deepcopy(image_fakes.IMAGE)], [], - ] - - arglist = [ - '--property', 'a=1', - ] - verifylist = [ - ('property', {'a': '1'}), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - detailed=True, - marker=image_fakes.image_id, - ) - sf_mock.assert_called_with( - [image_fakes.IMAGE], - attr='a', - value='1', - property_field='properties', - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - @mock.patch('osc_lib.utils.sort_items') - def test_image_list_sort_option(self, si_mock): - si_mock.side_effect = [ - [copy.deepcopy(image_fakes.IMAGE)], [], - ] - - arglist = ['--sort', 'name:asc'] - verifylist = [('sort', 'name:asc')] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - detailed=True, - marker=image_fakes.image_id, - ) - si_mock.assert_called_with( - [image_fakes.IMAGE], - 'name:asc' - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - -class TestImageSet(TestImage): - - def setUp(self): - super(TestImageSet, self).setUp() - - # This is the return value for utils.find_resource() - self.images_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(image_fakes.IMAGE), - loaded=True, - ) - self.images_mock.update.return_value = fakes.FakeResource( - None, - copy.deepcopy(image_fakes.IMAGE), - loaded=True, - ) - - # Get the command object to test - self.cmd = image.SetImage(self.app, None) - - def test_image_set_no_options(self): - arglist = [ - image_fakes.image_name, - ] - verifylist = [ - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.images_mock.update.assert_called_with(image_fakes.image_id, - **{}) - self.assertIsNone(result) - - def test_image_set_options(self): - arglist = [ - '--name', 'new-name', - '--min-disk', '2', - '--min-ram', '4', - '--container-format', 'ovf', - '--disk-format', 'vmdk', - '--size', '35165824', - '--project', 'new-owner', - image_fakes.image_name, - ] - verifylist = [ - ('name', 'new-name'), - ('min_disk', 2), - ('min_ram', 4), - ('container_format', 'ovf'), - ('disk_format', 'vmdk'), - ('size', 35165824), - ('project', 'new-owner'), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'name': 'new-name', - 'owner': 'new-owner', - 'min_disk': 2, - 'min_ram': 4, - 'container_format': 'ovf', - 'disk_format': 'vmdk', - 'size': 35165824 - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_bools1(self): - arglist = [ - '--protected', - '--private', - image_fakes.image_name, - ] - verifylist = [ - ('protected', True), - ('unprotected', False), - ('public', False), - ('private', True), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'protected': True, - 'is_public': False, - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_bools2(self): - arglist = [ - '--unprotected', - '--public', - image_fakes.image_name, - ] - verifylist = [ - ('protected', False), - ('unprotected', True), - ('public', True), - ('private', False), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'protected': False, - 'is_public': True, - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_properties(self): - arglist = [ - '--property', 'Alpha=1', - '--property', 'Beta=2', - image_fakes.image_name, - ] - verifylist = [ - ('properties', {'Alpha': '1', 'Beta': '2'}), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'properties': { - 'Alpha': '1', - 'Beta': '2', - 'Gamma': 'g', - }, - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_update_volume(self): - # Set up VolumeManager Mock - volumes_mock = self.app.client_manager.volume.volumes - volumes_mock.reset_mock() - volumes_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy({'id': 'vol1', 'name': 'volly'}), - loaded=True, - ) - response = { - "id": 'volume_id', - "updated_at": 'updated_at', - "status": 'uploading', - "display_description": 'desc', - "size": 'size', - "volume_type": 'volume_type', - "container_format": image.DEFAULT_CONTAINER_FORMAT, - "disk_format": image.DEFAULT_DISK_FORMAT, - "image": image_fakes.image_name, - } - full_response = {"os-volume_upload_image": response} - volumes_mock.upload_to_image.return_value = (201, full_response) - - arglist = [ - '--volume', 'volly', - '--name', 'updated_image', - image_fakes.image_name, - ] - verifylist = [ - ('private', False), - ('protected', False), - ('public', False), - ('unprotected', False), - ('volume', 'volly'), - ('force', False), - ('name', 'updated_image'), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - # VolumeManager.upload_to_image(volume, force, image_name, - # container_format, disk_format) - volumes_mock.upload_to_image.assert_called_with( - 'vol1', - False, - image_fakes.image_name, - '', - '', - ) - # ImageManager.update(image_id, remove_props=, **) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - name='updated_image', - volume='volly', - ) - self.assertIsNone(result) - - -class TestImageShow(TestImage): - - def setUp(self): - super(TestImageShow, self).setUp() - - self.images_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(image_fakes.IMAGE), - loaded=True, - ) - - # Get the command object to test - self.cmd = image.ShowImage(self.app, None) - - def test_image_show(self): - arglist = [ - image_fakes.image_id, - ] - verifylist = [ - ('image', image_fakes.image_id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - self.images_mock.get.assert_called_with( - image_fakes.image_id, - ) - - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_data, data) diff --git a/openstackclient/tests/image/v2/__init__.py b/openstackclient/tests/image/v2/__init__.py deleted file mode 100644 index e69de29b..00000000 --- a/openstackclient/tests/image/v2/__init__.py +++ /dev/null diff --git a/openstackclient/tests/image/v2/fakes.py b/openstackclient/tests/image/v2/fakes.py deleted file mode 100644 index d450dec1..00000000 --- a/openstackclient/tests/image/v2/fakes.py +++ /dev/null @@ -1,309 +0,0 @@ -# Copyright 2013 Nebula Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -import copy -import mock -import random -import uuid - -from glanceclient.v2 import schemas -from osc_lib import utils as common_utils -import warlock - -from openstackclient.tests import fakes -from openstackclient.tests.identity.v3 import fakes as identity_fakes -from openstackclient.tests import utils - -image_id = '0f41529e-7c12-4de8-be2d-181abb825b3c' -image_name = 'graven' -image_owner = 'baal' -image_protected = False -image_visibility = 'public' -image_tags = [] - -IMAGE = { - 'id': image_id, - 'name': image_name, - 'owner': image_owner, - 'protected': image_protected, - 'visibility': image_visibility, - 'tags': image_tags -} - -IMAGE_columns = tuple(sorted(IMAGE)) -IMAGE_data = tuple((IMAGE[x] for x in sorted(IMAGE))) - -IMAGE_SHOW = copy.copy(IMAGE) -IMAGE_SHOW['tags'] = '' -IMAGE_SHOW_data = tuple((IMAGE_SHOW[x] for x in sorted(IMAGE_SHOW))) - -# Just enough v2 schema to do some testing -IMAGE_schema = { - "additionalProperties": { - "type": "string" - }, - "name": "image", - "links": [ - { - "href": "{self}", - "rel": "self" - }, - { - "href": "{file}", - "rel": "enclosure" - }, - { - "href": "{schema}", - "rel": "describedby" - } - ], - "properties": { - "id": { - "pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$", # noqa - "type": "string", - "description": "An identifier for the image" - }, - "name": { - "type": [ - "null", - "string" - ], - "description": "Descriptive name for the image", - "maxLength": 255 - }, - "owner": { - "type": [ - "null", - "string" - ], - "description": "Owner of the image", - "maxLength": 255 - }, - "protected": { - "type": "boolean", - "description": "If true, image will not be deletable." - }, - "self": { - "type": "string", - "description": "(READ-ONLY)" - }, - "schema": { - "type": "string", - "description": "(READ-ONLY)" - }, - "size": { - "type": [ - "null", - "integer" - ], - "description": "Size of image file in bytes (READ-ONLY)" - }, - "status": { - "enum": [ - "queued", - "saving", - "active", - "killed", - "deleted", - "pending_delete" - ], - "type": "string", - "description": "Status of the image (READ-ONLY)" - }, - "tags": { - "items": { - "type": "string", - "maxLength": 255 - }, - "type": "array", - "description": "List of strings related to the image" - }, - "visibility": { - "enum": [ - "public", - "private" - ], - "type": "string", - "description": "Scope of image accessibility" - }, - } -} - - -class FakeImagev2Client(object): - - def __init__(self, **kwargs): - self.images = mock.Mock() - self.images.resource_class = fakes.FakeResource(None, {}) - self.image_members = mock.Mock() - self.image_members.resource_class = fakes.FakeResource(None, {}) - self.image_tags = mock.Mock() - self.image_tags.resource_class = fakes.FakeResource(None, {}) - self.auth_token = kwargs['token'] - self.management_url = kwargs['endpoint'] - - -class TestImagev2(utils.TestCommand): - - def setUp(self): - super(TestImagev2, self).setUp() - - self.app.client_manager.image = FakeImagev2Client( - endpoint=fakes.AUTH_URL, - token=fakes.AUTH_TOKEN, - ) - - self.app.client_manager.identity = identity_fakes.FakeIdentityv3Client( - endpoint=fakes.AUTH_URL, - token=fakes.AUTH_TOKEN, - ) - - -class FakeImage(object): - """Fake one or more images. - - TODO(xiexs): Currently, only image API v2 is supported by this class. - """ - - @staticmethod - def create_one_image(attrs=None): - """Create a fake image. - - :param Dictionary attrs: - A dictionary with all attrbutes of image - :return: - A FakeResource object with id, name, owner, protected, - visibility and tags attrs - """ - attrs = attrs or {} - - # Set default attribute - image_info = { - 'id': str(uuid.uuid4()), - 'name': 'image-name' + uuid.uuid4().hex, - 'owner': 'image-owner' + uuid.uuid4().hex, - 'protected': bool(random.choice([0, 1])), - 'visibility': random.choice(['public', 'private']), - 'tags': [uuid.uuid4().hex for r in range(2)], - } - - # Overwrite default attributes if there are some attributes set - image_info.update(attrs) - - # Set up the schema - model = warlock.model_factory( - IMAGE_schema, - schemas.SchemaBasedModel, - ) - - return model(**image_info) - - @staticmethod - def create_images(attrs=None, count=2): - """Create multiple fake images. - - :param Dictionary attrs: - A dictionary with all attributes of image - :param Integer count: - The number of images to be faked - :return: - A list of FakeResource objects - """ - images = [] - for n in range(0, count): - images.append(FakeImage.create_one_image(attrs)) - - return images - - @staticmethod - def get_images(images=None, count=2): - """Get an iterable MagicMock object with a list of faked images. - - If images list is provided, then initialize the Mock object with the - list. Otherwise create one. - - :param List images: - A list of FakeResource objects faking images - :param Integer count: - The number of images to be faked - :return - An iterable Mock object with side_effect set to a list of faked - images - """ - if images is None: - images = FakeImage.create_images(count) - - return mock.MagicMock(side_effect=images) - - @staticmethod - def get_image_columns(image=None): - """Get the image columns from a faked image object. - - :param image: - A FakeResource objects faking image - :return - A tuple which may include the following keys: - ('id', 'name', 'owner', 'protected', 'visibility', 'tags') - """ - if image is not None: - return tuple(sorted(image)) - return IMAGE_columns - - @staticmethod - def get_image_data(image=None): - """Get the image data from a faked image object. - - :param image: - A FakeResource objects faking image - :return - A tuple which may include the following values: - ('image-123', 'image-foo', 'admin', False, 'public', 'bar, baz') - """ - data_list = [] - if image is not None: - for x in sorted(image.keys()): - if x == 'tags': - # The 'tags' should be format_list - data_list.append( - common_utils.format_list(getattr(image, x))) - else: - data_list.append(getattr(image, x)) - return tuple(data_list) - - @staticmethod - def create_one_image_member(attrs=None): - """Create a fake image member. - - :param Dictionary attrs: - A dictionary with all attrbutes of image member - :return: - A FakeResource object with member_id, image_id and so on - """ - attrs = attrs or {} - - # Set default attribute - image_member_info = { - 'member_id': 'member-id-' + uuid.uuid4().hex, - 'image_id': 'image-id-' + uuid.uuid4().hex, - 'status': 'pending', - } - - # Overwrite default attributes if there are some attributes set - image_member_info.update(attrs) - - image_member = fakes.FakeModel( - copy.deepcopy(image_member_info)) - - return image_member diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py deleted file mode 100644 index 830590c9..00000000 --- a/openstackclient/tests/image/v2/test_image.py +++ /dev/null @@ -1,1316 +0,0 @@ -# Copyright 2013 Nebula Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -import copy -import mock - -from glanceclient.v2 import schemas -from osc_lib import exceptions -from osc_lib import utils as common_utils -import warlock - -from openstackclient.image.v2 import image -from openstackclient.tests.identity.v3 import fakes as identity_fakes -from openstackclient.tests.image.v2 import fakes as image_fakes - - -class TestImage(image_fakes.TestImagev2): - - def setUp(self): - super(TestImage, self).setUp() - - # Get shortcuts to the Mocks in image client - self.images_mock = self.app.client_manager.image.images - self.images_mock.reset_mock() - self.image_members_mock = self.app.client_manager.image.image_members - self.image_members_mock.reset_mock() - self.image_tags_mock = self.app.client_manager.image.image_tags - self.image_tags_mock.reset_mock() - - # Get shortcut to the Mocks in identity client - self.project_mock = self.app.client_manager.identity.projects - self.project_mock.reset_mock() - self.domain_mock = self.app.client_manager.identity.domains - self.domain_mock.reset_mock() - - def setup_images_mock(self, count): - images = image_fakes.FakeImage.create_images(count=count) - - self.images_mock.get = image_fakes.FakeImage.get_images( - images, - 0) - return images - - -class TestImageCreate(TestImage): - - project = identity_fakes.FakeProject.create_one_project() - domain = identity_fakes.FakeDomain.create_one_domain() - - def setUp(self): - super(TestImageCreate, self).setUp() - - self.new_image = image_fakes.FakeImage.create_one_image() - self.images_mock.create.return_value = self.new_image - - self.project_mock.get.return_value = self.project - - self.domain_mock.get.return_value = self.domain - - # This is the return value for utils.find_resource() - self.images_mock.get.return_value = copy.deepcopy( - self.new_image - ) - self.images_mock.update.return_value = self.new_image - - # Get the command object to test - self.cmd = image.CreateImage(self.app, None) - - def test_image_reserve_no_options(self): - mock_exception = { - 'find.side_effect': exceptions.CommandError('x'), - } - self.images_mock.configure_mock(**mock_exception) - arglist = [ - self.new_image.name - ] - verifylist = [ - ('container_format', image.DEFAULT_CONTAINER_FORMAT), - ('disk_format', image.DEFAULT_DISK_FORMAT), - ('name', self.new_image.name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - - # ImageManager.create(name=, **) - self.images_mock.create.assert_called_with( - name=self.new_image.name, - container_format=image.DEFAULT_CONTAINER_FORMAT, - disk_format=image.DEFAULT_DISK_FORMAT, - ) - - # Verify update() was not called, if it was show the args - self.assertEqual(self.images_mock.update.call_args_list, []) - - self.images_mock.upload.assert_called_with( - mock.ANY, mock.ANY, - ) - - self.assertEqual( - image_fakes.FakeImage.get_image_columns(self.new_image), - columns) - self.assertEqual( - image_fakes.FakeImage.get_image_data(self.new_image), - data) - - @mock.patch('glanceclient.common.utils.get_data_file', name='Open') - def test_image_reserve_options(self, mock_open): - mock_file = mock.MagicMock(name='File') - mock_open.return_value = mock_file - mock_open.read.return_value = None - mock_exception = { - 'find.side_effect': exceptions.CommandError('x'), - } - self.images_mock.configure_mock(**mock_exception) - arglist = [ - '--container-format', 'ovf', - '--disk-format', 'fs', - '--min-disk', '10', - '--min-ram', '4', - ('--protected' - if self.new_image.protected else '--unprotected'), - ('--private' - if self.new_image.visibility == 'private' else '--public'), - '--project', self.new_image.owner, - '--project-domain', self.domain.id, - self.new_image.name, - ] - verifylist = [ - ('container_format', 'ovf'), - ('disk_format', 'fs'), - ('min_disk', 10), - ('min_ram', 4), - ('protected', self.new_image.protected), - ('unprotected', not self.new_image.protected), - ('public', self.new_image.visibility == 'public'), - ('private', self.new_image.visibility == 'private'), - ('project', self.new_image.owner), - ('project_domain', self.domain.id), - ('name', self.new_image.name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - - # ImageManager.create(name=, **) - self.images_mock.create.assert_called_with( - name=self.new_image.name, - container_format='ovf', - disk_format='fs', - min_disk=10, - min_ram=4, - owner=self.project.id, - protected=self.new_image.protected, - visibility=self.new_image.visibility, - ) - - # Verify update() was not called, if it was show the args - self.assertEqual(self.images_mock.update.call_args_list, []) - - self.images_mock.upload.assert_called_with( - mock.ANY, mock.ANY, - ) - - self.assertEqual( - image_fakes.FakeImage.get_image_columns(self.new_image), - columns) - self.assertEqual( - image_fakes.FakeImage.get_image_data(self.new_image), - data) - - def test_image_create_with_unexist_owner(self): - self.project_mock.get.side_effect = exceptions.NotFound(None) - self.project_mock.find.side_effect = exceptions.NotFound(None) - - arglist = [ - '--container-format', 'ovf', - '--disk-format', 'fs', - '--min-disk', '10', - '--min-ram', '4', - '--owner', 'unexist_owner', - '--protected', - '--private', - image_fakes.image_name, - ] - verifylist = [ - ('container_format', 'ovf'), - ('disk_format', 'fs'), - ('min_disk', 10), - ('min_ram', 4), - ('owner', 'unexist_owner'), - ('protected', True), - ('unprotected', False), - ('public', False), - ('private', True), - ('name', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - self.assertRaises( - exceptions.CommandError, - self.cmd.take_action, - parsed_args, - ) - - def test_image_create_with_unexist_project(self): - self.project_mock.get.side_effect = exceptions.NotFound(None) - self.project_mock.find.side_effect = exceptions.NotFound(None) - - arglist = [ - '--container-format', 'ovf', - '--disk-format', 'fs', - '--min-disk', '10', - '--min-ram', '4', - '--protected', - '--private', - '--project', 'unexist_owner', - image_fakes.image_name, - ] - verifylist = [ - ('container_format', 'ovf'), - ('disk_format', 'fs'), - ('min_disk', 10), - ('min_ram', 4), - ('protected', True), - ('unprotected', False), - ('public', False), - ('private', True), - ('project', 'unexist_owner'), - ('name', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - self.assertRaises( - exceptions.CommandError, - self.cmd.take_action, - parsed_args, - ) - - @mock.patch('glanceclient.common.utils.get_data_file', name='Open') - def test_image_create_file(self, mock_open): - mock_file = mock.MagicMock(name='File') - mock_open.return_value = mock_file - mock_open.read.return_value = ( - image_fakes.FakeImage.get_image_data(self.new_image)) - mock_exception = { - 'find.side_effect': exceptions.CommandError('x'), - } - self.images_mock.configure_mock(**mock_exception) - - arglist = [ - '--file', 'filer', - ('--unprotected' - if not self.new_image.protected else '--protected'), - ('--public' - if self.new_image.visibility == 'public' else '--private'), - '--property', 'Alpha=1', - '--property', 'Beta=2', - '--tag', self.new_image.tags[0], - '--tag', self.new_image.tags[1], - self.new_image.name, - ] - verifylist = [ - ('file', 'filer'), - ('protected', self.new_image.protected), - ('unprotected', not self.new_image.protected), - ('public', self.new_image.visibility == 'public'), - ('private', self.new_image.visibility == 'private'), - ('properties', {'Alpha': '1', 'Beta': '2'}), - ('tags', self.new_image.tags), - ('name', self.new_image.name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - - # ImageManager.create(name=, **) - self.images_mock.create.assert_called_with( - name=self.new_image.name, - container_format=image.DEFAULT_CONTAINER_FORMAT, - disk_format=image.DEFAULT_DISK_FORMAT, - protected=self.new_image.protected, - visibility=self.new_image.visibility, - Alpha='1', - Beta='2', - tags=self.new_image.tags, - ) - - # Verify update() was not called, if it was show the args - self.assertEqual(self.images_mock.update.call_args_list, []) - - self.images_mock.upload.assert_called_with( - mock.ANY, mock.ANY, - ) - - self.assertEqual( - image_fakes.FakeImage.get_image_columns(self.new_image), - columns) - self.assertEqual( - image_fakes.FakeImage.get_image_data(self.new_image), - data) - - def test_image_create_dead_options(self): - - arglist = [ - '--store', 'somewhere', - self.new_image.name, - ] - verifylist = [ - ('name', self.new_image.name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - self.assertRaises( - exceptions.CommandError, - self.cmd.take_action, parsed_args) - - -class TestAddProjectToImage(TestImage): - - project = identity_fakes.FakeProject.create_one_project() - domain = identity_fakes.FakeDomain.create_one_domain() - _image = image_fakes.FakeImage.create_one_image() - new_member = image_fakes.FakeImage.create_one_image_member( - attrs={'image_id': _image.id, - 'member_id': project.id} - ) - - columns = ( - 'image_id', - 'member_id', - 'status', - ) - - datalist = ( - _image.id, - new_member.member_id, - new_member.status, - ) - - def setUp(self): - super(TestAddProjectToImage, self).setUp() - - # This is the return value for utils.find_resource() - self.images_mock.get.return_value = self._image - - # Update the image_id in the MEMBER dict - self.image_members_mock.create.return_value = self.new_member - self.project_mock.get.return_value = self.project - self.domain_mock.get.return_value = self.domain - # Get the command object to test - self.cmd = image.AddProjectToImage(self.app, None) - - def test_add_project_to_image_no_option(self): - arglist = [ - self._image.id, - self.project.id, - ] - verifylist = [ - ('image', self._image.id), - ('project', self.project.id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - self.image_members_mock.create.assert_called_with( - self._image.id, - self.project.id - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, data) - - def test_add_project_to_image_with_option(self): - arglist = [ - self._image.id, - self.project.id, - '--project-domain', self.domain.id, - ] - verifylist = [ - ('image', self._image.id), - ('project', self.project.id), - ('project_domain', self.domain.id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - self.image_members_mock.create.assert_called_with( - self._image.id, - self.project.id - ) - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, data) - - -class TestImageDelete(TestImage): - - def setUp(self): - super(TestImageDelete, self).setUp() - - self.images_mock.delete.return_value = None - - # Get the command object to test - self.cmd = image.DeleteImage(self.app, None) - - def test_image_delete_no_options(self): - images = self.setup_images_mock(count=1) - - arglist = [ - images[0].id, - ] - verifylist = [ - ('images', [images[0].id]), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.images_mock.delete.assert_called_with(images[0].id) - self.assertIsNone(result) - - def test_image_delete_multi_images(self): - images = self.setup_images_mock(count=3) - - arglist = [i.id for i in images] - verifylist = [ - ('images', arglist), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - calls = [mock.call(i.id) for i in images] - self.images_mock.delete.assert_has_calls(calls) - self.assertIsNone(result) - - def test_image_delete_multi_images_exception(self): - - images = image_fakes.FakeImage.create_images(count=2) - arglist = [ - images[0].id, - images[1].id, - 'x-y-x', - ] - verifylist = [ - ('images', arglist) - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # Fake exception in utils.find_resource() - # In image v2, we use utils.find_resource() to find a network. - # It calls get() several times, but find() only one time. So we - # choose to fake get() always raise exception, then pass through. - # And fake find() to find the real network or not. - ret_find = [ - images[0], - images[1], - exceptions.NotFound('404'), - ] - - self.images_mock.get = Exception() - self.images_mock.find.side_effect = ret_find - self.assertRaises(exceptions.CommandError, self.cmd.take_action, - parsed_args) - calls = [mock.call(i.id) for i in images] - self.images_mock.delete.assert_has_calls(calls) - - -class TestImageList(TestImage): - - _image = image_fakes.FakeImage.create_one_image() - - columns = ( - 'ID', - 'Name', - 'Status', - ) - - datalist = ( - _image.id, - _image.name, - '', - ), - - def setUp(self): - super(TestImageList, self).setUp() - - self.api_mock = mock.Mock() - self.api_mock.image_list.side_effect = [ - [self._image], [], - ] - self.app.client_manager.image.api = self.api_mock - - # Get the command object to test - self.cmd = image.ListImage(self.app, None) - - def test_image_list_no_options(self): - arglist = [] - verifylist = [ - ('public', False), - ('private', False), - ('shared', False), - ('long', False), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with() - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - def test_image_list_public_option(self): - arglist = [ - '--public', - ] - verifylist = [ - ('public', True), - ('private', False), - ('shared', False), - ('long', False), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - public=True, - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - def test_image_list_private_option(self): - arglist = [ - '--private', - ] - verifylist = [ - ('public', False), - ('private', True), - ('shared', False), - ('long', False), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - private=True, - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - def test_image_list_shared_option(self): - arglist = [ - '--shared', - ] - verifylist = [ - ('public', False), - ('private', False), - ('shared', True), - ('long', False), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - shared=True, - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - def test_image_list_long_option(self): - arglist = [ - '--long', - ] - verifylist = [ - ('long', True), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with() - - collist = ( - 'ID', - 'Name', - 'Disk Format', - 'Container Format', - 'Size', - 'Checksum', - 'Status', - 'Visibility', - 'Protected', - 'Project', - 'Tags', - ) - - self.assertEqual(collist, columns) - datalist = (( - self._image.id, - self._image.name, - '', - '', - '', - '', - '', - self._image.visibility, - self._image.protected, - self._image.owner, - common_utils.format_list(self._image.tags), - ), ) - self.assertEqual(datalist, tuple(data)) - - @mock.patch('openstackclient.api.utils.simple_filter') - def test_image_list_property_option(self, sf_mock): - sf_mock.return_value = [copy.deepcopy(self._image)] - - arglist = [ - '--property', 'a=1', - ] - verifylist = [ - ('property', {'a': '1'}), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with() - sf_mock.assert_called_with( - [self._image], - attr='a', - value='1', - property_field='properties', - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - @mock.patch('osc_lib.utils.sort_items') - def test_image_list_sort_option(self, si_mock): - si_mock.return_value = [copy.deepcopy(self._image)] - - arglist = ['--sort', 'name:asc'] - verifylist = [('sort', 'name:asc')] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class Lister in cliff, abstract method take_action() - # returns a tuple containing the column names and an iterable - # containing the data to be listed. - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with() - si_mock.assert_called_with( - [self._image], - 'name:asc' - ) - self.assertEqual(self.columns, columns) - self.assertEqual(self.datalist, tuple(data)) - - def test_image_list_limit_option(self): - arglist = [ - '--limit', str(1), - ] - verifylist = [ - ('limit', 1), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - limit=1, - ) - - self.assertEqual(self.columns, columns) - self.assertEqual(len(self.datalist), len(tuple(data))) - - @mock.patch('osc_lib.utils.find_resource') - def test_image_list_marker_option(self, fr_mock): - # tangchen: Since image_fakes.IMAGE is a dict, it cannot offer a .id - # operation. Will fix this by using FakeImage class instead - # of IMAGE dict. - fr_mock.return_value = mock.Mock() - fr_mock.return_value.id = image_fakes.image_id - - arglist = [ - '--marker', image_fakes.image_name, - ] - verifylist = [ - ('marker', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - marker=image_fakes.image_id, - ) - - -class TestRemoveProjectImage(TestImage): - - project = identity_fakes.FakeProject.create_one_project() - domain = identity_fakes.FakeDomain.create_one_domain() - - def setUp(self): - super(TestRemoveProjectImage, self).setUp() - - self._image = image_fakes.FakeImage.create_one_image() - # This is the return value for utils.find_resource() - self.images_mock.get.return_value = self._image - - self.project_mock.get.return_value = self.project - self.domain_mock.get.return_value = self.domain - self.image_members_mock.delete.return_value = None - # Get the command object to test - self.cmd = image.RemoveProjectImage(self.app, None) - - def test_remove_project_image_no_options(self): - arglist = [ - self._image.id, - self.project.id, - ] - verifylist = [ - ('image', self._image.id), - ('project', self.project.id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.image_members_mock.delete.assert_called_with( - self._image.id, - self.project.id, - ) - self.assertIsNone(result) - - def test_remove_project_image_with_options(self): - arglist = [ - self._image.id, - self.project.id, - '--project-domain', self.domain.id, - ] - verifylist = [ - ('image', self._image.id), - ('project', self.project.id), - ('project_domain', self.domain.id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.image_members_mock.delete.assert_called_with( - self._image.id, - self.project.id, - ) - self.assertIsNone(result) - - -class TestImageSet(TestImage): - - project = identity_fakes.FakeProject.create_one_project() - domain = identity_fakes.FakeDomain.create_one_domain() - - def setUp(self): - super(TestImageSet, self).setUp() - # Set up the schema - self.model = warlock.model_factory( - image_fakes.IMAGE_schema, - schemas.SchemaBasedModel, - ) - - self.project_mock.get.return_value = self.project - - self.domain_mock.get.return_value = self.domain - - self.images_mock.get.return_value = self.model(**image_fakes.IMAGE) - self.images_mock.update.return_value = self.model(**image_fakes.IMAGE) - # Get the command object to test - self.cmd = image.SetImage(self.app, None) - - def test_image_set_no_options(self): - arglist = [ - image_fakes.image_id, - ] - verifylist = [ - ('image', image_fakes.image_id) - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.assertIsNone(result) - - def test_image_set_options(self): - arglist = [ - '--name', 'new-name', - '--min-disk', '2', - '--min-ram', '4', - '--container-format', 'ovf', - '--disk-format', 'vmdk', - '--project', self.project.name, - '--project-domain', self.domain.id, - image_fakes.image_id, - ] - verifylist = [ - ('name', 'new-name'), - ('min_disk', 2), - ('min_ram', 4), - ('container_format', 'ovf'), - ('disk_format', 'vmdk'), - ('project', self.project.name), - ('project_domain', self.domain.id), - ('image', image_fakes.image_id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'name': 'new-name', - 'owner': self.project.id, - 'min_disk': 2, - 'min_ram': 4, - 'container_format': 'ovf', - 'disk_format': 'vmdk', - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, **kwargs) - self.assertIsNone(result) - - def test_image_set_with_unexist_owner(self): - self.project_mock.get.side_effect = exceptions.NotFound(None) - self.project_mock.find.side_effect = exceptions.NotFound(None) - - arglist = [ - '--owner', 'unexist_owner', - image_fakes.image_id, - ] - verifylist = [ - ('owner', 'unexist_owner'), - ('image', image_fakes.image_id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - self.assertRaises( - exceptions.CommandError, - self.cmd.take_action, parsed_args) - - def test_image_set_with_unexist_project(self): - self.project_mock.get.side_effect = exceptions.NotFound(None) - self.project_mock.find.side_effect = exceptions.NotFound(None) - - arglist = [ - '--project', 'unexist_owner', - image_fakes.image_id, - ] - verifylist = [ - ('project', 'unexist_owner'), - ('image', image_fakes.image_id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - self.assertRaises( - exceptions.CommandError, - self.cmd.take_action, parsed_args) - - def test_image_set_bools1(self): - arglist = [ - '--protected', - '--private', - image_fakes.image_name, - ] - verifylist = [ - ('protected', True), - ('unprotected', False), - ('public', False), - ('private', True), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'protected': True, - 'visibility': 'private', - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_bools2(self): - arglist = [ - '--unprotected', - '--public', - image_fakes.image_name, - ] - verifylist = [ - ('protected', False), - ('unprotected', True), - ('public', True), - ('private', False), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'protected': False, - 'visibility': 'public', - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_properties(self): - arglist = [ - '--property', 'Alpha=1', - '--property', 'Beta=2', - image_fakes.image_name, - ] - verifylist = [ - ('properties', {'Alpha': '1', 'Beta': '2'}), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'Alpha': '1', - 'Beta': '2', - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_fake_properties(self): - arglist = [ - '--architecture', 'z80', - '--instance-id', '12345', - '--kernel-id', '67890', - '--os-distro', 'cpm', - '--os-version', '2.2H', - '--ramdisk-id', 'xyzpdq', - image_fakes.image_name, - ] - verifylist = [ - ('architecture', 'z80'), - ('instance_id', '12345'), - ('kernel_id', '67890'), - ('os_distro', 'cpm'), - ('os_version', '2.2H'), - ('ramdisk_id', 'xyzpdq'), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'architecture': 'z80', - 'instance_id': '12345', - 'kernel_id': '67890', - 'os_distro': 'cpm', - 'os_version': '2.2H', - 'ramdisk_id': 'xyzpdq', - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_tag(self): - arglist = [ - '--tag', 'test-tag', - image_fakes.image_name, - ] - verifylist = [ - ('tags', ['test-tag']), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'tags': ['test-tag'], - } - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_activate(self): - arglist = [ - '--tag', 'test-tag', - '--activate', - image_fakes.image_name, - ] - verifylist = [ - ('tags', ['test-tag']), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'tags': ['test-tag'], - } - - self.images_mock.reactivate.assert_called_with( - image_fakes.image_id, - ) - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_deactivate(self): - arglist = [ - '--tag', 'test-tag', - '--deactivate', - image_fakes.image_name, - ] - verifylist = [ - ('tags', ['test-tag']), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'tags': ['test-tag'], - } - - self.images_mock.deactivate.assert_called_with( - image_fakes.image_id, - ) - # ImageManager.update(image, **kwargs) - self.images_mock.update.assert_called_with( - image_fakes.image_id, - **kwargs - ) - self.assertIsNone(result) - - def test_image_set_tag_merge(self): - old_image = copy.copy(image_fakes.IMAGE) - old_image['tags'] = ['old1', 'new2'] - self.images_mock.get.return_value = self.model(**old_image) - arglist = [ - '--tag', 'test-tag', - image_fakes.image_name, - ] - verifylist = [ - ('tags', ['test-tag']), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'tags': ['old1', 'new2', 'test-tag'], - } - # ImageManager.update(image, **kwargs) - a, k = self.images_mock.update.call_args - self.assertEqual(image_fakes.image_id, a[0]) - self.assertIn('tags', k) - self.assertEqual(set(kwargs['tags']), set(k['tags'])) - self.assertIsNone(result) - - def test_image_set_tag_merge_dupe(self): - old_image = copy.copy(image_fakes.IMAGE) - old_image['tags'] = ['old1', 'new2'] - self.images_mock.get.return_value = self.model(**old_image) - arglist = [ - '--tag', 'old1', - image_fakes.image_name, - ] - verifylist = [ - ('tags', ['old1']), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - kwargs = { - 'tags': ['new2', 'old1'], - } - # ImageManager.update(image, **kwargs) - a, k = self.images_mock.update.call_args - self.assertEqual(image_fakes.image_id, a[0]) - self.assertIn('tags', k) - self.assertEqual(set(kwargs['tags']), set(k['tags'])) - self.assertIsNone(result) - - def test_image_set_dead_options(self): - - arglist = [ - '--visibility', '1-mile', - image_fakes.image_name, - ] - verifylist = [ - ('visibility', '1-mile'), - ('image', image_fakes.image_name), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - self.assertRaises( - exceptions.CommandError, - self.cmd.take_action, parsed_args) - - -class TestImageShow(TestImage): - - def setUp(self): - super(TestImageShow, self).setUp() - - # Set up the schema - self.model = warlock.model_factory( - image_fakes.IMAGE_schema, - schemas.SchemaBasedModel, - ) - - self.images_mock.get.return_value = self.model(**image_fakes.IMAGE) - - # Get the command object to test - self.cmd = image.ShowImage(self.app, None) - - def test_image_show(self): - arglist = [ - image_fakes.image_id, - ] - verifylist = [ - ('image', image_fakes.image_id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. - columns, data = self.cmd.take_action(parsed_args) - self.images_mock.get.assert_called_with( - image_fakes.image_id, - ) - - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_SHOW_data, data) - - -class TestImageUnset(TestImage): - - attrs = {} - attrs['tags'] = ['test'] - attrs['prop'] = 'test' - image = image_fakes.FakeImage.create_one_image(attrs) - - def setUp(self): - super(TestImageUnset, self).setUp() - - # Set up the schema - self.model = warlock.model_factory( - image_fakes.IMAGE_schema, - schemas.SchemaBasedModel, - ) - - self.images_mock.get.return_value = self.image - self.image_tags_mock.delete.return_value = self.image - - # Get the command object to test - self.cmd = image.UnsetImage(self.app, None) - - def test_image_unset_no_options(self): - arglist = [ - image_fakes.image_id, - ] - verifylist = [ - ('image', image_fakes.image_id) - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.assertIsNone(result) - - def test_image_unset_tag_option(self): - - arglist = [ - '--tag', 'test', - self.image.id, - ] - - verifylist = [ - ('tags', ['test']), - ('image', self.image.id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - result = self.cmd.take_action(parsed_args) - - self.image_tags_mock.delete.assert_called_with( - self.image.id, 'test' - ) - self.assertIsNone(result) - - def test_image_unset_property_option(self): - - arglist = [ - '--property', 'prop', - self.image.id, - ] - - verifylist = [ - ('properties', ['prop']), - ('image', self.image.id) - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - result = self.cmd.take_action(parsed_args) - - kwargs = {} - self.images_mock.update.assert_called_with( - self.image.id, - parsed_args.properties, - **kwargs) - - self.assertIsNone(result) - - def test_image_unset_mixed_option(self): - - arglist = [ - '--tag', 'test', - '--property', 'prop', - self.image.id, - ] - - verifylist = [ - ('tags', ['test']), - ('properties', ['prop']), - ('image', self.image.id) - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - result = self.cmd.take_action(parsed_args) - - kwargs = {} - self.images_mock.update.assert_called_with( - self.image.id, - parsed_args.properties, - **kwargs) - - self.image_tags_mock.delete.assert_called_with( - self.image.id, 'test' - ) - self.assertIsNone(result) |
