Add support for using index and attribute names in the get_attribute function
Change-Id: Ifb9ef61871a22651cb01643996fccebe33184607 Related-Bug: 1539539
This commit is contained in:
@@ -120,15 +120,31 @@ class GetAttribute(Function):
|
|||||||
|
|
||||||
* { get_attribute: [ server, private_address ] }
|
* { get_attribute: [ server, private_address ] }
|
||||||
* { get_attribute: [ HOST, private_address ] }
|
* { get_attribute: [ HOST, private_address ] }
|
||||||
|
* { get_attribute: [ HOST, private_address, 0 ] }
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
if len(self.args) != 2:
|
if len(self.args) != 2 and len(self.args) != 3:
|
||||||
ExceptionCollector.appendException(
|
ExceptionCollector.appendException(
|
||||||
ValueError(_('Illegal arguments for function "{0}". Expected '
|
ValueError(_('Illegal arguments for function "{0}". Expected '
|
||||||
'arguments: "node-template-name", '
|
'arguments: "node-template-name", '
|
||||||
'"attribute-name"').format(GET_ATTRIBUTE)))
|
'"attribute-name"').format(GET_ATTRIBUTE)))
|
||||||
self._find_node_template_containing_attribute()
|
node_tpl = self._find_node_template_containing_attribute()
|
||||||
|
if len(self.args) > 2:
|
||||||
|
# Currently we only check the first level
|
||||||
|
attrs_def = node_tpl.type_definition.get_attributes_def()
|
||||||
|
attr_def = attrs_def[self.attribute_name]
|
||||||
|
if attr_def.schema['type'] == "list":
|
||||||
|
if not isinstance(self.args[2], int):
|
||||||
|
ExceptionCollector.appendException(
|
||||||
|
ValueError(_('Illegal arguments for function "{0}". '
|
||||||
|
'Third argument must be a positive'
|
||||||
|
' integer') .format(GET_ATTRIBUTE)))
|
||||||
|
elif attr_def.schema['type'] != "map":
|
||||||
|
ExceptionCollector.appendException(
|
||||||
|
ValueError(_('Illegal arguments for function "{0}". '
|
||||||
|
'Expected arguments: "node-template-name", '
|
||||||
|
'"attribute-name"').format(GET_ATTRIBUTE)))
|
||||||
|
|
||||||
def result(self):
|
def result(self):
|
||||||
return self
|
return self
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_0
|
||||||
|
|
||||||
|
description: Compute node type with a list attribute
|
||||||
|
|
||||||
|
node_types:
|
||||||
|
tosca.nodes.ComputeWithAttrList:
|
||||||
|
derived_from: tosca.nodes.Compute
|
||||||
|
attributes:
|
||||||
|
attr_list:
|
||||||
|
type: map
|
||||||
|
entry_schema:
|
||||||
|
type: string
|
||||||
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_0
|
||||||
|
|
||||||
|
description: >
|
||||||
|
TOSCA template for testing get_attribute with a list attribute and an index
|
||||||
|
|
||||||
|
imports:
|
||||||
|
- ../custom_types/compute_with_attribute_list.yaml
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
server:
|
||||||
|
type: tosca.nodes.ComputeWithAttrList
|
||||||
|
interfaces:
|
||||||
|
Standard:
|
||||||
|
configure:
|
||||||
|
implementation: configure.sh
|
||||||
|
inputs:
|
||||||
|
ip_address: { get_attribute: [ SELF, attr_list, 0 ] }
|
||||||
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_0
|
||||||
|
|
||||||
|
description: >
|
||||||
|
TOSCA template for testing get_attribute with a list attribute and an index
|
||||||
|
|
||||||
|
imports:
|
||||||
|
- ../custom_types/compute_with_attribute_list.yaml
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
server:
|
||||||
|
type: tosca.nodes.ComputeWithAttrList
|
||||||
|
interfaces:
|
||||||
|
Standard:
|
||||||
|
configure:
|
||||||
|
implementation: configure.sh
|
||||||
|
inputs:
|
||||||
|
ip_address: { get_attribute: [ SELF, private_address, 0 ] }
|
||||||
|
|
||||||
@@ -188,7 +188,7 @@ class GetAttributeTest(TestCase):
|
|||||||
self.assertIn(expected_msg, six.text_type(err))
|
self.assertIn(expected_msg, six.text_type(err))
|
||||||
err = self.assertRaises(ValueError,
|
err = self.assertRaises(ValueError,
|
||||||
functions.get_function, None, None,
|
functions.get_function, None, None,
|
||||||
{'get_attribute': ['x', 'y', 'z']})
|
{'get_attribute': ['x', 'y', 'z', 'k']})
|
||||||
self.assertIn(expected_msg, six.text_type(err))
|
self.assertIn(expected_msg, six.text_type(err))
|
||||||
|
|
||||||
def test_get_attribute_unknown_node_template_name(self):
|
def test_get_attribute_unknown_node_template_name(self):
|
||||||
@@ -243,3 +243,16 @@ class GetAttributeTest(TestCase):
|
|||||||
ValueError,
|
ValueError,
|
||||||
_('"get_attribute: [ HOST, ... ]" is not allowed in "outputs" '
|
_('"get_attribute: [ HOST, ... ]" is not allowed in "outputs" '
|
||||||
'section of the TOSCA template.'))
|
'section of the TOSCA template.'))
|
||||||
|
|
||||||
|
def test_get_attribute_with_index(self):
|
||||||
|
self._load_template(
|
||||||
|
'functions/test_get_attribute_with_index.yaml')
|
||||||
|
|
||||||
|
def test_get_attribute_with_index_error(self):
|
||||||
|
self.assertRaises(
|
||||||
|
exception.ValidationError, self._load_template,
|
||||||
|
'functions/test_get_attribute_with_index_error.yaml')
|
||||||
|
exception.ExceptionCollector.assertExceptionMessage(
|
||||||
|
ValueError,
|
||||||
|
_('Illegal arguments for function "get_attribute". '
|
||||||
|
'Expected arguments: "node-template-name", "attribute-name"'))
|
||||||
|
|||||||
Reference in New Issue
Block a user