Merge "cloud: create_server: fix scheduler_hints/group"

This commit is contained in:
Zuul 2023-03-24 11:18:46 +00:00 committed by Gerrit Code Review
commit d423e6c5f5
2 changed files with 176 additions and 6 deletions

View File

@ -823,8 +823,6 @@ class ComputeCloudMixin:
raise TypeError(
"create_server() requires either 'image' or 'boot_volume'")
server_json = {'server': kwargs}
# TODO(mordred) Add support for description starting in 2.19
security_groups = kwargs.get('security_groups', [])
if security_groups and not isinstance(kwargs['security_groups'], list):
@ -847,16 +845,16 @@ class ComputeCloudMixin:
if value:
kwargs[desired] = value
hints = kwargs.pop('scheduler_hints', {})
if group:
group_obj = self.get_server_group(group)
if not group_obj:
raise exc.OpenStackCloudException(
"Server Group {group} was requested but was not found"
" on the cloud".format(group=group))
hints['group'] = group_obj['id']
if hints:
server_json['os:scheduler_hints'] = hints
if 'scheduler_hints' not in kwargs:
kwargs['scheduler_hints'] = {}
kwargs['scheduler_hints']['group'] = group_obj['id']
kwargs.setdefault('max_count', kwargs.get('max_count', 1))
kwargs.setdefault('min_count', kwargs.get('min_count', 1))

View File

@ -1017,3 +1017,175 @@ class TestCreateServer(base.TestCase):
wait=False)
self.assert_calls()
def test_create_server_scheduler_hints(self):
"""
Test that setting scheduler_hints will include them in POST request
"""
scheduler_hints = {
'group': self.getUniqueString('group'),
}
fake_server = fakes.make_fake_server('1234', '', 'BUILD')
fake_server['scheduler_hints'] = scheduler_hints
self.register_uris([
dict(method='GET',
uri=self.get_mock_url(
'network', 'public', append=['v2.0', 'networks']),
json={'networks': []}),
self.get_nova_discovery_mock_dict(),
dict(method='POST',
uri=self.get_mock_url(
'compute', 'public', append=['servers']),
json={'server': fake_server},
validate=dict(
json={
'server': {
u'flavorRef': u'flavor-id',
u'imageRef': u'image-id',
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name',
'networks': 'auto'},
u'OS-SCH-HNT:scheduler_hints': scheduler_hints, })),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
json={'server': fake_server}),
])
self.cloud.create_server(
name='server-name', image=dict(id='image-id'),
flavor=dict(id='flavor-id'),
scheduler_hints=scheduler_hints, wait=False)
self.assert_calls()
def test_create_server_scheduler_hints_group_merge(self):
"""
Test that setting both scheduler_hints and group results in merged
hints in POST request
"""
group_id = uuid.uuid4().hex
group_name = self.getUniqueString('server-group')
policies = ['affinity']
fake_group = fakes.make_fake_server_group(
group_id, group_name, policies)
# The scheduler hints we pass in
scheduler_hints = {
'different_host': [],
}
# The scheduler hints we expect to be in POST request
scheduler_hints_merged = {
'different_host': [],
'group': group_id,
}
fake_server = fakes.make_fake_server('1234', '', 'BUILD')
fake_server['scheduler_hints'] = scheduler_hints_merged
self.register_uris([
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['os-server-groups']),
json={'server_groups': [fake_group]}),
dict(method='GET',
uri=self.get_mock_url(
'network', 'public', append=['v2.0', 'networks']),
json={'networks': []}),
dict(method='POST',
uri=self.get_mock_url(
'compute', 'public', append=['servers']),
json={'server': fake_server},
validate=dict(
json={
'server': {
u'flavorRef': u'flavor-id',
u'imageRef': u'image-id',
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name',
'networks': 'auto'},
u'OS-SCH-HNT:scheduler_hints': scheduler_hints_merged,
})),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
json={'server': fake_server}),
])
self.cloud.create_server(
name='server-name', image=dict(id='image-id'),
flavor=dict(id='flavor-id'),
scheduler_hints=dict(scheduler_hints), group=group_name,
wait=False)
self.assert_calls()
def test_create_server_scheduler_hints_group_override(self):
"""
Test that setting group in both scheduler_hints and group param prefers
param
"""
group_id_scheduler_hints = uuid.uuid4().hex
group_id_param = uuid.uuid4().hex
group_name = self.getUniqueString('server-group')
policies = ['affinity']
fake_group = fakes.make_fake_server_group(
group_id_param, group_name, policies)
# The scheduler hints we pass in that are expected to be ignored in
# POST call
scheduler_hints = {
'group': group_id_scheduler_hints,
}
# The scheduler hints we expect to be in POST request
group_scheduler_hints = {
'group': group_id_param,
}
fake_server = fakes.make_fake_server('1234', '', 'BUILD')
fake_server['scheduler_hints'] = group_scheduler_hints
self.register_uris([
self.get_nova_discovery_mock_dict(),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['os-server-groups']),
json={'server_groups': [fake_group]}),
dict(method='GET',
uri=self.get_mock_url(
'network', 'public', append=['v2.0', 'networks']),
json={'networks': []}),
dict(method='POST',
uri=self.get_mock_url(
'compute', 'public', append=['servers']),
json={'server': fake_server},
validate=dict(
json={
'server': {
u'flavorRef': u'flavor-id',
u'imageRef': u'image-id',
u'max_count': 1,
u'min_count': 1,
u'name': u'server-name',
'networks': 'auto'},
u'OS-SCH-HNT:scheduler_hints': group_scheduler_hints,
})),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
json={'server': fake_server}),
])
self.cloud.create_server(
name='server-name', image=dict(id='image-id'),
flavor=dict(id='flavor-id'),
scheduler_hints=dict(scheduler_hints), group=group_name,
wait=False)
self.assert_calls()