Fix bug #502 79/6379/1
authorAdam Israel <adam.israel@canonical.com>
Mon, 23 Jul 2018 19:39:57 +0000 (15:39 -0400)
committerAdam Israel <adam.israel@canonical.com>
Mon, 23 Jul 2018 19:39:57 +0000 (15:39 -0400)
This patch, in addition to change #6341 (Extend data-type to
initial-config-primitive), enables type casting of primitive parameters.
This enables primitives with non-string parameters from being executed.

Signed-off-by: Adam Israel <adam.israel@canonical.com>
n2vc/vnf.py
tests/test_primitive_non-string_parameter.py

index 1b9efa8..35bb215 100644 (file)
@@ -554,7 +554,50 @@ class N2VC:
             if parameter['value'] == "<rw_mgmt_ip>":
                 params[param] = str(values[parameter['value']])
             else:
-                params[param] = str(parameter['value'])
+                """
+                The Juju API uses strictly typed data-types, so we must make
+                sure the parameters from the VNFD match the appropriate type.
+
+                The honus will still be on the operator, to make sure the
+                data-type in the VNFD matches the one in the charm. N2VC will
+                raise N2VCPrimitiveExecutionFailed when there is a mismatch.
+
+                There are three data types supported by the YANG model:
+                # - STRING
+                # - INTEGER
+                # - BOOLEAN
+
+                Each parameter will look like this:
+                {
+                    'seq': '3',
+                    'name': 'testint',
+                    'parameter': [
+                        {
+                            'name': 'interval',
+                            'data-type': 'INTEGER',
+                            'value': 20
+                        }
+                    ]
+                }
+                """
+
+                if 'value' in parameter:
+                    # String is the default format
+                    val = str(parameter['value'])
+
+                    # If the data-type is explicitly set, cast to that type.
+                    if 'data-type' in parameter:
+                        dt = parameter['data-type'].upper()
+                        if dt == "INTEGER":
+                            val = int(val)
+
+                        elif dt == "BOOLEAN":
+                            if val in ['true', 'false', '0', '1']:
+                                val = True
+                            else:
+                                val = False
+
+                    params[param] = val
         return params
 
     def _get_config_from_yang(self, config_primitive, values):
index bae8379..9a2d5ad 100644 (file)
@@ -89,20 +89,25 @@ vnfd:vnfd-catalog:
                     name: config
                     parameter:
                     -   name: ssh-hostname
+                        data-type: STRING
                         value: <rw_mgmt_ip>
                     -   name: ssh-username
+                        data-type: STRING
                         value: ubuntu
                     -   name: ssh-password
+                        data-type: STRING
                         value: ubuntu
                 -   seq: '2'
                     name: touch
                     parameter:
                     -   name: filename
+                        data-type: STRING
                         value: '/home/ubuntu/first-touch-dataVM'
                 -   seq: '3'
                     name: testint
                     parameter:
                     -   name: interval
+                        data-type: INTEGER
                         value: 20
                 config-primitive:
                 -   name: touch