Fix quota set command error for SDK > 0.9.10

A bug in OpenStack SDK 0.9.11 and 0.9.12 that causes
quota set command to fail. This can be removed when
the proposed SDK fix (https://review.openstack.org/#/c/419911/)
is released and in the minimum SDK version in global requirements.

Closes-Bug: #1655445
Change-Id: I63132f5f762f0120282f8b92e72512763063e3c6
This commit is contained in:
Huanxuan Ao 2017-01-15 14:37:49 +08:00
parent b860ba0e42
commit 0340275fa9
4 changed files with 77 additions and 35 deletions

View File

@ -182,9 +182,36 @@ class SetQuota(command.Command):
project, project,
**volume_kwargs) **volume_kwargs)
if network_kwargs: if network_kwargs:
network_client.update_quota( if hasattr(_quota.Quota, 'allow_get'):
project, # TODO(huanxuan): Remove this block once the fixed
**network_kwargs) # SDK Quota class is the minimum required version.
# This is expected to be SDK release 0.9.13
res = network_client._get_resource(
_quota.Quota, project, **network_kwargs)
if any([res._body.dirty, res._header.dirty]):
request = res._prepare_request(prepend_key=True)
# remove the id in the body
if 'id' in request.body[res.resource_key]:
del request.body[res.resource_key]['id']
if res.patch_update:
response = network_client.session.patch(
request.uri,
endpoint_filter=res.service,
json=request.body,
headers=request.headers
)
else:
response = network_client.session.put(
request.uri,
endpoint_filter=res.service,
json=request.body,
headers=request.headers
)
res._translate_response(response, has_body=True)
else:
network_client.update_quota(
project,
**network_kwargs)
class ShowQuota(command.ShowOne): class ShowQuota(command.ShowOne):

View File

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import testtools
from openstackclient.tests.functional import base from openstackclient.tests.functional import base
@ -27,7 +25,6 @@ class QuotaTests(base.TestCase):
cls.PROJECT_NAME =\ cls.PROJECT_NAME =\
cls.get_openstack_configuration_value('auth.project_name') cls.get_openstack_configuration_value('auth.project_name')
@testtools.skip('broken SDK testing')
def test_quota_set(self): def test_quota_set(self):
self.openstack('quota set --instances 11 --volumes 11 --networks 11 ' + self.openstack('quota set --instances 11 --volumes 11 --networks 11 ' +
self.PROJECT_NAME) self.PROJECT_NAME)

View File

@ -13,6 +13,8 @@
import copy import copy
import mock import mock
from openstack.network.v2 import quota as _quota
from openstackclient.common import quota from openstackclient.common import quota
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
from openstackclient.tests.unit import fakes from openstackclient.tests.unit import fakes
@ -282,27 +284,32 @@ class TestQuotaSet(TestQuota):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) # TODO(huanxuan): Remove this if condition once the fixed
kwargs = { # SDK Quota class is the minimum required version.
'subnet': network_fakes.QUOTA['subnet'], # This is expected to be SDK release 0.9.13
'network': network_fakes.QUOTA['network'], if not hasattr(_quota.Quota, 'allow_get'):
'floatingip': network_fakes.QUOTA['floatingip'], # Just run this when sdk <= 0.9.10
'subnetpool': network_fakes.QUOTA['subnetpool'], result = self.cmd.take_action(parsed_args)
'security_group_rule': kwargs = {
network_fakes.QUOTA['security_group_rule'], 'subnet': network_fakes.QUOTA['subnet'],
'security_group': network_fakes.QUOTA['security_group'], 'network': network_fakes.QUOTA['network'],
'router': network_fakes.QUOTA['router'], 'floatingip': network_fakes.QUOTA['floatingip'],
'rbac_policy': network_fakes.QUOTA['rbac_policy'], 'subnetpool': network_fakes.QUOTA['subnetpool'],
'port': network_fakes.QUOTA['port'], 'security_group_rule':
'vip': network_fakes.QUOTA['vip'], network_fakes.QUOTA['security_group_rule'],
'healthmonitor': network_fakes.QUOTA['healthmonitor'], 'security_group': network_fakes.QUOTA['security_group'],
'l7policy': network_fakes.QUOTA['l7policy'], 'router': network_fakes.QUOTA['router'],
} 'rbac_policy': network_fakes.QUOTA['rbac_policy'],
self.network_mock.update_quota.assert_called_once_with( 'port': network_fakes.QUOTA['port'],
identity_fakes.project_id, 'vip': network_fakes.QUOTA['vip'],
**kwargs 'healthmonitor': network_fakes.QUOTA['healthmonitor'],
) 'l7policy': network_fakes.QUOTA['l7policy'],
self.assertIsNone(result) }
self.network_mock.update_quota.assert_called_once_with(
identity_fakes.project_id,
**kwargs
)
self.assertIsNone(result)
def test_quota_set_with_class(self): def test_quota_set_with_class(self):
arglist = [ arglist = [
@ -476,15 +483,20 @@ class TestQuotaShow(TestQuota):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args) # TODO(huanxuan): Remove this if condition once the fixed
# SDK QuotaDefault class is the minimum required version.
# This is expected to be SDK release 0.9.13
if not hasattr(_quota.QuotaDefault, 'project'):
# Just run this when sdk <= 0.9.10
self.cmd.take_action(parsed_args)
self.quotas_mock.defaults.assert_called_once_with( self.quotas_mock.defaults.assert_called_once_with(
identity_fakes.project_id) identity_fakes.project_id)
self.volume_quotas_mock.defaults.assert_called_once_with( self.volume_quotas_mock.defaults.assert_called_once_with(
identity_fakes.project_id) identity_fakes.project_id)
self.network.get_quota_default.assert_called_once_with( self.network.get_quota_default.assert_called_once_with(
identity_fakes.project_id) identity_fakes.project_id)
self.assertNotCalled(self.network.get_quota) self.assertNotCalled(self.network.get_quota)
def test_quota_show_with_class(self): def test_quota_show_with_class(self):
arglist = [ arglist = [

View File

@ -0,0 +1,6 @@
---
fixes:
- |
Work around a bug in OpenStackSDK 0.9.11 and 0.9.12 that causes
``quota set --network`` to fail.
[Bug `1655445 <https://bugs.launchpad.net/python-openstackclient/+bug/1655445>`_]