xlab-si / xopera-opera

xOpera orchestrator compliant with TOSCA YAML v1.3 in the making
https://xlab-si.github.io/xopera-docs/
Apache License 2.0
35 stars 14 forks source link

Populate nodes with data from multiple nodes #255

Open lterrac opened 2 years ago

lterrac commented 2 years ago

Hi everyone,

I am modelling an OOP programming language and I want to populate a node with attributes taken from other nodes. I have a generic node class representing a class of the language. Every class has an attribute id which is assigned only when the class instance is created. The class has also has a property parameters to state the inputs passed to the class constructor and a requirement contractId to specify the dependency between classes

The node_types is:

class:
  ...
  requirements:
    contractId: ... -> based on DependsOn relationship
  attributes:
    id:
      type: string -> field populated after the node creation
  properties:
    parameters:
      type: list

The ServiceTemplate looks like the following:

classA:
  ... # Once the node is created an id value is stored in an attribute id

classB:
  ...

classC:
  requirements:
    - contractId: classA
    - contractId: classB

What I want to achieve is this translate in code:

A = contract()
B = contract()
C = contract(A.id, B.id)

The solution proposed in ServiceTemplate works fine if I have only one contractId requirement because I am able to retrieve the class id with { get_attribute: [SELF, contractId, id] } but it doesn't work with multiple requirements of the same type. Am I missing something in the TOSCA specification/xopera implementation or this kind of operation can not be achieved? 😄

lterrac commented 2 years ago

Sorry again, one last thought. This could be easily solved also if a way to merge lists exists. Then the problem can be modeled with a relationship where in the pos_configure_source (once the instance is created) the id is appended to an existing list. What I see (and understand) the current behaviour is that instead of doing an append() the lists are entirely replaced by the new value, am I right?

lauwers commented 2 years ago

In the Ubicity implementation, the get_attribute function automatically returns a list of values when multiple requirements exist of the same name.

lterrac commented 2 years ago

Ok, thank you. I will look into it next time. As a temporary solution I created a list attribute which is incrementally populated by the playbook attached to the relationships. If anyone needs more information let me know and I will share the solution.

anzoman commented 2 years ago

Hi @lterrac, thanks for opening this and nice that you found a temporary solution, for the future versions of opera we will also consider implementing the same behaviour as @lauwers has specified.