def resolve_parameter_values(self, parameters_dict, stack_name): parameters = {} for key, value in parameters_dict.items(): if isinstance(value, list): self.logger.debug("List parameter found for {0}".format(key)) value_string = self.convert_list_to_string(value) parameters[key] = value_string elif isinstance(value, str): if DependencyResolver.is_parameter_reference(value): referenced_stack, output_name = DependencyResolver.parse_stack_reference_value(value) parameters[key] = str(self.get_output_value(referenced_stack + '.' + output_name)) elif self.is_keep_value(value): parameters[key] = str(self.get_actual_value(key, value, stack_name)) elif self.is_taupage_ami_reference(value): parameters[key] = str(self.ec2.get_latest_taupage_image_id()) else: parameters[key] = value elif isinstance(value, bool): parameters[key] = str(value).lower() elif isinstance(value, int): parameters[key] = str(value) elif isinstance(value, float): parameters[key] = str(value) else: raise NotImplementedError("Cannot handle {0} value for key: {1}".format(type(value), key)) return parameters
def test_get_stack_order_accepts_stacks_without_parameters_key(self): stacks = {'default-sg': {}, 'app1': None, 'app2': {}, 'vpc': {}, } result = 4 self.assertEqual(result, len(DependencyResolver.get_stack_order(stacks)))
def test_get_stack_order_includes_independent_stacks(self): stacks = {'default-sg': StackConfig({'template-url': 'horst.yml'}), 'app1': StackConfig( {'template-url': 'horst.yml', 'parameters': {'a': '|Ref|vpc.id', 'b': '|Ref|default-sg.id'}}), 'app2': StackConfig({'template-url': 'horst.yml', 'parameters': {'a': '|Ref|vpc.id', 'b': '|Ref|default-sg.id', 'c': 'Ref::app1.id'}}), 'vpc': StackConfig({'template-url': 'horst.yml', 'parameters': {'logBucketName': 'is24-cloudtrail-logs', 'includeGlobalServices': False}}) } result = 4 self.assertEqual(result, len(DependencyResolver.get_stack_order(stacks)))
def test_get_stack_order_returns_a_valid_order(self): stacks = {'default-sg': StackConfig({'template-url': 'horst.yml', 'parameters': {'a': 'Ref::vpc.id'}}), 'app1': StackConfig( {'template-url': 'horst.yml', 'parameters': {'a': '|Ref|vpc.id', 'b': '|Ref|default-sg.id'}}), 'app2': StackConfig({'template-url': 'horst.yml', 'parameters': {'a': '|Ref|vpc.id', 'b': '|Ref|default-sg.id', 'c': '|Ref|app1.id'}}), 'vpc': StackConfig({'template-url': 'horst.yml', 'parameters': {'logBucketName': 'is24-cloudtrail-logs', 'includeGlobalServices': False}}) } expected = ['vpc', 'default-sg', 'app1', 'app2'] self.assertEqual(expected, DependencyResolver.get_stack_order(stacks))
def test_parse_stack_reference_value_returns_stack_and_output_name_tuple(self): self.assertEqual(('stack', 'output'), DependencyResolver.parse_stack_reference_value('|ref|stack.output'))
def test_parse_stack_reference_value_returns_none_for_non_reference(self): self.assertIsNone(DependencyResolver.parse_stack_reference_value('foo'))
def test_filter_unmanaged_stacks_filters_all_occurences(self): stacks = ['a', 'b', 'c', 'c'] managed_stacks = ['a'] self.assertListEqual(managed_stacks, DependencyResolver.filter_unmanaged_stacks(managed_stacks, stacks))
def test_is_parameter_reference_returns_true_for_uppercase_ref(self): self.assertTrue(DependencyResolver.is_parameter_reference("|Ref|vpc.id"))
def test_get_stack_order_raises_exception_on_cyclic_dependency(self): stacks = {'app1': {'parameters': {'a': 'Ref::app2.id'}}, 'app2': {'parameters': {'a': 'Ref::app1.id'}} } with self.assertRaises(Exception): DependencyResolver.get_stack_order(stacks)
def test_is_parameter_reference_returns_true_on_empty_reference(self): self.assertTrue(DependencyResolver.is_parameter_reference('|ref|'))
def test_is_parameter_reference_returns_false_for_boolean_values(self): self.assertFalse(DependencyResolver.is_parameter_reference(True))
def test_is_parameter_reference_returns_false_for_simple_string(self): self.assertFalse(DependencyResolver.is_parameter_reference("vpc.id"))
def test_is_parameter_reference_returns_false_for_single_separator(self): self.assertFalse(DependencyResolver.is_parameter_reference("Ref|vpc.id"))
def test_parse_stack_reference_raises_exception_on_empty_reference(self): with self.assertRaises(CfnSphereException): DependencyResolver.parse_stack_reference_value('|ref|')
def test_parse_stack_reference_raises_exception_on_missing_dot(self): with self.assertRaises(CfnSphereException): DependencyResolver.parse_stack_reference_value('|ref|foo')