def _assemble_for_rolling_update( self, total_capacity, max_updates, include_all=False, template_version=("heat_template_version", "2015-04-30") ): names = list(self._resource_names(total_capacity)) name_blacklist = self._name_blacklist() valid_resources = [(n, d) for n, d in grouputils.get_member_definitions(self) if n not in name_blacklist] targ_cap = self.get_size() def replace_priority(res_item): name, defn = res_item try: index = names.index(name) except ValueError: # High priority - delete immediately return 0 else: if index < targ_cap: # Update higher indices first return targ_cap - index else: # Low priority - don't update return total_capacity old_resources = sorted(valid_resources, key=replace_priority) existing_names = set(n for n, d in valid_resources) new_names = six.moves.filterfalse(lambda n: n in existing_names, names) res_def = self.get_resource_def(include_all) definitions = scl_template.member_definitions( old_resources, res_def, total_capacity, max_updates, lambda: next(new_names), self.build_resource_definition ) return scl_template.make_template(definitions, version=template_version)
def _create_template(self, num_instances, num_replace=0, template_version=('HeatTemplateFormatVersion', '2012-12-12')): """Create a template to represent autoscaled instances. Also see heat.scaling.template.member_definitions. """ instance_definition = self._get_resource_definition() old_resources = grouputils.get_member_definitions(self, include_failed=True) definitions = list(template.member_definitions( old_resources, instance_definition, num_instances, num_replace, short_id.generate_id)) child_env = environment.get_child_environment( self.stack.env, self.child_params(), item_to_remove=self.resource_info) tmpl = template.make_template(definitions, version=template_version, child_env=child_env) # Subclasses use HOT templates att_func = 'get_attr' if att_func not in tmpl.functions: att_func = 'Fn::GetAtt' get_attr = functools.partial(tmpl.functions[att_func], None, att_func) for odefn in self._nested_output_defns([k for k, d in definitions], get_attr): tmpl.add_output(odefn) return tmpl
def _create_template(self, num_instances, num_replace=0, template_version=('HeatTemplateFormatVersion', '2012-12-12')): """Create a template to represent autoscaled instances. Also see heat.scaling.template.member_definitions. """ instance_definition = self._get_resource_definition() old_resources = grouputils.get_member_definitions(self, include_failed=True) definitions = template.member_definitions(old_resources, instance_definition, num_instances, num_replace, short_id.generate_id) child_env = environment.get_child_environment( self.stack.env, self.child_params(), item_to_remove=self.resource_info) return template.make_template(definitions, version=template_version, child_env=child_env)
def _create_template(self, num_instances, num_replace=0, template_version=('HeatTemplateFormatVersion', '2012-12-12')): """Create a template to represent autoscaled instances. Also see heat.scaling.template.member_definitions. """ instance_definition = self._get_resource_definition() old_resources = grouputils.get_member_definitions(self, include_failed=True) definitions = list(template.member_definitions( old_resources, instance_definition, num_instances, num_replace, short_id.generate_id)) child_env = environment.get_child_environment( self.stack.env, self.child_params(), item_to_remove=self.resource_info) tmpl = template.make_template(definitions, version=template_version, child_env=child_env) # Subclasses use HOT templates att_func, res_func = 'get_attr', 'get_resource' if att_func not in tmpl.functions or res_func not in tmpl.functions: att_func, res_func = 'Fn::GetAtt', 'Ref' get_attr = functools.partial(tmpl.functions[att_func], None, att_func) get_res = functools.partial(tmpl.functions[res_func], None, res_func) for odefn in self._nested_output_defns([k for k, d in definitions], get_attr, get_res): tmpl.add_output(odefn) return tmpl
def test_normal_group(self): group = mock.Mock() t = template_format.parse(nested_stack) stack = utils.parse_stack(t) # group size self.patchobject(group, 'nested', return_value=stack) self.assertEqual(2, grouputils.get_size(group)) # member list (sorted) members = [r for r in six.itervalues(stack)] expected = sorted(members, key=lambda r: (r.created_time, r.name)) actual = grouputils.get_members(group) self.assertEqual(expected, actual) # refids actual_ids = grouputils.get_member_refids(group) self.assertEqual(['ID-r0', 'ID-r1'], actual_ids) partial_ids = grouputils.get_member_refids(group, exclude=['ID-r1']) self.assertEqual(['ID-r0'], partial_ids) # names names = grouputils.get_member_names(group) self.assertEqual(['r0', 'r1'], names) # defn snippets as list expected = rsrc_defn.ResourceDefinition( None, "OverwrittenFnGetRefIdType") member_defs = grouputils.get_member_definitions(group) self.assertEqual([(x, expected) for x in names], member_defs)
def _create_template( self, num_instances, num_replace=0, template_version=("HeatTemplateFormatVersion", "2012-12-12") ): """Create a template to represent autoscaled instances. Also see heat.scaling.template.member_definitions. """ instance_definition = self._get_resource_definition() old_resources = grouputils.get_member_definitions(self, include_failed=True) definitions = template.member_definitions( old_resources, instance_definition, num_instances, num_replace, short_id.generate_id ) child_env = environment.get_child_environment( self.stack.env, self.child_params(), item_to_remove=self.resource_info ) return template.make_template(definitions, version=template_version, child_env=child_env)
def _assemble_for_rolling_update(self, total_capacity, max_updates, include_all=False, template_version=('heat_template_version', '2015-04-30')): names = list(self._resource_names(total_capacity)) name_blacklist = self._name_blacklist() valid_resources = [(n, d) for n, d in grouputils.get_member_definitions(self) if n not in name_blacklist] targ_cap = self.get_size() def replace_priority(res_item): name, defn = res_item try: index = names.index(name) except ValueError: # High priority - delete immediately return 0 else: if index < targ_cap: # Update higher indices first return targ_cap - index else: # Low priority - don't update return total_capacity old_resources = sorted(valid_resources, key=replace_priority) existing_names = set(n for n, d in valid_resources) new_names = six.moves.filterfalse(lambda n: n in existing_names, names) res_def = self.get_resource_def(include_all) definitions = scl_template.member_definitions( old_resources, res_def, total_capacity, max_updates, lambda: next(new_names), self.build_resource_definition) tmpl = scl_template.make_template(definitions, version=template_version) self._add_output_defns_to_template(tmpl, names) return tmpl
def _create_template(self, num_instances, num_replace=0, template_version=('HeatTemplateFormatVersion', '2012-12-12')): """Create a template to represent autoscaled instances. Also see heat.scaling.template.member_definitions. """ instance_definition = self._get_resource_definition() old_resources = grouputils.get_member_definitions(self, include_failed=True) # WRS: Detect a scale down. Issue a vote # If any vote is rejected, set new_resources to be same size as old existing = grouputils.get_members(self) if num_instances < len(existing): LOG.info("WRS downscale detected, vote initiated") for i in range(num_instances, len(existing)): if existing[i].wrs_vote() is False: LOG.info("WRS downscale blocked by vote") num_instances = len(existing) break definitions = list(template.member_definitions( old_resources, instance_definition, num_instances, num_replace, short_id.generate_id, delete_oldest=False)) child_env = environment.get_child_environment( self.stack.env, self.child_params(), item_to_remove=self.resource_info) tmpl = template.make_template(definitions, version=template_version, child_env=child_env) # Subclasses use HOT templates att_func = 'get_attr' if att_func not in tmpl.functions: att_func = 'Fn::GetAtt' get_attr = functools.partial(tmpl.functions[att_func], None, att_func) for odefn in self._nested_output_defns([k for k, d in definitions], get_attr): tmpl.add_output(odefn) return tmpl