How to define a ConnectsTo relationship between service catalogs?

This example shows how to define a relationship for nodecellar (a SOURCE node) to connect to mongodb (a TARGET node) as in Figure 1.

  • We will define capabilities on the mongodb node containing all information for nodecellar node to setup a connection.
  • We will define the relationship interfaces to setup the connection.

A topology with nodecellar connects to mongodb on a compute node

Figure 1

Step 1. Define an endpoint capability in the TARGET node (mongodb)

An endpoint capability contains information of a TARGET node for a SOURCE node to setup the connection.

In the mongodb component, we define the following capabilities block:

node_types:
otc.nodes.SoftwareComponent.MongoDB:
...
capabilities:
mongo_db:
type: tosca.capabilities.Endpoint.Database

In this example, we defined a new capability mongo_db from the TOSCA type tosca.capabilities.Endpoint.Database. The capability mongo_db will inherit all default properties from the TOSCA type (e.g., port, protocol, url_path) and show in the editor as in Figure 2.

In the editor, users can specifiy values for the capability mongo_db. For example, they may set the portto 27017.

Figure 2

tip
  • The tosca.capabilities.Endpoint also has a runtime attribute ip_address (not shown in the Figure). The orchestrator will automatically set the IP address of the hosted compute node to this attribute. A SOURCE node can use this runtime attribute to setup a connection.

Step 2. Define a requirement in the SOURCE node (nodecellar)

In the nodecellar node, add the following requirements block:

node_types:
otc.nodes.WebApplication.Nodecellar:
derived_from: tosca.nodes.WebApplication
...
requirements:
- mongo_db:
# nodecellar requires a node that has the capability Endpoint.Database
capability: tosca.capabilities.Endpoint.Database
# nodecellar uses this relationship to setup the connection (see step 3)
relationship: otc.relationships.NodejsConnectToMongo
# (Optional) specifiy relationship instance one-to-one
# it means, one nodecellar has one mongodb
occurrences: [1, 1]

Step 3: Define the relationship

Define a new relationship otc.relationships.NodejsConnectToMongo, how nodecellar setups the connection with mongodb:

relationship_types:
otc.relationships.NodejsConnectToMongo:
derived_from: tosca.relationships.ConnectsTo
interfaces:
Configure:
pre_configure_source:
inputs:
# The input DB_IP gets the runtime attribute ip_address of mongodb
DB_IP: { get_attribute: [TARGET, mongo_db, ip_address] }
# The input DB_PORT gets the mongodb port property
DB_PORT: { get_property: [TARGET, port] }
# The input NODECELLAR_PORT gets the nodecellar port property
NODECELLAR_PORT: {get_property: [SOURCE, port]}
implementation: scripts/set-mongo-url.sh

In the above example, we defined the interface pre_configure_source by providing a shell script (e.g., set-mongo-url.sh). The script uses the input parameters DB_IP, DB_PORT, NODECELLAR_PORT to configure nodecellar to connect to mongodb.

note
  • Use the function get_property to get a SOURCE or TARGET node property.
  • Use the function get_attribute to get a runtime attribute of a SOURCE or TARGET node (e.g., ip_address).

Relationship interfaces:

In addition to the interface pre_configure_source, we have the following interfaces:

Interfaces executed on the TARGET node:

  • pre_configure_target: executes after the TARGET node is created.
  • post_configure_target: executes after the TARGET node is configured.
  • add_source: executes on TARGET node, notifying that the SOURCE node is up and running.

Interfaces executed on the SOURCE node:

  • pre_configure_source executes after the SOURCE node is created.
  • post_configure_source: executes after the SOURCE node is configured.
  • add_target: executes after the SOURCE node is started.
  • remove_target: executes after the TARGET node is removed.
note
  • The TARGET node is always up and running first before the SOURCE node.
  • All runtime attributes of the SOURCE node are not available until it is up and running (i.e., they are available in the add_source interface). Therefore, to configure the TARGET node with any runtime attributes of the SOURCE node, you can use the add_source interface.

Full example