Merge "Disable retry filter with force_hosts or force_nodes"

This commit is contained in:
Jenkins
2013-09-02 02:46:05 +00:00
committed by Gerrit Code Review
4 changed files with 61 additions and 7 deletions

View File

@@ -245,12 +245,14 @@ class FilterScheduler(driver.Scheduler):
request. If maximum retries is exceeded, raise NoValidHost.
"""
max_attempts = self._max_attempts()
retry = filter_properties.pop('retry', {})
force_hosts = filter_properties.get('force_hosts', [])
force_nodes = filter_properties.get('force_nodes', [])
if max_attempts == 1:
if max_attempts == 1 or force_hosts or force_nodes:
# re-scheduling is disabled.
return
retry = filter_properties.pop('retry', {})
# retry is enabled, update attempt count:
if retry:
retry['num_attempts'] += 1

View File

@@ -121,7 +121,9 @@ def _add_retry_host(filter_properties, host, node):
node has already been tried.
"""
retry = filter_properties.get('retry', None)
if not retry:
force_hosts = filter_properties.get('force_hosts', [])
force_nodes = filter_properties.get('force_nodes', [])
if not retry or force_hosts or force_nodes:
return
hosts = retry['hosts']
hosts.append([host, node])

View File

@@ -229,6 +229,44 @@ class FilterSchedulerTestCase(test_scheduler.SchedulerTestCase):
# should not have retry info in the populated filter properties:
self.assertFalse("retry" in filter_properties)
def test_retry_force_hosts(self):
# Retry info should not get populated when re-scheduling is off.
self.flags(scheduler_max_attempts=2)
sched = fakes.FakeFilterScheduler()
instance_properties = {'project_id': '12345', 'os_type': 'Linux'}
request_spec = dict(instance_properties=instance_properties)
filter_properties = dict(force_hosts=['force_host'])
self.mox.StubOutWithMock(db, 'compute_node_get_all')
db.compute_node_get_all(mox.IgnoreArg()).AndReturn([])
self.mox.ReplayAll()
sched._schedule(self.context, request_spec,
filter_properties=filter_properties)
# should not have retry info in the populated filter properties:
self.assertFalse("retry" in filter_properties)
def test_retry_force_nodes(self):
# Retry info should not get populated when re-scheduling is off.
self.flags(scheduler_max_attempts=2)
sched = fakes.FakeFilterScheduler()
instance_properties = {'project_id': '12345', 'os_type': 'Linux'}
request_spec = dict(instance_properties=instance_properties)
filter_properties = dict(force_nodes=['force_node'])
self.mox.StubOutWithMock(db, 'compute_node_get_all')
db.compute_node_get_all(mox.IgnoreArg()).AndReturn([])
self.mox.ReplayAll()
sched._schedule(self.context, request_spec,
filter_properties=filter_properties)
# should not have retry info in the populated filter properties:
self.assertFalse("retry" in filter_properties)
def test_retry_attempt_one(self):
# Test retry logic on initial scheduling attempt.
self.flags(scheduler_max_attempts=2)

View File

@@ -92,9 +92,15 @@ class SchedulerUtilsTestCase(test.NoDBTestCase):
self._test_set_vm_state_and_notify(request_spec, expected_uuids)
def _test_populate_filter_props(self, host_state_obj=True,
with_retry=True):
with_retry=True,
force_hosts=[],
force_nodes=[]):
if with_retry:
filter_properties = dict(retry=dict(hosts=[]))
if not force_hosts and not force_nodes:
filter_properties = dict(retry=dict(hosts=[]))
else:
filter_properties = dict(force_hosts=force_hosts,
force_nodes=force_nodes)
else:
filter_properties = dict()
@@ -110,13 +116,13 @@ class SchedulerUtilsTestCase(test.NoDBTestCase):
scheduler_utils.populate_filter_properties(filter_properties,
host_state)
if with_retry:
if with_retry and not force_hosts and not force_nodes:
# So we can check for 2 hosts
scheduler_utils.populate_filter_properties(filter_properties,
host_state)
self.assertEqual('fake-limits', filter_properties['limits'])
if with_retry:
if with_retry and not force_hosts and not force_nodes:
self.assertEqual([['fake-host', 'fake-node'],
['fake-host', 'fake-node']],
filter_properties['retry']['hosts'])
@@ -131,3 +137,9 @@ class SchedulerUtilsTestCase(test.NoDBTestCase):
def test_populate_filter_props_no_retry(self):
self._test_populate_filter_props(with_retry=False)
def test_populate_filter_props_force_hosts_no_retry(self):
self._test_populate_filter_props(force_hosts=['force-host'])
def test_populate_filter_props_force_nodes_no_retry(self):
self._test_populate_filter_props(force_nodes=['force-node'])