From 7f2bbc7c5913a39d49fdc6533c708939b47a9233 Mon Sep 17 00:00:00 2001 From: shangxdy Date: Thu, 8 Dec 2016 11:42:45 +0800 Subject: Add output validation test case for substitution. According to currently implementation, add new test case for substitution mappings output validation: 1. Unknown output; 2. Missing required output. JIRA:PARSER-116 Change-Id: I84dc80c2bc6fd8b63dd7c4ddf0b81dc5148a4ceb Signed-off-by: shangxdy --- .../data/topology_template/databasesubsystem.yaml | 9 --- .../data/topology_template/queuingsubsystem.yaml | 9 --- .../tests/data/topology_template/system.yaml | 6 -- .../topology_template/transactionsubsystem.yaml | 6 -- .../validate/queuingsubsystem_invalid_input.yaml | 3 - .../validate/system_invalid_missing_output.yaml | 24 ++++++ .../validate/system_invalid_unknown_output.yaml | 24 ++++++ ...ransactionsubsystem_invalid_missing_output.yaml | 92 +++++++++++++++++++++ ...ransactionsubsystem_invalid_unknown_output.yaml | 94 ++++++++++++++++++++++ .../toscaparser/tests/test_topology_template.py | 49 +++++++++++ 10 files changed, 283 insertions(+), 33 deletions(-) create mode 100644 tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_missing_output.yaml create mode 100644 tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_unknown_output.yaml create mode 100644 tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_missing_output.yaml create mode 100644 tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_unknown_output.yaml diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/databasesubsystem.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/databasesubsystem.yaml index 6990679..b6e9c42 100644 --- a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/databasesubsystem.yaml +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/databasesubsystem.yaml @@ -75,15 +75,6 @@ topology_template: distribution: Ubuntu version: 14.04 -# outputs: -# receiver_ip: -# description: private IP address of the database application -# value: { get_attribute: [ server, private_address ] } -# It seems current _process_intrisic_function can not handle more than 2 arguments, save it for later -# receiver_port: -# description: Port of the message receiver endpoint -# value: { get_attribute: [ app, data_endpoint, port_name ] } - groups: dbserver_group: members: [ dbms, server ] diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/queuingsubsystem.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/queuingsubsystem.yaml index 8c4cc76..578aa4a 100644 --- a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/queuingsubsystem.yaml +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/queuingsubsystem.yaml @@ -61,10 +61,6 @@ topology_template: version: 14.04 outputs: -# receiver_ip: -# description: private IP address of the message receiver application -# value: { get_attribute: [ server, private_address ] } - server_ip: description: server_ip of the message receiver application value: { get_input: server_ip } @@ -73,11 +69,6 @@ topology_template: description: server_port of the message receiver application value: { get_input: server_port } -# It seems current _process_intrisic_function can not handle more than 2 arguments, save it for later -# receiver_port: -# description: Port of the message receiver endpoint -# value: { get_attribute: [ app, data_endpoint, port_name ] } - groups: tran_server_group: members: [ tran_app, server ] diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/system.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/system.yaml index 00fb486..f4e10ae 100644 --- a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/system.yaml +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/system.yaml @@ -21,8 +21,6 @@ topology_template: node_templates: mq: type: example.QueuingSubsystem - # properties: - # to be updated when substitution_mapping is validated later properties: server_ip: { get_input: mq_server_ip } server_port: { get_input: mq_server_port } @@ -36,9 +34,7 @@ topology_template: trans1: type: example.TransactionSubsystem properties: - # mq_server_ip: 127.0.0.1 mq_server_ip: { get_attribute: [ mq, server_ip ] } - # receiver_port: 8080 receiver_port: { get_attribute: [ mq, server_port ] } # capabilities: # message_receiver: @@ -49,9 +45,7 @@ topology_template: trans2: type: example.TransactionSubsystem properties: - # mq_server_ip: 127.0.0.1 mq_server_ip: { get_attribute: [ mq, server_ip ] } - # receiver_port: 8080 receiver_port: { get_attribute: [ mq, server_port ] } # capabilities: # message_receiver: diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/transactionsubsystem.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/transactionsubsystem.yaml index 7b839d7..42e100a 100644 --- a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/transactionsubsystem.yaml +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/transactionsubsystem.yaml @@ -82,12 +82,6 @@ topology_template: description: receiver_port of the message receiver application value: { get_input: receiver_port } - -# It seems current _process_intrisic_function can not handle more than 2 arguments, save it for later -# receiver_port: -# description: Port of the message receiver endpoint -# value: { get_attribute: [ app, data_endpoint, port_name ] } - groups: webserver_group: members: [ websrv, server ] diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/queuingsubsystem_invalid_input.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/queuingsubsystem_invalid_input.yaml index c54c12c..67ef341 100644 --- a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/queuingsubsystem_invalid_input.yaml +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/queuingsubsystem_invalid_input.yaml @@ -39,9 +39,6 @@ topology_template: substitution_mappings: node_type: example.QueuingSubsystem - requirements: - receiver1: [ tran_app, receiver1 ] - receiver2: [ tran_app, receiver2 ] node_templates: tran_app: diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_missing_output.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_missing_output.yaml new file mode 100644 index 0000000..2028c38 --- /dev/null +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_missing_output.yaml @@ -0,0 +1,24 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - transactionsubsystem_invalid_missing_output.yaml + +topology_template: + description: Test template with invalid missing output. + + inputs: + mq_server_ip: + type: string + default: 127.0.0.1 + description: IP address of the message queuing server to receive messages from. + mq_server_port: + type: integer + default: 8080 + description: Port to be used for receiving messages. + + node_templates: + trans: + type: example.TransactionSubsystem + properties: + mq_server_ip: { get_input: mq_server_ip } + receiver_port: { get_input: mq_server_port } diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_unknown_output.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_unknown_output.yaml new file mode 100644 index 0000000..de16ca2 --- /dev/null +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_unknown_output.yaml @@ -0,0 +1,24 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - transactionsubsystem_invalid_unknown_output.yaml + +topology_template: + description: Test template with invalid unknown output. + + inputs: + mq_server_ip: + type: string + default: 127.0.0.1 + description: IP address of the message queuing server to receive messages from. + mq_server_port: + type: integer + default: 8080 + description: Port to be used for receiving messages. + + node_templates: + trans: + type: example.TransactionSubsystem + properties: + mq_server_ip: { get_input: mq_server_ip } + receiver_port: { get_input: mq_server_port } diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_missing_output.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_missing_output.yaml new file mode 100644 index 0000000..c92e5f8 --- /dev/null +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_missing_output.yaml @@ -0,0 +1,92 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: > + This template is a test template which contains invalid output + needed for substitution mappings. + The outputs defined by the topology template have to match the + attributes of the node type or the substituted node template, + and the observable attributes of the substituted node template + have to be defined as attributes of the node type or outputs in + the topology template. + But this template misses output of receiver_port which is not + defined in node type of example.TransactionSubsystem, so it will + be validated error for substitution mappings. + +imports: + - ../definitions.yaml + +topology_template: + description: Template of a database including its hosting stack. + + inputs: + mq_server_ip: + type: string + description: IP address of the message queuing server to receive messages from. + default: 127.0.0.1 + receiver_port: + type: integer + description: Port to be used for receiving messages. + default: 8080 + my_cpus: + type: integer + description: Number of CPUs for the server. + default: 2 + constraints: + - valid_values: [ 1, 2, 4, 8 ] + + substitution_mappings: + node_type: example.TransactionSubsystem + capabilities: + message_receiver: [ app, message_receiver ] + requirements: + database_endpoint: [ app, database ] + + node_templates: + app: + type: example.SomeApp + properties: + admin_user: foo + pool_size: 10 + capabilities: + message_receiver: + properties: + server_ip: { get_input: mq_server_ip } + requirements: + - host: + node: websrv + + websrv: + type: tosca.nodes.WebServer + capabilities: + data_endpoint: + properties: + port_name: { get_input: receiver_port } + requirements: + - host: + node: server + + server: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: my_cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Ubuntu + version: 14.04 + + outputs: + receiver_ip: + description: private IP address of the message receiver application + value: { get_attribute: [ server, private_address ] } + + # This output is invalid if comment receiver_out out only for + # substituion mappings +# receiver_port: +# description: receiver_port of the message receiver application +# value: { get_input: receiver_port } diff --git a/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_unknown_output.yaml b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_unknown_output.yaml new file mode 100644 index 0000000..ffca24b --- /dev/null +++ b/tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_unknown_output.yaml @@ -0,0 +1,94 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: > + This template is a test template which contains invalid output + needed for substitution mappings. + The outputs defined by the topology template have to match the + attributes of the node type or the substituted node template, + and the observable attributes of the substituted node template + have to be defined as attributes of the node type or outputs in + the topology template. + But this template contains output of my_cpu_output which is not + defined in node type of example.TransactionSubsystem, so it will + be validated error for substitution mappings. + +imports: + - ../definitions.yaml + +topology_template: + description: Template of a database including its hosting stack. + + inputs: + mq_server_ip: + type: string + description: IP address of the message queuing server to receive messages from. + default: 127.0.0.1 + receiver_port: + type: integer + description: Port to be used for receiving messages. + default: 8080 + my_cpus: + type: integer + description: Number of CPUs for the server. + default: 2 + constraints: + - valid_values: [ 1, 2, 4, 8 ] + + substitution_mappings: + node_type: example.TransactionSubsystem + capabilities: + message_receiver: [ app, message_receiver ] + requirements: + database_endpoint: [ app, database ] + + node_templates: + app: + type: example.SomeApp + properties: + admin_user: foo + pool_size: 10 + capabilities: + message_receiver: + properties: + server_ip: { get_input: mq_server_ip } + requirements: + - host: + node: websrv + + websrv: + type: tosca.nodes.WebServer + capabilities: + data_endpoint: + properties: + port_name: { get_input: receiver_port } + requirements: + - host: + node: server + + server: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: my_cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Ubuntu + version: 14.04 + + outputs: + receiver_ip: + description: private IP address of the message receiver application + value: { get_attribute: [ server, private_address ] } + + receiver_port: + description: receiver_port of the message receiver application + value: { get_input: receiver_port } + + my_cpu_output: + description: this output is only invalid for substitution mappings + value: { get_input: my_cpus } diff --git a/tosca2heat/tosca-parser/toscaparser/tests/test_topology_template.py b/tosca2heat/tosca-parser/toscaparser/tests/test_topology_template.py index eb8d589..0c26b67 100644 --- a/tosca2heat/tosca-parser/toscaparser/tests/test_topology_template.py +++ b/tosca2heat/tosca-parser/toscaparser/tests/test_topology_template.py @@ -262,3 +262,52 @@ class TopologyTemplateTest(TestCase): lambda: ToscaTemplate(tpl_path1)) exception.ExceptionCollector.assertExceptionMessage( exception.MissingRequiredInputError, errormsg) + + def test_system_with_unknown_output_validation(self): + tpl_path0 = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "data/topology_template/validate/" + "system_invalid_unknown_output.yaml") + tpl_path1 = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "data/topology_template/validate/" + "transactionsubsystem_invalid_unknown_output.yaml") + errormsg = _('Unknown output "my_cpu_output" in SubstitutionMappings ' + 'with node_type example.TransactionSubsystem.') + + # It's invalid in nested template. + self.assertRaises(exception.ValidationError, + lambda: ToscaTemplate(tpl_path0)) + exception.ExceptionCollector.assertExceptionMessage( + exception.UnknownOutputError, errormsg) + + # Subtemplate deploy standaolone is invalid. + self.assertRaises(exception.ValidationError, + lambda: ToscaTemplate(tpl_path1)) + exception.ExceptionCollector.assertExceptionMessage( + exception.UnknownOutputError, errormsg) + + def test_system_with_missing_output_validation(self): + tpl_path0 = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "data/topology_template/validate/" + "system_invalid_missing_output.yaml") + tpl_path1 = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "data/topology_template/validate/" + "transactionsubsystem_invalid_missing_output.yaml") + errormsg = _('SubstitutionMappings with node_type ' + 'example.TransactionSubsystem is missing ' + 'required output definition of output "receiver_port".') + + # It's invalid in nested template. + self.assertRaises(exception.ValidationError, + lambda: ToscaTemplate(tpl_path0)) + exception.ExceptionCollector.assertExceptionMessage( + exception.MissingRequiredOutputError, errormsg) + + # Subtemplate deploy standaolone is invalid. + self.assertRaises(exception.ValidationError, + lambda: ToscaTemplate(tpl_path1)) + exception.ExceptionCollector.assertExceptionMessage( + exception.MissingRequiredOutputError, errormsg) -- cgit 1.2.3-korg