Make LiveMigrateTask use build_request_spec()
Some filters like TrustedFilter makes use of extra_specs. Currently, when live-migration uses the scheduler to select a host, it constructs a request_spec that has no extra_specs in it. By making use of the existing helper method build_request_spec(), the request to the scheduler will include extra_specs. Change-Id: I5bc6c6418653c256a42da7b0a343086ec9863da1 Closes-Bug: #1224014
This commit is contained in:
parent
2bea97bae6
commit
e80121a2c5
|
@ -14,7 +14,6 @@
|
|||
|
||||
from oslo.config import cfg
|
||||
|
||||
from nova.compute import flavors
|
||||
from nova.compute import power_state
|
||||
from nova.compute import rpcapi as compute_rpcapi
|
||||
from nova.compute import utils as compute_utils
|
||||
|
@ -25,6 +24,7 @@ from nova.objects import base as obj_base
|
|||
from nova.openstack.common.gettextutils import _
|
||||
from nova.openstack.common import log as logging
|
||||
from nova.scheduler import rpcapi as scheduler_rpcapi
|
||||
from nova.scheduler import utils as scheduler_utils
|
||||
from nova import servicegroup
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
@ -152,14 +152,16 @@ class LiveMigrationTask(object):
|
|||
self.image_service,
|
||||
self.instance.image_ref,
|
||||
self.instance)
|
||||
instance_type = flavors.extract_flavor(self.instance)
|
||||
instance_p = obj_base.obj_to_primitive(self.instance)
|
||||
request_spec = scheduler_utils.build_request_spec(self.context, image,
|
||||
[instance_p])
|
||||
|
||||
host = None
|
||||
while host is None:
|
||||
self._check_not_over_max_retries(attempted_hosts)
|
||||
|
||||
host = self._get_candidate_destination(image,
|
||||
instance_type, attempted_hosts)
|
||||
filter_properties = {'ignore_hosts': attempted_hosts}
|
||||
host = self.scheduler_rpcapi.select_hosts(self.context,
|
||||
request_spec, filter_properties)[0]
|
||||
try:
|
||||
self._check_compatible_with_source_hypervisor(host)
|
||||
self._call_livem_checks_on_host(host)
|
||||
|
@ -170,18 +172,6 @@ class LiveMigrationTask(object):
|
|||
host = None
|
||||
return host
|
||||
|
||||
def _get_candidate_destination(self, image, instance_type,
|
||||
attempted_hosts):
|
||||
instance_p = obj_base.obj_to_primitive(self.instance)
|
||||
request_spec = {'instance_properties': instance_p,
|
||||
'instance_type': instance_type,
|
||||
'instance_uuids': [self.instance.uuid]}
|
||||
if image:
|
||||
request_spec['image'] = image
|
||||
filter_properties = {'ignore_hosts': attempted_hosts}
|
||||
return self.scheduler_rpcapi.select_hosts(self.context,
|
||||
request_spec, filter_properties)[0]
|
||||
|
||||
def _check_not_over_max_retries(self, attempted_hosts):
|
||||
if CONF.migrate_max_retries == -1:
|
||||
return
|
||||
|
|
|
@ -14,14 +14,13 @@
|
|||
|
||||
import mox
|
||||
|
||||
from nova.compute import flavors
|
||||
from nova.compute import power_state
|
||||
from nova.compute import utils as compute_utils
|
||||
from nova.conductor.tasks import live_migrate
|
||||
from nova import db
|
||||
from nova import exception
|
||||
from nova.objects import base as obj_base
|
||||
from nova.objects import instance as instance_obj
|
||||
from nova.scheduler import utils as scheduler_utils
|
||||
from nova import test
|
||||
from nova.tests import fake_instance
|
||||
|
||||
|
@ -233,7 +232,7 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
|
||||
def test_find_destination_works(self):
|
||||
self.mox.StubOutWithMock(compute_utils, 'get_image_metadata')
|
||||
self.mox.StubOutWithMock(flavors, 'extract_flavor')
|
||||
self.mox.StubOutWithMock(scheduler_utils, 'build_request_spec')
|
||||
self.mox.StubOutWithMock(self.task.scheduler_rpcapi, 'select_hosts')
|
||||
self.mox.StubOutWithMock(self.task,
|
||||
'_check_compatible_with_source_hypervisor')
|
||||
|
@ -242,7 +241,8 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
compute_utils.get_image_metadata(self.context,
|
||||
self.task.image_service, self.instance_image,
|
||||
self.instance).AndReturn("image")
|
||||
flavors.extract_flavor(self.instance).AndReturn("inst_type")
|
||||
scheduler_utils.build_request_spec(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn({})
|
||||
self.task.scheduler_rpcapi.select_hosts(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn(["host1"])
|
||||
self.task._check_compatible_with_source_hypervisor("host1")
|
||||
|
@ -254,21 +254,16 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
def test_find_destination_no_image_works(self):
|
||||
self.instance['image_ref'] = ''
|
||||
|
||||
self.mox.StubOutWithMock(flavors, 'extract_flavor')
|
||||
self.mox.StubOutWithMock(scheduler_utils, 'build_request_spec')
|
||||
self.mox.StubOutWithMock(self.task.scheduler_rpcapi, 'select_hosts')
|
||||
self.mox.StubOutWithMock(self.task,
|
||||
'_check_compatible_with_source_hypervisor')
|
||||
self.mox.StubOutWithMock(self.task, '_call_livem_checks_on_host')
|
||||
|
||||
flavors.extract_flavor(self.instance).AndReturn("inst_type")
|
||||
# request_spec with no image set
|
||||
instance_p = obj_base.obj_to_primitive(self.instance)
|
||||
request_spec = {'instance_properties': instance_p,
|
||||
'instance_type': "inst_type",
|
||||
'instance_uuids': [self.instance['uuid']]}
|
||||
self.task.scheduler_rpcapi.select_hosts(self.context, request_spec,
|
||||
scheduler_utils.build_request_spec(self.context, None,
|
||||
mox.IgnoreArg()).AndReturn({})
|
||||
self.task.scheduler_rpcapi.select_hosts(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn(["host1"])
|
||||
|
||||
self.task._check_compatible_with_source_hypervisor("host1")
|
||||
self.task._call_livem_checks_on_host("host1")
|
||||
|
||||
|
@ -277,7 +272,7 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
|
||||
def _test_find_destination_retry_hypervisor_raises(self, error):
|
||||
self.mox.StubOutWithMock(compute_utils, 'get_image_metadata')
|
||||
self.mox.StubOutWithMock(flavors, 'extract_flavor')
|
||||
self.mox.StubOutWithMock(scheduler_utils, 'build_request_spec')
|
||||
self.mox.StubOutWithMock(self.task.scheduler_rpcapi, 'select_hosts')
|
||||
self.mox.StubOutWithMock(self.task,
|
||||
'_check_compatible_with_source_hypervisor')
|
||||
|
@ -286,7 +281,8 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
compute_utils.get_image_metadata(self.context,
|
||||
self.task.image_service, self.instance_image,
|
||||
self.instance).AndReturn("image")
|
||||
flavors.extract_flavor(self.instance).AndReturn("inst_type")
|
||||
scheduler_utils.build_request_spec(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn({})
|
||||
self.task.scheduler_rpcapi.select_hosts(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn(["host1"])
|
||||
self.task._check_compatible_with_source_hypervisor("host1")\
|
||||
|
@ -311,7 +307,7 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
def test_find_destination_retry_with_invalid_livem_checks(self):
|
||||
self.flags(migrate_max_retries=1)
|
||||
self.mox.StubOutWithMock(compute_utils, 'get_image_metadata')
|
||||
self.mox.StubOutWithMock(flavors, 'extract_flavor')
|
||||
self.mox.StubOutWithMock(scheduler_utils, 'build_request_spec')
|
||||
self.mox.StubOutWithMock(self.task.scheduler_rpcapi, 'select_hosts')
|
||||
self.mox.StubOutWithMock(self.task,
|
||||
'_check_compatible_with_source_hypervisor')
|
||||
|
@ -320,7 +316,8 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
compute_utils.get_image_metadata(self.context,
|
||||
self.task.image_service, self.instance_image,
|
||||
self.instance).AndReturn("image")
|
||||
flavors.extract_flavor(self.instance).AndReturn("inst_type")
|
||||
scheduler_utils.build_request_spec(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn({})
|
||||
self.task.scheduler_rpcapi.select_hosts(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn(["host1"])
|
||||
self.task._check_compatible_with_source_hypervisor("host1")
|
||||
|
@ -338,16 +335,16 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
def test_find_destination_retry_exceeds_max(self):
|
||||
self.flags(migrate_max_retries=0)
|
||||
self.mox.StubOutWithMock(compute_utils, 'get_image_metadata')
|
||||
self.mox.StubOutWithMock(flavors, 'extract_flavor')
|
||||
self.mox.StubOutWithMock(scheduler_utils, 'build_request_spec')
|
||||
self.mox.StubOutWithMock(self.task.scheduler_rpcapi, 'select_hosts')
|
||||
self.mox.StubOutWithMock(self.task,
|
||||
'_check_compatible_with_source_hypervisor')
|
||||
self.mox.StubOutWithMock(self.task, '_call_livem_checks_on_host')
|
||||
|
||||
compute_utils.get_image_metadata(self.context,
|
||||
self.task.image_service, self.instance_image,
|
||||
self.instance).AndReturn("image")
|
||||
flavors.extract_flavor(self.instance).AndReturn("inst_type")
|
||||
scheduler_utils.build_request_spec(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn({})
|
||||
self.task.scheduler_rpcapi.select_hosts(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn(["host1"])
|
||||
self.task._check_compatible_with_source_hypervisor("host1")\
|
||||
|
@ -358,16 +355,14 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
|
|||
|
||||
def test_find_destination_when_runs_out_of_hosts(self):
|
||||
self.mox.StubOutWithMock(compute_utils, 'get_image_metadata')
|
||||
self.mox.StubOutWithMock(flavors, 'extract_flavor')
|
||||
self.mox.StubOutWithMock(scheduler_utils, 'build_request_spec')
|
||||
self.mox.StubOutWithMock(self.task.scheduler_rpcapi, 'select_hosts')
|
||||
self.mox.StubOutWithMock(self.task,
|
||||
'_check_compatible_with_source_hypervisor')
|
||||
self.mox.StubOutWithMock(self.task, '_call_livem_checks_on_host')
|
||||
|
||||
compute_utils.get_image_metadata(self.context,
|
||||
self.task.image_service, self.instance_image,
|
||||
self.instance).AndReturn("image")
|
||||
flavors.extract_flavor(self.instance).AndReturn("inst_type")
|
||||
scheduler_utils.build_request_spec(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndReturn({})
|
||||
self.task.scheduler_rpcapi.select_hosts(self.context, mox.IgnoreArg(),
|
||||
mox.IgnoreArg()).AndRaise(exception.NoValidHost(reason=""))
|
||||
|
||||
|
|
Loading…
Reference in New Issue