Merge "Don't persist RequestSpec.retry" into stable/ocata

This commit is contained in:
Zuul 2018-04-24 18:05:16 +00:00 committed by Gerrit Code Review
commit 15d1e8a975
5 changed files with 36 additions and 16 deletions

View File

@ -494,6 +494,9 @@ class RequestSpec(base.NovaObject):
if 'instance_group' in spec and spec.instance_group:
spec.instance_group.members = None
spec.instance_group.hosts = None
# NOTE(mriedem): Don't persist retries since those are per-request
if 'retry' in spec and spec.retry:
spec.retry = None
db_updates = {'spec': jsonutils.dumps(spec.obj_to_primitive())}
if 'instance_uuid' in updates:

View File

@ -357,6 +357,9 @@ class TestCase(testtools.TestCase):
cell_mapping=cell)
hm.create()
self.host_mappings[hm.host] = hm
if host is not None:
# Make sure that CONF.host is relevant to the right hostname
self.useFixture(nova_fixtures.ConfPatcher(host=host))
return svc.service

View File

@ -152,17 +152,13 @@ class TestRequestSpecRetryReschedule(test.TestCase,
data = {'os-migrateLive': {'host': 'host2', 'block_migration': 'auto'}}
self.admin_api.post_server_action(server['id'], data)
server = self._wait_for_state_change(self.admin_api, server, 'ACTIVE')
# FIXME(mriedem): This is bug 1718512 where the failed resize left
# host2 in the RequestSpec.retry field and it affects the live migrate
# to host2 because the scheduler RetryFilter kicks it out.
self.assertEqual('host3', server['OS-EXT-SRV-ATTR:host'])
migrations = self.admin_api.api_get(
'os-migrations?instance_uuid=%s&migration_type=live-migration' %
server['id']).body['migrations']
self.assertEqual(1, len(migrations))
self.assertEqual('error', migrations[0]['status'])
self.assertEqual('host2', server['OS-EXT-SRV-ATTR:host'])
# NOTE(mriedem): The instance status effectively goes to ACTIVE before
# the migration status is changed to "completed" since
# post_live_migration_at_destination changes the instance status
# and _post_live_migration changes the migration status later. So we
# need to poll the migration record until it's complete or we timeout.
self._wait_for_migration_status(server, 'completed')
reqspec = objects.RequestSpec.get_by_instance_uuid(
nova_context.get_admin_context(), server['id'])
self.assertIsNotNone(reqspec.retry)
self.assertEqual(1, reqspec.retry.num_attempts)
self.assertEqual('host2', reqspec.retry.hosts[0].host)
self.assertIsNone(reqspec.retry)

View File

@ -535,13 +535,14 @@ class _TestRequestSpecObject(object):
# object fields
for field in ['image', 'numa_topology', 'pci_requests', 'flavor',
'retry', 'limits']:
'limits']:
self.assertEqual(
getattr(req_obj, field).obj_to_primitive(),
getattr(serialized_obj, field).obj_to_primitive())
self.assertIsNone(serialized_obj.instance_group.members)
self.assertIsNone(serialized_obj.instance_group.hosts)
self.assertIsNone(serialized_obj.retry)
def test_create(self):
req_obj = fake_request_spec.fake_spec_obj(remove_id=True)

View File

@ -37,6 +37,7 @@ from nova.console import type as ctype
from nova import exception
from nova.i18n import _LW
from nova.objects import fields as obj_fields
from nova.objects import migrate_data
from nova.virt import diagnostics
from nova.virt import driver
from nova.virt import hardware
@ -489,11 +490,27 @@ class FakeDriver(driver.ComputeDriver):
src_compute_info, dst_compute_info,
block_migration=False,
disk_over_commit=False):
return {}
data = migrate_data.LibvirtLiveMigrateData()
data.filename = 'fake'
data.image_type = CONF.libvirt.images_type
data.graphics_listen_addr_vnc = CONF.vnc.vncserver_listen
data.graphics_listen_addr_spice = CONF.spice.server_listen
data.serial_listen_addr = None
# Notes(eliqiao): block_migration and disk_over_commit are not
# nullable, so just don't set them if they are None
if block_migration is not None:
data.block_migration = block_migration
if disk_over_commit is not None:
data.disk_over_commit = disk_over_commit
data.disk_available_mb = 100000
data.is_shared_block_storage = True
data.is_shared_instance_path = True
return data
def check_can_live_migrate_source(self, context, instance,
dest_check_data, block_device_info=None):
return
return dest_check_data
def finish_migration(self, context, migration, instance, disk_info,
network_info, image_meta, resize_instance,
@ -505,7 +522,7 @@ class FakeDriver(driver.ComputeDriver):
def pre_live_migration(self, context, instance, block_device_info,
network_info, disk_info, migrate_data):
return
return migrate_data
def unfilter_instance(self, instance, network_info):
return