summaryrefslogtreecommitdiff
path: root/nova
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2019-12-06 01:49:16 +0000
committerGerrit Code Review <review@openstack.org>2019-12-06 01:49:17 +0000
commit667feba8d66628e08e019bddb7ce2ddae9e3d3cc (patch)
treec068b5fa74eae9754834fe2f8055123a2882c44b /nova
parent9bf101edb6762b895ec3a01720f8de2930c033bf (diff)
parent3390c7af7ac774163fc8aa43e65662dfcefdc4cc (diff)
downloadnova-667feba8d66628e08e019bddb7ce2ddae9e3d3cc.tar.gz
Merge "Workaround missing RequestSpec.instance_group.uuid" into stable/ocata
Diffstat (limited to 'nova')
-rw-r--r--nova/objects/request_spec.py8
-rw-r--r--nova/tests/functional/regressions/test_bug_1830747.py21
2 files changed, 14 insertions, 15 deletions
diff --git a/nova/objects/request_spec.py b/nova/objects/request_spec.py
index 7b815b9d3d..8cc2233ac0 100644
--- a/nova/objects/request_spec.py
+++ b/nova/objects/request_spec.py
@@ -197,6 +197,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(policies=policies,
hosts=hosts,
members=members)
@@ -445,6 +447,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 0ceb45f823..ed9b069868 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
import nova.conf
from nova import context as nova_context
-from nova import exception
from nova import objects
from nova.scheduler import weights
from nova import test
@@ -137,17 +135,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'])
-
- # 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))
+ self.api, server, 'VERIFY_RESIZE')
+ self.assertEqual('host2', server['OS-EXT-SRV-ATTR:host'])
+
+ # 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)