Merge "Fix useless api_version of Manager class"
This commit is contained in:
		@@ -26,7 +26,6 @@ import os
 | 
			
		||||
import six
 | 
			
		||||
from six.moves.urllib import parse
 | 
			
		||||
 | 
			
		||||
from cinderclient import api_versions
 | 
			
		||||
from cinderclient import exceptions
 | 
			
		||||
from cinderclient.openstack.common.apiclient import base as common_base
 | 
			
		||||
from cinderclient import utils
 | 
			
		||||
@@ -63,12 +62,11 @@ class Manager(common_base.HookableMixin):
 | 
			
		||||
    resource_class = None
 | 
			
		||||
 | 
			
		||||
    def __init__(self, api):
 | 
			
		||||
        self._api_version = api_versions.APIVersion()
 | 
			
		||||
        self.api = api
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def api_version(self):
 | 
			
		||||
        return self._api_version
 | 
			
		||||
        return self.api.api_version
 | 
			
		||||
 | 
			
		||||
    def _list(self, url, response_key, obj_class=None, body=None,
 | 
			
		||||
              limit=None, items=None):
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,9 @@ import mock
 | 
			
		||||
 | 
			
		||||
from cinderclient import api_versions
 | 
			
		||||
from cinderclient import exceptions
 | 
			
		||||
from cinderclient.v3 import client
 | 
			
		||||
from cinderclient.tests.unit import utils
 | 
			
		||||
from cinderclient.tests.unit import test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ddt.ddt
 | 
			
		||||
@@ -93,6 +95,37 @@ class APIVersionTestCase(utils.TestCase):
 | 
			
		||||
                          api_versions.APIVersion().get_string)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ManagerTest(utils.TestCase):
 | 
			
		||||
    def test_api_version(self):
 | 
			
		||||
        # The function manager.return_api_version has two versions,
 | 
			
		||||
        # when called with api version 3.1 it should return the
 | 
			
		||||
        # string '3.1' and when called with api version 3.2 or higher
 | 
			
		||||
        # it should return the string '3.2'.
 | 
			
		||||
        version = api_versions.APIVersion('3.1')
 | 
			
		||||
        api = client.Client(api_version=version)
 | 
			
		||||
        manager = test_utils.FakeManagerWithApi(api)
 | 
			
		||||
        self.assertEqual('3.1', manager.return_api_version())
 | 
			
		||||
 | 
			
		||||
        version = api_versions.APIVersion('3.2')
 | 
			
		||||
        api = client.Client(api_version=version)
 | 
			
		||||
        manager = test_utils.FakeManagerWithApi(api)
 | 
			
		||||
        self.assertEqual('3.2', manager.return_api_version())
 | 
			
		||||
 | 
			
		||||
        # pick up the highest version
 | 
			
		||||
        version = api_versions.APIVersion('3.3')
 | 
			
		||||
        api = client.Client(api_version=version)
 | 
			
		||||
        manager = test_utils.FakeManagerWithApi(api)
 | 
			
		||||
        self.assertEqual('3.2', manager.return_api_version())
 | 
			
		||||
 | 
			
		||||
        version = api_versions.APIVersion('3.0')
 | 
			
		||||
        api = client.Client(api_version=version)
 | 
			
		||||
        manager = test_utils.FakeManagerWithApi(api)
 | 
			
		||||
        # An exception will be returned here because the function
 | 
			
		||||
        # return_api_version doesn't support version 3.0
 | 
			
		||||
        self.assertRaises(exceptions.VersionNotFoundForAPIMethod,
 | 
			
		||||
                          manager.return_api_version)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UpdateHeadersTestCase(utils.TestCase):
 | 
			
		||||
    def test_api_version_is_null(self):
 | 
			
		||||
        headers = {}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ import sys
 | 
			
		||||
import mock
 | 
			
		||||
from six import moves
 | 
			
		||||
 | 
			
		||||
from cinderclient import api_versions
 | 
			
		||||
from cinderclient import exceptions
 | 
			
		||||
from cinderclient import utils
 | 
			
		||||
from cinderclient import base
 | 
			
		||||
@@ -61,6 +62,17 @@ class FakeManager(base.ManagerWithFind):
 | 
			
		||||
        return common_base.ListWithMeta(self.resources, fakes.REQUEST_ID)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FakeManagerWithApi(base.Manager):
 | 
			
		||||
 | 
			
		||||
    @api_versions.wraps('3.1')
 | 
			
		||||
    def return_api_version(self):
 | 
			
		||||
        return '3.1'
 | 
			
		||||
 | 
			
		||||
    @api_versions.wraps('3.2')
 | 
			
		||||
    def return_api_version(self):
 | 
			
		||||
        return '3.2'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FakeDisplayResource(object):
 | 
			
		||||
    NAME_ATTR = 'display_name'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -71,13 +71,24 @@ class ShellTest(utils.TestCase):
 | 
			
		||||
        self.assert_called('GET', '/os-availability-zone')
 | 
			
		||||
 | 
			
		||||
    def test_upload_to_image(self):
 | 
			
		||||
        expected = {'os-volume_upload_image': {'force': False,
 | 
			
		||||
                                               'container_format': 'bare',
 | 
			
		||||
                                               'disk_format': 'raw',
 | 
			
		||||
                                               'image_name': 'test-image'}}
 | 
			
		||||
        self.run_command('upload-to-image 1234 test-image')
 | 
			
		||||
        self.assert_called_anytime('GET', '/volumes/1234')
 | 
			
		||||
        self.assert_called_anytime('POST', '/volumes/1234/action',
 | 
			
		||||
                                   body=expected)
 | 
			
		||||
 | 
			
		||||
    def test_upload_to_image_private_not_protected(self):
 | 
			
		||||
        expected = {'os-volume_upload_image': {'force': False,
 | 
			
		||||
                                               'container_format': 'bare',
 | 
			
		||||
                                               'disk_format': 'raw',
 | 
			
		||||
                                               'image_name': 'test-image',
 | 
			
		||||
                                               'protected': False,
 | 
			
		||||
                                               'visibility': 'private'}}
 | 
			
		||||
        self.run_command('upload-to-image 1234 test-image')
 | 
			
		||||
        self.run_command('--os-volume-api-version 3.1 '
 | 
			
		||||
                         'upload-to-image 1234 test-image')
 | 
			
		||||
        self.assert_called_anytime('GET', '/volumes/1234')
 | 
			
		||||
        self.assert_called_anytime('POST', '/volumes/1234/action',
 | 
			
		||||
                                   body=expected)
 | 
			
		||||
@@ -89,7 +100,8 @@ class ShellTest(utils.TestCase):
 | 
			
		||||
                                               'image_name': 'test-image',
 | 
			
		||||
                                               'protected': 'True',
 | 
			
		||||
                                               'visibility': 'public'}}
 | 
			
		||||
        self.run_command('upload-to-image --visibility=public '
 | 
			
		||||
        self.run_command('--os-volume-api-version 3.1 '
 | 
			
		||||
                         'upload-to-image --visibility=public '
 | 
			
		||||
                         '--protected=True 1234 test-image')
 | 
			
		||||
        self.assert_called_anytime('GET', '/volumes/1234')
 | 
			
		||||
        self.assert_called_anytime('POST', '/volumes/1234/action',
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								cinderclient/tests/unit/v3/test_volumes.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								cinderclient/tests/unit/v3/test_volumes.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
# Copyright 2016 FUJITSU LIMITED
 | 
			
		||||
#
 | 
			
		||||
# All Rights Reserved.
 | 
			
		||||
#
 | 
			
		||||
#    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.
 | 
			
		||||
 | 
			
		||||
from cinderclient import api_versions
 | 
			
		||||
from cinderclient.tests.unit import utils
 | 
			
		||||
from cinderclient.tests.unit.v3 import fakes
 | 
			
		||||
from cinderclient.v3.volumes import Volume
 | 
			
		||||
from cinderclient.v3.volumes import VolumeManager
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VolumesTest(utils.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_volume_manager_upload_to_image(self):
 | 
			
		||||
        expected = {'os-volume_upload_image':
 | 
			
		||||
                    {'force': False,
 | 
			
		||||
                     'container_format': 'bare',
 | 
			
		||||
                     'disk_format': 'raw',
 | 
			
		||||
                     'image_name': 'name',
 | 
			
		||||
                     'visibility': 'public',
 | 
			
		||||
                     'protected': True}}
 | 
			
		||||
        api_version = api_versions.APIVersion('3.1')
 | 
			
		||||
        cs = fakes.FakeClient(api_version)
 | 
			
		||||
        manager = VolumeManager(cs)
 | 
			
		||||
        fake_volume = Volume(manager, {'id': 1234,
 | 
			
		||||
                                       'name': 'sample-volume'},
 | 
			
		||||
                             loaded=True)
 | 
			
		||||
        fake_volume.upload_to_image(False, 'name', 'bare', 'raw',
 | 
			
		||||
                                    visibility='public', protected=True)
 | 
			
		||||
        cs.assert_called_anytime('POST', '/volumes/1234/action', body=expected)
 | 
			
		||||
@@ -1424,22 +1424,31 @@ def _find_group_type(cs, gtype):
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.arg('--visibility',
 | 
			
		||||
           metavar='<public|private>',
 | 
			
		||||
           help='Makes image publicly accessible. Default=private.',
 | 
			
		||||
           default='private')
 | 
			
		||||
           help='Set image visibility to either public or private. '
 | 
			
		||||
                'Default=private.',
 | 
			
		||||
           default='private',
 | 
			
		||||
           start_version='3.1')
 | 
			
		||||
@utils.arg('--protected',
 | 
			
		||||
           metavar='<True|False>',
 | 
			
		||||
           help='Prevents image from being deleted. Default=False.',
 | 
			
		||||
           default=False)
 | 
			
		||||
           default=False,
 | 
			
		||||
           start_version='3.1')
 | 
			
		||||
@utils.service_type('volumev3')
 | 
			
		||||
def do_upload_to_image(cs, args):
 | 
			
		||||
    """Uploads volume to Image Service as an image."""
 | 
			
		||||
    volume = utils.find_volume(cs, args.volume)
 | 
			
		||||
    _print_volume_image(volume.upload_to_image(args.force,
 | 
			
		||||
                                               args.image_name,
 | 
			
		||||
                                               args.container_format,
 | 
			
		||||
                                               args.disk_format,
 | 
			
		||||
                                               args.visibility,
 | 
			
		||||
                                               args.protected))
 | 
			
		||||
    if cs.api_version >= api_versions.APIVersion("3.1"):
 | 
			
		||||
        _print_volume_image(volume.upload_to_image(args.force,
 | 
			
		||||
                                                   args.image_name,
 | 
			
		||||
                                                   args.container_format,
 | 
			
		||||
                                                   args.disk_format,
 | 
			
		||||
                                                   args.visibility,
 | 
			
		||||
                                                   args.protected))
 | 
			
		||||
    else:
 | 
			
		||||
        _print_volume_image(volume.upload_to_image(args.force,
 | 
			
		||||
                                                   args.image_name,
 | 
			
		||||
                                                   args.container_format,
 | 
			
		||||
                                                   args.disk_format))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.arg('volume', metavar='<volume>', help='ID of volume to migrate.')
 | 
			
		||||
 
 | 
			
		||||
@@ -111,11 +111,28 @@ class Volume(base.Resource):
 | 
			
		||||
        return self.manager.show_image_metadata(self)
 | 
			
		||||
 | 
			
		||||
    def upload_to_image(self, force, image_name, container_format,
 | 
			
		||||
                        disk_format, visibility, protected):
 | 
			
		||||
        """Upload a volume to image service as an image."""
 | 
			
		||||
        return self.manager.upload_to_image(self, force, image_name,
 | 
			
		||||
                                            container_format, disk_format,
 | 
			
		||||
                                            visibility, protected)
 | 
			
		||||
                        disk_format, visibility=None,
 | 
			
		||||
                        protected=None):
 | 
			
		||||
        """Upload a volume to image service as an image.
 | 
			
		||||
        :param force: Boolean to enables or disables upload of a volume that
 | 
			
		||||
                      is attached to an instance.
 | 
			
		||||
        :param image_name: The new image name.
 | 
			
		||||
        :param container_format: Container format type.
 | 
			
		||||
        :param disk_format: Disk format type.
 | 
			
		||||
        :param visibility: The accessibility of image (allowed for
 | 
			
		||||
                           3.1-latest).
 | 
			
		||||
        :param protected: Boolean to decide whether prevents image from being
 | 
			
		||||
                          deleted (allowed for 3.1-latest).
 | 
			
		||||
        """
 | 
			
		||||
        if self.manager.api_version >= api_versions.APIVersion("3.1"):
 | 
			
		||||
            visibility = 'private' if visibility is None else visibility
 | 
			
		||||
            protected = False if protected is None else protected
 | 
			
		||||
            return self.manager.upload_to_image(self, force, image_name,
 | 
			
		||||
                                                container_format, disk_format,
 | 
			
		||||
                                                visibility, protected)
 | 
			
		||||
        else:
 | 
			
		||||
            return self.manager.upload_to_image(self, force, image_name,
 | 
			
		||||
                                                container_format, disk_format)
 | 
			
		||||
 | 
			
		||||
    def force_delete(self):
 | 
			
		||||
        """Delete the specified volume ignoring its current state.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user