summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2019-06-04 16:53:43 +0000
committerGerrit Code Review <review@openstack.org>2019-06-04 16:53:44 +0000
commit105e6238dd536ac869276c38b5c76fefeb729b40 (patch)
tree98025c1b5533d54c6b2eed56703ebbf65e66012b
parentc1868751ebaa678d2550edf4b27ad8e4e3f8042b (diff)
parent8569eb9b4fb905cb92041b84c293dc4e7af27fa8 (diff)
downloadnova-105e6238dd536ac869276c38b5c76fefeb729b40.tar.gz
Merge "Workaround missing RequestSpec.instance_group.uuid" into stable/stein19.0.1
-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 c93da7d13c..e77dc919a2 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 96c76e588a..1e22df6caf 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'])
-
- # 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)