diff --git a/nova/objects/request_spec.py b/nova/objects/request_spec.py index c93da7d13c04..e77dc919a2e3 100644 --- a/nova/objects/request_spec.py +++ b/nova/objects/request_spec.py @@ -242,6 +242,8 @@ class RequestSpec(base.NovaObject): policies = list(filter_properties.get('group_policies')) hosts = list(filter_properties.get('group_hosts')) members = list(filter_properties.get('group_members')) + # TODO(mriedem): We could try to get the group uuid from the + # group hint in the filter_properties. self.instance_group = objects.InstanceGroup(policy=policies[0], hosts=hosts, members=members) @@ -545,6 +547,12 @@ class RequestSpec(base.NovaObject): spec._context = context if 'instance_group' in spec and spec.instance_group: + # NOTE(mriedem): We could have a half-baked instance group with no + # uuid if some legacy translation was performed on this spec in the + # past. In that case, try to workaround the issue by getting the + # group uuid from the scheduler hint. + if 'uuid' not in spec.instance_group: + spec.instance_group.uuid = spec.get_scheduler_hint('group') # NOTE(danms): We don't store the full instance group in # the reqspec since it would be stale almost immediately. # Instead, load it by uuid here so it's up-to-date. diff --git a/nova/tests/functional/regressions/test_bug_1830747.py b/nova/tests/functional/regressions/test_bug_1830747.py index 96c76e588acd..1e22df6caf66 100644 --- a/nova/tests/functional/regressions/test_bug_1830747.py +++ b/nova/tests/functional/regressions/test_bug_1830747.py @@ -11,11 +11,9 @@ # under the License. import mock -import six from nova.conductor import api as conductor_api from nova import context as nova_context -from nova import exception from nova import objects from nova.scheduler import weights from nova import test @@ -142,17 +140,10 @@ class MissingReqSpecInstanceGroupUUIDTestCase( with mock.patch.dict(host1_driver.capabilities, supports_migrate_to_same_host=False): self.api.post_server_action(server['id'], {'migrate': None}) - # FIXME(mriedem): Due to bug 1830747 we don't go to VERIFY_RESIZE - # because the reschedule fails and the instance is put into - # ERROR status. When the bug is fixed the status should be - # VERIFY_RESIZE and the server should be on host2. server = self._wait_for_state_change( - self.api, server, 'ERROR') - self.assertEqual('host1', server['OS-EXT-SRV-ATTR:host']) + self.api, server, 'VERIFY_RESIZE') + self.assertEqual('host2', server['OS-EXT-SRV-ATTR:host']) - # And the RequestSpec.instance_group.uuid should be missing which - # leads to us failing to load the RequestSpec. - ex = self.assertRaises(exception.ObjectActionError, - objects.RequestSpec.get_by_instance_uuid, - ctxt, server['id']) - self.assertIn('unable to load uuid', six.text_type(ex)) + # The RequestSpec.instance_group.uuid should still be set. + reqspec = objects.RequestSpec.get_by_instance_uuid(ctxt, server['id']) + self.assertEqual(group_id, reqspec.instance_group.uuid)