Merge "Fix server_group_members quota check"

This commit is contained in:
Zuul 2018-07-11 21:33:06 +00:00 committed by Gerrit Code Review
commit 39b05ee9e3
2 changed files with 33 additions and 31 deletions

View File

@ -1283,7 +1283,20 @@ def _server_group_count_members_by_user(context, group, user_id):
for greenthread in greenthreads: for greenthread in greenthreads:
found = greenthread.wait() found = greenthread.wait()
instances = instances + found instances = instances + found
return {'user': {'server_group_members': len(instances)}} # Count build requests using the same filters to catch group members
# that are not yet creatd in a cell.
# NOTE(mriedem): BuildRequestList.get_by_filters is not very efficient for
# what we need and we can optimize this with a new query method.
build_requests = objects.BuildRequestList.get_by_filters(context, filters)
# Ignore any duplicates since build requests and instances can co-exist
# for a short window of time after the instance is created in a cell but
# before the build request is deleted.
instance_uuids = [inst.uuid for inst in instances]
count = len(instances)
for build_request in build_requests:
if build_request.instance_uuid not in instance_uuids:
count += 1
return {'user': {'server_group_members': count}}
def _fixed_ip_count(context, project_id): def _fixed_ip_count(context, project_id):

View File

@ -15,7 +15,6 @@ from nova.tests import fixtures as nova_fixtures
from nova.tests.functional import integrated_helpers from nova.tests.functional import integrated_helpers
from nova.tests.unit.image import fake as fake_image from nova.tests.unit.image import fake as fake_image
from nova.tests.unit import policy_fixture from nova.tests.unit import policy_fixture
from nova.virt import fake as fake_virt
class TestMultiCreateServerGroupMemberOverQuota( class TestMultiCreateServerGroupMemberOverQuota(
@ -59,14 +58,6 @@ class TestMultiCreateServerGroupMemberOverQuota(
server group and then create 3 servers in the group using a server group and then create 3 servers in the group using a
multi-create POST /servers request. multi-create POST /servers request.
""" """
# TODO(mriedem): We don't need a compute service when the bug is fixed
# because we won't be able to get past nova-api validation.
self.start_service('conductor')
self.start_service('scheduler')
fake_virt.set_nodes(['host1'])
self.addCleanup(fake_virt.restore_nodes)
self.start_service('compute', host='host1')
server_req = self._build_minimal_create_server_request( server_req = self._build_minimal_create_server_request(
self.api, 'test_multi_create_server_group_members_over_quota', self.api, 'test_multi_create_server_group_members_over_quota',
image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID,
@ -74,20 +65,15 @@ class TestMultiCreateServerGroupMemberOverQuota(
server_req['min_count'] = 3 server_req['min_count'] = 3
server_req['return_reservation_id'] = True server_req['return_reservation_id'] = True
hints = {'group': self.created_group['id']} hints = {'group': self.created_group['id']}
# FIXME(mriedem): When bug 1780373 is fixed this should result in a # We should get a 403 response due to going over quota on server
# 403 error response and 0 members in the group. # group members in a single request.
reservation_id = self.api.post_server( self.api.api_post(
{'server': server_req, '/servers', {'server': server_req, 'os:scheduler_hints': hints},
'os:scheduler_hints': hints})['reservation_id'] check_response_status=[403])
# Assert that three servers were created regardless of the
# [quota]/server_group_members=2 quota limit.
servers = self.api.get_servers(
detail=False, search_opts={'reservation_id': reservation_id})
self.assertEqual(3, len(servers))
group = self.api.api_get( group = self.api.api_get(
'/os-server-groups/%s' % '/os-server-groups/%s' %
self.created_group['id']).body['server_group'] self.created_group['id']).body['server_group']
self.assertEqual(3, len(group['members'])) self.assertEqual(0, len(group['members']))
def test_concurrent_request_server_group_members_over_quota(self): def test_concurrent_request_server_group_members_over_quota(self):
"""Recreate scenario for the bug where we create 3 servers in the """Recreate scenario for the bug where we create 3 servers in the
@ -105,17 +91,20 @@ class TestMultiCreateServerGroupMemberOverQuota(
image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID,
networks='none') networks='none')
hints = {'group': self.created_group['id']} hints = {'group': self.created_group['id']}
# FIXME(mriedem): When bug 1780373 is fixed this should result in a # This should result in a 403 response on the 3rd server.
# 403 error response on the 3rd create server request. if x == 2:
self.api.post_server( self.api.api_post(
{'server': server_req, 'os:scheduler_hints': hints}) '/servers',
# Assert that three servers were created regardless of the {'server': server_req, 'os:scheduler_hints': hints},
# [quota]/server_group_members=2 quota limit. check_response_status=[403])
else:
self.api.post_server(
{'server': server_req, 'os:scheduler_hints': hints})
# There should only be two servers created which are both members of
# the same group.
servers = self.api.get_servers(detail=False) servers = self.api.get_servers(detail=False)
# FIXME(mriedem): When the bug is fixed, there should only be 2 servers self.assertEqual(2, len(servers))
# created and 2 members in the group.
self.assertEqual(3, len(servers))
group = self.api.api_get( group = self.api.api_get(
'/os-server-groups/%s' % '/os-server-groups/%s' %
self.created_group['id']).body['server_group'] self.created_group['id']).body['server_group']
self.assertEqual(3, len(group['members'])) self.assertEqual(2, len(group['members']))