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_t...
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