[tosca-parser] Failing to get functions from capabilities
Bob Haddleton
bobh at haddleton.net
Tue Dec 18 01:20:16 UTC 2018
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
> <mailto: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 <http://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
>> <mailto: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
>>> <http://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 <http://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/696661b5/attachment.html>
More information about the openstack-discuss
mailing list