Merge "Fix server_group_members quota check"
This commit is contained in:
commit
39b05ee9e3
@ -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):
|
||||||
|
@ -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']))
|
||||||
|
Loading…
Reference in New Issue
Block a user