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 Templateimport toscaparser.functionsfrom toscaparser.tosca_template import ToscaTemplate
tosca = ToscaTemplate(sys.argv[1])
for nodetemplate in tosca.nodetemplates: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.zipNo handlers could be found for logger "tosca.model"
Processing node template wordpressnetwork_name: PRIVATEinitiator: sourceprotocol: tcpsecure: False
Processing node template webservernetwork_name: PRIVATEinitiator: sourceprotocol: tcpsecure: Falsesecure: True
Processing node template mysql_dbms
Processing node template mysql_database
Processing node template serversecure: Truemin_instances: 1max_instances: 1mem_size: 4096 MBnum_cpus: Nonedisk_size: 10 GBdistribution: Fedoraversion: 18.0type: Linuxarchitecture: 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