Fix path_in_stack for scheduler hints
Nova expects scheduler_hints to be a DictOfListOfStrings in the object layer(versioned objects), though there is no limitation for this in the api layer. Thefore sending a list of tuples as a scheduler_hint results in error. This also sets stack_scheduler_hints=true for integration tests. Change-Id: Id7575f67657fab86acb22d86807127dda45305d5 Closes-Bug: #1608452
This commit is contained in:
parent
b481a126c2
commit
372a2376b8
|
@ -29,8 +29,8 @@ The hints
|
||||||
---------
|
---------
|
||||||
When heat processes a stack, and the feature is enabled, the stack id, root
|
When heat processes a stack, and the feature is enabled, the stack id, root
|
||||||
stack id, stack resource uuid, stack resource name, and the path in the stack
|
stack id, stack resource uuid, stack resource name, and the path in the stack
|
||||||
(as a list of tuple, (stackresourcename, stackname)) will be passed by heat
|
(as a list of comma delimited strings of stackresourcename and stackname) will
|
||||||
to nova and cinder as scheduler hints.
|
be passed by heat to nova and cinder as scheduler hints.
|
||||||
|
|
||||||
Purpose
|
Purpose
|
||||||
-------
|
-------
|
||||||
|
|
|
@ -250,11 +250,11 @@ engine_opts = [
|
||||||
' set to the id of the resource\'s parent stack,'
|
' set to the id of the resource\'s parent stack,'
|
||||||
' heat_stack_name will be set to the name of the'
|
' heat_stack_name will be set to the name of the'
|
||||||
' resource\'s parent stack, heat_path_in_stack will'
|
' resource\'s parent stack, heat_path_in_stack will'
|
||||||
' be set to a list of tuples, (stackresourcename,'
|
' be set to a list of comma delimited strings of'
|
||||||
' stackname) with list[0] being (None, rootstackname),'
|
' stackresourcename and stackname with list[0] being'
|
||||||
' heat_resource_name will be set to the resource\'s'
|
' \'rootstackname\', heat_resource_name will be set to'
|
||||||
' name, and heat_resource_uuid will be set to the'
|
' the resource\'s name, and heat_resource_uuid will be'
|
||||||
' resource\'s orchestration id.')),
|
' set to the resource\'s orchestration id.')),
|
||||||
cfg.BoolOpt('encrypt_parameters_and_properties',
|
cfg.BoolOpt('encrypt_parameters_and_properties',
|
||||||
default=False,
|
default=False,
|
||||||
help=_('Encrypt template parameters that were marked as'
|
help=_('Encrypt template parameters that were marked as'
|
||||||
|
|
|
@ -26,6 +26,19 @@ class SchedulerHintsMixin(object):
|
||||||
HEAT_RESOURCE_NAME = 'heat_resource_name'
|
HEAT_RESOURCE_NAME = 'heat_resource_name'
|
||||||
HEAT_RESOURCE_UUID = 'heat_resource_uuid'
|
HEAT_RESOURCE_UUID = 'heat_resource_uuid'
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _path_in_stack(stack):
|
||||||
|
# Note: scheduler_hints can only be of DictOfListOfStrings.
|
||||||
|
# Convert the list of tuples to list of delimited strings.
|
||||||
|
path = []
|
||||||
|
for parent_res_name, stack_name in stack.path_in_stack():
|
||||||
|
if parent_res_name is not None:
|
||||||
|
path.append(','.join([parent_res_name, stack_name]))
|
||||||
|
else:
|
||||||
|
path.append(stack_name)
|
||||||
|
|
||||||
|
return path
|
||||||
|
|
||||||
def _scheduler_hints(self, scheduler_hints):
|
def _scheduler_hints(self, scheduler_hints):
|
||||||
"""Augment scheduler hints with supplemental content."""
|
"""Augment scheduler hints with supplemental content."""
|
||||||
if cfg.CONF.stack_scheduler_hints:
|
if cfg.CONF.stack_scheduler_hints:
|
||||||
|
@ -35,7 +48,8 @@ class SchedulerHintsMixin(object):
|
||||||
scheduler_hints[self.HEAT_ROOT_STACK_ID] = stack.root_stack_id()
|
scheduler_hints[self.HEAT_ROOT_STACK_ID] = stack.root_stack_id()
|
||||||
scheduler_hints[self.HEAT_STACK_ID] = stack.id
|
scheduler_hints[self.HEAT_STACK_ID] = stack.id
|
||||||
scheduler_hints[self.HEAT_STACK_NAME] = stack.name
|
scheduler_hints[self.HEAT_STACK_NAME] = stack.name
|
||||||
scheduler_hints[self.HEAT_PATH_IN_STACK] = stack.path_in_stack()
|
scheduler_hints[
|
||||||
|
self.HEAT_PATH_IN_STACK] = self._path_in_stack(stack)
|
||||||
scheduler_hints[self.HEAT_RESOURCE_NAME] = self.name
|
scheduler_hints[self.HEAT_RESOURCE_NAME] = self.name
|
||||||
scheduler_hints[self.HEAT_RESOURCE_UUID] = self.uuid
|
scheduler_hints[self.HEAT_RESOURCE_UUID] = self.uuid
|
||||||
return scheduler_hints
|
return scheduler_hints
|
||||||
|
|
|
@ -615,7 +615,7 @@ class InstancesTest(common.HeatTestCase):
|
||||||
scheduler_hints={shm.HEAT_ROOT_STACK_ID: stack.root_stack_id(),
|
scheduler_hints={shm.HEAT_ROOT_STACK_ID: stack.root_stack_id(),
|
||||||
shm.HEAT_STACK_ID: stack.id,
|
shm.HEAT_STACK_ID: stack.id,
|
||||||
shm.HEAT_STACK_NAME: stack.name,
|
shm.HEAT_STACK_NAME: stack.name,
|
||||||
shm.HEAT_PATH_IN_STACK: [(None, stack.name)],
|
shm.HEAT_PATH_IN_STACK: [stack.name],
|
||||||
shm.HEAT_RESOURCE_NAME: instance.name,
|
shm.HEAT_RESOURCE_NAME: instance.name,
|
||||||
shm.HEAT_RESOURCE_UUID: instance.uuid,
|
shm.HEAT_RESOURCE_UUID: instance.uuid,
|
||||||
'foo': ['spam', 'ham', 'baz'], 'bar': 'eggs'},
|
'foo': ['spam', 'ham', 'baz'], 'bar': 'eggs'},
|
||||||
|
|
|
@ -988,7 +988,7 @@ class CinderVolumeTest(vt_base.BaseVolumeTest):
|
||||||
scheduler_hints={shm.HEAT_ROOT_STACK_ID: stack.root_stack_id(),
|
scheduler_hints={shm.HEAT_ROOT_STACK_ID: stack.root_stack_id(),
|
||||||
shm.HEAT_STACK_ID: stack.id,
|
shm.HEAT_STACK_ID: stack.id,
|
||||||
shm.HEAT_STACK_NAME: stack.name,
|
shm.HEAT_STACK_NAME: stack.name,
|
||||||
shm.HEAT_PATH_IN_STACK: [(None, stack.name)],
|
shm.HEAT_PATH_IN_STACK: [stack.name],
|
||||||
shm.HEAT_RESOURCE_NAME: rsrc.name,
|
shm.HEAT_RESOURCE_NAME: rsrc.name,
|
||||||
shm.HEAT_RESOURCE_UUID: rsrc.uuid}).AndReturn(fv)
|
shm.HEAT_RESOURCE_UUID: rsrc.uuid}).AndReturn(fv)
|
||||||
self.cinder_fc.volumes.get(fv.id).AndReturn(fv)
|
self.cinder_fc.volumes.get(fv.id).AndReturn(fv)
|
||||||
|
|
|
@ -983,7 +983,8 @@ class ServersTest(common.HeatTestCase):
|
||||||
stack_name = 'test_server_w_stack_sched_hints_s'
|
stack_name = 'test_server_w_stack_sched_hints_s'
|
||||||
server_name = 'server_w_stack_sched_hints'
|
server_name = 'server_w_stack_sched_hints'
|
||||||
(t, stack) = self._get_test_template(stack_name, server_name)
|
(t, stack) = self._get_test_template(stack_name, server_name)
|
||||||
|
self.patchobject(stack, 'path_in_stack',
|
||||||
|
return_value=[('parent', stack.name)])
|
||||||
resource_defns = t.resource_definitions(stack)
|
resource_defns = t.resource_definitions(stack)
|
||||||
server = servers.Server(server_name,
|
server = servers.Server(server_name,
|
||||||
resource_defns['WebServer'], stack)
|
resource_defns['WebServer'], stack)
|
||||||
|
@ -999,7 +1000,8 @@ class ServersTest(common.HeatTestCase):
|
||||||
scheduler_hints = {shm.HEAT_ROOT_STACK_ID: stack.root_stack_id(),
|
scheduler_hints = {shm.HEAT_ROOT_STACK_ID: stack.root_stack_id(),
|
||||||
shm.HEAT_STACK_ID: stack.id,
|
shm.HEAT_STACK_ID: stack.id,
|
||||||
shm.HEAT_STACK_NAME: stack.name,
|
shm.HEAT_STACK_NAME: stack.name,
|
||||||
shm.HEAT_PATH_IN_STACK: [(None, stack.name)],
|
shm.HEAT_PATH_IN_STACK: [','.join(['parent',
|
||||||
|
stack.name])],
|
||||||
shm.HEAT_RESOURCE_NAME: server.name,
|
shm.HEAT_RESOURCE_NAME: server.name,
|
||||||
shm.HEAT_RESOURCE_UUID: server.uuid}
|
shm.HEAT_RESOURCE_UUID: server.uuid}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ if [ "$DISABLE_CONVERGENCE" == "true" ] ; then
|
||||||
echo -e 'convergence_engine=false\n' >> $localconf
|
echo -e 'convergence_engine=false\n' >> $localconf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo -e 'stack_scheduler_hints=true\n' >> $localconf
|
||||||
echo -e 'notification_driver=messagingv2\n' >> $localconf
|
echo -e 'notification_driver=messagingv2\n' >> $localconf
|
||||||
echo -e 'hidden_stack_tags=hidden\n' >> $localconf
|
echo -e 'hidden_stack_tags=hidden\n' >> $localconf
|
||||||
echo -e 'encrypt_parameters_and_properties=True\n' >> $localconf
|
echo -e 'encrypt_parameters_and_properties=True\n' >> $localconf
|
||||||
|
|
Loading…
Reference in New Issue