Can you open a bug and I’ll run it by a couple of people to make sure it doesn’t break anything?  I think it makes sense to leave the function in place if there are no parameters provided.

Thanks

Bob

On Dec 17, 2018, at 19:46, Michael Still <mikal@stillhq.com> wrote:

Yeah, fair enough.

What leads me here is I am writing a converter from CSAR to Cloudify blueprints (which is similar to the CSAR to Heat converter which already exists). Cloudify blueprints are another TOSCA dialect, so I want to leave the get_input line preserved and let Cloudify sort that out when it executes the blueprint.

Thanks,
Michael


On Tue, Dec 18, 2018 at 12:20 PM Bob Haddleton <bobh@haddleton.net> wrote:
I see what you mean.  It appears to be intentional, since there is code here [1] that explicitly replaces the GetInput function with the value of the passed parameter.

At a minimum it might make sense to only replace the function with the parameter value if the parameter is not None.

I don't there is a way to provide input values to the ToscaTemplate object after it has been created, so I don't know how any "future" input values would be handled.

Is there a specific scenario you want to support that requires this?

Thanks

Bob


[1] - https://github.com/openstack/tosca-parser/blob/master/toscaparser/topology_template.py#L282
On 12/17/18 4:45 PM, Michael Still wrote:
In my mind (and I might be wrong), the inconsistency is that for properties, interfaces and outputs if the value parsed is a reference to something else I get a function which will resolve the value if I ask it nicely. However for capabilities, I instead get None unless I have passed in parsed parameters. This is despite the functions code supporting get_input.

The issue with parsed parameters is I now need to run the parser twice -- the first run to detect what the inputs are, and then the second to provide values for those so that the substitution occurs. That seems like a confusing user interface to me.

Michael


On Tue, Dec 18, 2018 at 9:35 AM Bob Haddleton <bobh@haddleton.net> wrote:
I'm not sure where the inconsistency is?  Can you elaborate?

You can get the inputs from the tosca.inputs attribute without passing any input parameters:

tosca = ToscaTemplate(sys.argv[1])

print([input.name for input in tosca.inputs])

['cpus', 'db_name', 'db_user', 'db_pwd', 'db_root_pwd', 'db_port']


Bob

On 12/17/18 1:22 PM, Michael Still wrote:
Thanks for that.

That approach seems fair enough, but inconsistent with how other things are represented as functions. How am I meant to know what the inputs to the CSAR are before the CSAR is parsed?

Michael



On Tue, Dec 18, 2018 at 1:28 AM Bob Haddleton <bobh@haddleton.net> wrote:
Hi Michael:

tosca-parser expects that the input values will be defined already and passed to the ToscaTemplate object in the parsed_params argument.

If you change:

tosca = ToscaTemplate(sys.argv[1])

to:

tosca = ToscaTemplate(sys.argv[1], parsed_params={'cpus': 4})

the output becomes:

Processing node template server
  disk_size: 10 GB
  num_cpus: 4
  mem_size: 4096 MB
  architecture: x86_64
  type: Linux
  distribution: Fedora
  version: 18.0
  min_instances: 1
  max_instances: 1
  secure: True


Hope this helps.

Bob


On 12/17/18 3:25 AM, Michael Still wrote:
Hi,

I'm trying to use tosca-parser to parse CSAR files. Its working quite well, until I hit a wall with capabilities today. Specifically I am testing with the single instance wordpress example CSAR, which uses a get_input for the num_cpus argument for host capabilities for the server.

Based on how properties work, I would expect to get a function back for anything which requires referencing another value, but in the case of capabilities I either get the hardcoded value (strings, ints etc), or a None for values which would be functions if we were talking about prototypes.

Here's a snippet of example code:

#!/usr/bin/python

import sys

from jinja2 import Template
import toscaparser.functions
from toscaparser.tosca_template import ToscaTemplate

tosca = ToscaTemplate(sys.argv[1])

for nodetemplate in tosca.nodetemplates:
    print
    print('Processing node template %s'% nodetemplate.name)

    capabilities = nodetemplate.get_capabilities_objects()
    for cap in capabilities:
        propobjs = cap.get_properties_objects()
        if not propobjs:
            continue

        for po in propobjs:
            print('  %s: %s' %(po.name, po.value))

Which returns this:

$ python _capabilities.py csar_wordpress.zip 
No handlers could be found for logger "tosca.model"

Processing node template wordpress
  network_name: PRIVATE
  initiator: source
  protocol: tcp
  secure: False

Processing node template webserver
  network_name: PRIVATE
  initiator: source
  protocol: tcp
  secure: False
  secure: True

Processing node template mysql_dbms

Processing node template mysql_database

Processing node template server
  secure: True
  min_instances: 1
  max_instances: 1
  mem_size: 4096 MB
  num_cpus: None
  disk_size: 10 GB
  distribution: Fedora
  version: 18.0
  type: Linux
  architecture: x86_64

I would expect num_cpus for the "server" node_template to be a GetInput() function based on its definition in the CSAR, but instead I get None.

Is there an example somewhere of how to correctly access functions for capabilities?

Thanks,
Michael