node requirements

When defining the nodes in a stack you may need to define requirements for the node. Requirements are used to define dependencies or relationships. For instance you may want to make the creation of a server to be dependent upon a firewall to be created. You define that depedency as a relationship.

To define relationships you first need to define the requirements: statement and then define the relationship after it.

Relationships

Defining relationships is done with 2 statements:

  • - nodetype: nodename
This statement defines the node type and node name (label) associated with the relationship.
  • relationship_type:
This statement defines the relationship type.

Three relationship types are supported:

  • “DependsOn” - for example, a server node depends on a firewall group node.
Example: relationship_type: tosca.relationships.DependsOn
  • “HostedOn” - for example, a web application node is hosted on a server node.
Example: relationship_type: tosca.relationships.HostedOn
  • “ConnectsTo” - for example, a application node connects to a database server node.
Example: relationship_type: tosca.relationships.ConnectsTo

Example 1

In the example below the Server wordpress_vm is dependent upon the firewall vm_firewall_rules.

#######################################################################################################################
# WordPress Application Server
#######################################################################################################################
  wordpress_vm:
    type: baseVM
    properties:
       ...
       ...
       ...
    requirements:                                          # This virtual machine node has a requirement on a firewall
      - firewall: vm_firewall_rules                        # The firewall statement is named "vm_firewall_rules"
        relationship_type: tosca.relationships.DependsOn

#######################################################################################################################
# Firewall
#######################################################################################################################
  vm_firewall_rules:
    type: dcm.nodes.FirewallGroup
    properties:
       ...
       ...
       ...

Attention

Make sure that the requirements: statement aligns with the type: and properties: statements or the requirements will be ignored!

Example 2

In the example below a server with a label name of linux_vm is being launched into a VPC network with a firewall with a label name of vm_firewall_rules. The firewall is dependent upon the VPC network vpc_network.

##################################################################################################################################################
# This node_template defines a virtual machine named "linux_vm"
##################################################################################################################################################
linux_vm:
  type: dcm.nodes.Server                                          # This is a Server node
  properties:
    name: "rhel_linux"
    ...
    ...
    ...

  requirements:                                                   # This virtual machine node has a requirement on a firewall
    - firewall: vm_firewall_rules                                 # The firewall statement is named "vm_firewall_rules"
      relationship_type: tosca.relationships.DependsOn

###################################################################################################################################################
# This node_template defines a firewall which opens the HTTP port 80 for the Web server
###################################################################################################################################################
vm_firewall_rules:
  type: dcm.nodes.FirewallGroup                                   # This is a firewall
  properties:                                                     # Retrieve the cloud properties from the "inputs"
    name: "fw-web-server"                                         # Define a name for the firewall (it will get prefixed with the stack name)
    ...
    ...
    ...

  requirements:
    - network: vpc_network
      relationship_type: tosca.relationships.DependsOn

###################################################################################################################################################
# This node_template defines a Virtual Private Cloud Network
###################################################################################################################################################
vpc_network:
  type: dcm.nodes.Network                                         # This is a Network Node
  properties:
    ###############################################################################################################################################
    # Retrieve networkId and subnetId information from the network_selector
    ###############################################################################################################################################
    networkId: { get_input: [network_selector, networkId] }       # Retrieve the network ID from the network_selector
    subnetId: { get_input: [network_selector, subnetId] }         # Retrieve the subnet ID from the network_selector
    ...
    ...
    ...

###################################################################################################################################################
# This node_template defines a Port
###################################################################################################################################################
port:
  type: dcm.nodes.Port                                            # This is a Port Node
  requirements:
    - link: vpc_network                                           # Link this port to the network with the name (label) of vpc_network
    - binding: linux_vm                                           # Bind this port to the server with the name (label) of linux_vm

Refer to Linux Apache with Network selector for a sample blueprint template which contains a Network selector.

Example 3

In the example below the Chef node chef_apache is hosted on the server node vm.

#######################################################################################################################
# Chef will install Apache Web Server
#######################################################################################################################
  chef_apache:
    type: dcm.nodes.Chef                  # This is a Chef node
    properties:
      chefServer: "ACME Chef"             # Name of the Chef Server Account defined to the Dell Cloud Manager Server
      environment: "_default"             # Chef environment
      roles: ['ACME-Webserver']           # Chef role which contains the cookbooks and recipes to install Apache
    requirements:
      - host: vm                                          # This requires (is "HostedOn") the Server defined in the template named vm below
        relationship_type: tosca.relationships.HostedOn   # This statement is not required as it is specified in base type and is inherited

#######################################################################################################################
# Server
#######################################################################################################################
  vm:
    type: dcm.nodes.Server                # This is a Server node
    properties:
       ...
       ...
       ...