[tosca-parser] Failing to get functions from capabilities

Bob Haddleton bobh at haddleton.net
Tue Dec 18 01:55:06 UTC 2018


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 at 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 at 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 at 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 at 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
>>>>>> 
>>>> 
>> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-discuss/attachments/20181217/e539a679/attachment.html>


More information about the openstack-discuss mailing list