Add output validation test case for substitution. 53/25653/2
authorshangxdy <shang.xiaodong@zte.com.cn>
Thu, 8 Dec 2016 03:42:45 +0000 (11:42 +0800)
committershangxdy <shang.xiaodong@zte.com.cn>
Fri, 9 Dec 2016 15:40:43 +0000 (23:40 +0800)
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 <shang.xiaodong@zte.com.cn>
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/databasesubsystem.yaml
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/queuingsubsystem.yaml
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/system.yaml
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/transactionsubsystem.yaml
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/queuingsubsystem_invalid_input.yaml
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_missing_output.yaml [new file with mode: 0644]
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/system_invalid_unknown_output.yaml [new file with mode: 0644]
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_missing_output.yaml [new file with mode: 0644]
tosca2heat/tosca-parser/toscaparser/tests/data/topology_template/validate/transactionsubsystem_invalid_unknown_output.yaml [new file with mode: 0644]
tosca2heat/tosca-parser/toscaparser/tests/test_topology_template.py

index 6990679..b6e9c42 100644 (file)
@@ -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 ]
index 8c4cc76..578aa4a 100644 (file)
@@ -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 ]
index 00fb486..f4e10ae 100644 (file)
@@ -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:
index 7b839d7..42e100a 100644 (file)
@@ -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 ]
index c54c12c..67ef341 100644 (file)
@@ -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 (file)
index 0000000..2028c38
--- /dev/null
@@ -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 (file)
index 0000000..de16ca2
--- /dev/null
@@ -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 (file)
index 0000000..c92e5f8
--- /dev/null
@@ -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 (file)
index 0000000..ffca24b
--- /dev/null
@@ -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 }
index eb8d589..0c26b67 100644 (file)
@@ -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)