Type Definitions

The following TOSCA types are available to all service templates.

TOSCA 1.3

#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

tosca_definitions_version: tosca_simple_yaml_1_3

description: >
  The content of this file reflects TOSCA Simple Profile in YAML version
  1.3. It describes the definition for TOSCA types including Node Type,
  Relationship Type, Capability Type and Interfaces.

##########################################################################
# Node Type.
# A Node Type is a reusable entity that defines the type of one or more
# Node Templates.
##########################################################################
node_types:
  tosca.nodes.Root:
    description: >
      The TOSCA root node all other TOSCA base node types derive from.
    attributes:
      tosca_id:
        type: string
      tosca_name:
        type: string
      state:
        type: string
    capabilities:
      feature:
        type: tosca.capabilities.Node
    requirements:
      - dependency:
          capability: tosca.capabilities.Node
          node: tosca.nodes.Root
          relationship: tosca.relationships.DependsOn
          occurrences: [0, UNBOUNDED]
    interfaces:
      Standard:
        type: tosca.interfaces.node.lifecycle.Standard

  tosca.nodes.Abstract.Storage:
    derived_from: tosca.nodes.Root
    properties:
      name:
        type: string
      size:
        type: scalar-unit.size
        default: 0 MB
        constraints:
          - greater_or_equal: 0 MB

  tosca.nodes.Storage.BlockStorage:
    derived_from: tosca.nodes.Abstract.Storage
    properties:
      volume_id:
        type: string
        required: false
      snapshot_id:
        type: string
        required: false
    attributes:
      volume_id:
        type: string
    capabilities:
      attachment:
        type: tosca.capabilities.Attachment

  # for backwards compatibility:
  tosca.nodes.BlockStorage:
    derived_from: tosca.nodes.Storage.BlockStorage
    properties:
      name:
        type: string
        default: ""

  tosca.nodes.Storage.ObjectStorage:
    derived_from: tosca.nodes.Abstract.Storage
    properties:
      maxsize:
        type: scalar-unit.size
        constraints:
          - greater_or_equal: 0 GB
    capabilities:
      storage_endpoint:
        type: tosca.capabilities.Endpoint

  tosca.nodes.Abstract.Compute:
    derived_from: tosca.nodes.Root
    capabilities:
      host:
        type: tosca.capabilities.Compute
        valid_source_types: []

  tosca.nodes.Compute:
    derived_from: tosca.nodes.Abstract.Compute
    attributes:
      private_address:
        type: string
      public_address:
        type: string
      networks:
        type: map
        entry_schema:
          type: tosca.datatypes.network.NetworkInfo
      ports:
        type: map
        entry_schema:
          type: tosca.datatypes.network.PortInfo
    capabilities:
      host:
        type: tosca.capabilities.Compute
        valid_source_types: [tosca.nodes.SoftwareComponent]
      binding:
        type: tosca.capabilities.network.Bindable
      os:
        type: tosca.capabilities.OperatingSystem
      scalable:
        type: tosca.capabilities.Scalable
      endpoint:
        type: tosca.capabilities.Endpoint.Admin
    requirements:
      - local_storage:
          capability: tosca.capabilities.Attachment
          node: tosca.nodes.storage.BlockStorage
          relationship: tosca.relationships.AttachesTo
          occurrences: [0, UNBOUNDED]

  tosca.nodes.SoftwareComponent:
    derived_from: tosca.nodes.Root
    properties:
      # domain-specific software component version
      component_version:
        type: version
        required: false
        description: >
          Software component version.
      admin_credential:
        type: tosca.datatypes.Credential
        required: false
    requirements:
      - host:
          capability: tosca.capabilities.Compute
          node: tosca.nodes.Compute
          relationship: tosca.relationships.HostedOn
          occurrences: [0, UNBOUNDED] # make optional

  tosca.nodes.DBMS:
    derived_from: tosca.nodes.SoftwareComponent
    properties:
      port:
        required: false
        type: integer
        description: >
          The port the DBMS service will listen to for data and requests.
      root_password:
        required: false
        type: string
        description: >
          The root password for the DBMS service.
    capabilities:
      host:
        type: tosca.capabilities.Compute
        valid_source_types: [tosca.nodes.Database]

  tosca.nodes.Database:
    derived_from: tosca.nodes.Root
    properties:
      user:
        required: false
        type: string
        description: >
          User account name for DB administration
      port:
        required: false
        type: integer
        description: >
          The port the database service will use to listen for incoming data and
          requests.
      name:
        required: false
        type: string
        description: >
          The name of the database.
      password:
        required: false
        type: string
        description: >
          The password for the DB user account
    requirements:
      - host:
          capability: tosca.capabilities.Compute
          node: tosca.nodes.DBMS
          relationship: tosca.relationships.HostedOn
    capabilities:
      database_endpoint:
        type: tosca.capabilities.Endpoint.Database

  tosca.nodes.WebServer:
    derived_from: tosca.nodes.SoftwareComponent
    capabilities:
      data_endpoint:
        type: tosca.capabilities.Endpoint
      admin_endpoint:
        type: tosca.capabilities.Endpoint.Admin
      host:
        type: tosca.capabilities.Compute
        valid_source_types: [tosca.nodes.WebApplication]

  tosca.nodes.WebApplication:
    derived_from: tosca.nodes.Root
    properties:
      context_root:
        type: string
        required: false
    requirements:
      - host:
          capability: tosca.capabilities.Compute
          node: tosca.nodes.WebServer
          relationship: tosca.relationships.HostedOn
    capabilities:
      app_endpoint:
        type: tosca.capabilities.Endpoint

  tosca.nodes.network.Network:
    derived_from: tosca.nodes.Root
    description: >
      The TOSCA Network node represents a simple, logical network service.
    properties:
      ip_version:
        type: integer
        required: false
        default: 4
        constraints:
          - valid_values: [4, 6]
        description: >
          The IP version of the requested network. Valid values are 4 for ipv4
          or 6 for ipv6.
      cidr:
        type: string
        required: false
        description: >
          The cidr block of the requested network.
      start_ip:
        type: string
        required: false
        description: >
          The IP address to be used as the start of a pool of addresses within
          the full IP range derived from the cidr block.
      end_ip:
        type: string
        required: false
        description: >
          The IP address to be used as the end of a pool of addresses within
          the full IP range derived from the cidr block.
      gateway_ip:
        type: string
        required: false
        description: >
          The gateway IP address.
      network_name:
        type: string
        required: false
        description: >
          An identifier that represents an existing Network instance in the
          underlying cloud infrastructure or can be used as the name of the
          newly created network. If network_name is provided and no other
          properties are provided (with exception of network_id), then an
          existing network instance will be used. If network_name is provided
          alongside with more properties then a new network with this name will
          be created.
      network_id:
        type: string
        required: false
        description: >
          An identifier that represents an existing Network instance in the
          underlying cloud infrastructure. This property is mutually exclusive
          with all other properties except network_name. This can be used alone
          or together with network_name to identify an existing network.
      segmentation_id:
        type: string
        required: false
        description: >
          A segmentation identifier in the underlying cloud infrastructure.
          E.g. VLAN ID, GRE tunnel ID, etc..
      network_type:
        type: string
        required: false
        description: >
          It specifies the nature of the physical network in the underlying
          cloud infrastructure. Examples are flat, vlan, gre or vxlan.
          For flat and vlan types, physical_network should be provided too.
      physical_network:
        type: string
        required: false
        description: >
          It identifies the physical network on top of which the network is
          implemented, e.g. physnet1. This property is required if network_type
          is flat or vlan.
      dhcp_enabled:
        type: boolean
        required: false
        default: true
        description: >
          Indicates should DHCP service be enabled on the network or not.
    capabilities:
      link:
        type: tosca.capabilities.network.Linkable

  tosca.nodes.network.Port:
    derived_from: tosca.nodes.Root
    description: >
      The TOSCA Port node represents a logical entity that associates between
      Compute and Network normative types. The Port node type effectively
      represents a single virtual NIC on the Compute node instance.
    properties:
      ip_address:
        type: string
        required: false
        description: >
          Allow the user to set a static IP.
      order:
        type: integer
        required: false
        default: 0
        constraints:
          - greater_or_equal: 0
        description: >
          The order of the NIC on the compute instance (e.g. eth2).
      is_default:
        type: boolean
        required: false
        default: false
        description: >
          If is_default=true this port will be used for the default gateway
          route. Only one port that is associated to single compute node can
          set as is_default=true.
      ip_range_start:
        type: string
        required: false
        description: >
          Defines the starting IP of a range to be allocated for the compute
          instances that are associated with this Port.
      ip_range_end:
        type: string
        required: false
        description: >
          Defines the ending IP of a range to be allocated for the compute
          instances that are associated with this Port.
    attributes:
      ip_address:
        type: string
    requirements:
      - binding:
          description: >
            Binding requirement expresses the relationship between Port and
            Compute nodes. Effectively it indicates that the Port will be
            attached to specific Compute node instance
          capability: tosca.capabilities.network.Bindable
          relationship: tosca.relationships.network.BindsTo
          node: tosca.nodes.Compute
      - link:
          description: >
            Link requirement expresses the relationship between Port and Network
            nodes. It indicates which network this port will connect to.
          capability: tosca.capabilities.network.Linkable
          relationship: tosca.relationships.network.LinksTo
          node: tosca.nodes.network.Network

  tosca.nodes.network.FloatingIP:
    derived_from: tosca.nodes.Root
    description: >
      The TOSCA FloatingIP node represents a floating IP that can associate to a Port.
    properties:
      floating_network:
        type: string
        required: true
      floating_ip_address:
        type: string
        required: false
      port_id:
        type: string
        required: false
    requirements:
      - link:
          capability: tosca.capabilities.network.Linkable
          relationship: tosca.relationships.network.LinksTo
          node: tosca.nodes.network.Port

  tosca.nodes.ObjectStorage:
    derived_from: tosca.nodes.Root
    description: >
      The TOSCA ObjectStorage node represents storage that provides the ability
      to store data as objects (or BLOBs of data) without consideration for the
      underlying filesystem or devices
    properties:
      name:
        type: string
        required: true
        description: >
          The logical name of the object store (or container).
      size:
        type: scalar-unit.size
        required: false
        constraints:
          - greater_or_equal: 0 GB
        description: >
          The requested initial storage size.
      maxsize:
        type: scalar-unit.size
        required: false
        constraints:
          - greater_or_equal: 0 GB
        description: >
          The requested maximum storage size.
    capabilities:
      storage_endpoint:
        type: tosca.capabilities.Endpoint

  tosca.nodes.LoadBalancer:
    derived_from: tosca.nodes.Root
    properties:
      algorithm:
        type: string
        required: false
        status: experimental
    capabilities:
      client:
        type: tosca.capabilities.Endpoint.Public
        occurrences: [0, UNBOUNDED]
        description: the Floating (IP) client’s on the public network can connect to
    requirements:
      - application:
          capability: tosca.capabilities.Endpoint
          relationship: tosca.relationships.RoutesTo
          occurrences: [0, UNBOUNDED]
          description: Connection to one or more load balanced applications

  tosca.nodes.Container.Runtime:
    derived_from: tosca.nodes.SoftwareComponent
    capabilities:
      host:
        type: tosca.capabilities.Container
        valid_source_types: [tosca.nodes.Container.Application]
      scalable:
        type: tosca.capabilities.Scalable

  tosca.nodes.Container.Application:
    derived_from: tosca.nodes.Root
    requirements:
      - host:
          capability: tosca.capabilities.Container
          node: tosca.nodes.Container.Runtime
          relationship: tosca.relationships.HostedOn
      - storage:
          capability: tosca.capabilities.Storage
      - network:
          capability: tosca.capabilities.Endpoint

  # note: missing from 1.3 spec
  tosca.nodes.Container.Runtime.Docker:
    derived_from: tosca.nodes.Container.Runtime
    capabilities:
      host:
        type: tosca.capabilities.Container.Docker
        valid_source_types: [tosca.nodes.Container.Application.Docker]

  tosca.nodes.Container.Application.Docker:
    derived_from: tosca.nodes.Container.Application
    requirements:
      - host:
          capability: tosca.capabilities.Container.Docker

##########################################################################
# Relationship Type.
# A Relationship Type is a reusable entity that defines the type of one
# or more relationships between Node Types or Node Templates.
##########################################################################
relationship_types:
  tosca.relationships.Root:
    description: >
      The TOSCA root Relationship Type all other TOSCA base Relationship Types
      derive from.
    attributes:
      tosca_id:
        type: string
      tosca_name:
        type: string
    interfaces:
      Configure:
        type: tosca.interfaces.relationship.Configure

  tosca.relationships.DependsOn:
    derived_from: tosca.relationships.Root

  tosca.relationships.HostedOn:
    derived_from: tosca.relationships.Root

  tosca.relationships.ConnectsTo:
    derived_from: tosca.relationships.Root
    valid_target_types: [tosca.capabilities.Endpoint]
    properties:
      credential:
        type: tosca.datatypes.Credential
        required: false

  tosca.relationships.AttachesTo:
    derived_from: tosca.relationships.Root
    valid_target_types: [tosca.capabilities.Attachment]
    properties:
      location:
        required: true
        type: string
        constraints:
          - min_length: 1
      device:
        required: false
        type: string

  tosca.relationships.RoutesTo:
    derived_from: tosca.relationships.ConnectsTo
    valid_target_types: [tosca.capabilities.Endpoint]

  tosca.relationships.network.LinksTo:
    derived_from: tosca.relationships.DependsOn
    valid_target_types: [tosca.capabilities.network.Linkable]

  tosca.relationships.network.BindsTo:
    derived_from: tosca.relationships.DependsOn
    valid_target_types: [tosca.capabilities.network.Bindable]

##########################################################################
# Capability Type.
# A Capability Type is a reusable entity that describes a kind of
# capability that a Node Type can declare to expose.
##########################################################################
capability_types:
  tosca.capabilities.Root:
    description: >
      The TOSCA root Capability Type all other TOSCA base Capability Types
      derive from.

  tosca.capabilities.Node:
    derived_from: tosca.capabilities.Root

  tosca.capabilities.Container:
    derived_from: tosca.capabilities.Root

  tosca.capabilities.Storage:
    derived_from: tosca.capabilities.Root
    properties:
      name:
        type: string
        required: false

  tosca.capabilities.Compute:
    derived_from: tosca.capabilities.Container
    properties:
      name:
        type: string
        required: false
      num_cpus:
        required: false
        type: integer
        constraints:
          - greater_or_equal: 1
      cpu_frequency:
        required: false
        type: scalar-unit.frequency
        constraints:
          - greater_or_equal: 0.1 GHz
      disk_size:
        required: false
        type: scalar-unit.size
        constraints:
          - greater_or_equal: 0 MB
      mem_size:
        required: false
        type: scalar-unit.size
        constraints:
          - greater_or_equal: 0 MB

  tosca.capabilities.Endpoint:
    derived_from: tosca.capabilities.Root
    properties:
      protocol:
        type: string
        required: true
        default: tcp
      port:
        type: tosca.datatypes.network.PortDef
        required: false
      secure:
        type: boolean
        required: false
        default: false
      url_path:
        type: string
        required: false
      port_name:
        type: string
        required: false
      network_name:
        type: string
        required: false
        default: PRIVATE
      initiator:
        type: string
        required: false
        default: source
        constraints:
          - valid_values: [source, target, peer]
      ports:
        type: map
        required: false
        constraints:
          - min_length: 1
        entry_schema:
          type: tosca.datatypes.network.PortSpec
    attributes:
      ip_address:
        type: string

  tosca.capabilities.Endpoint.Admin:
    derived_from: tosca.capabilities.Endpoint
    properties:
      secure:
        type: boolean
        default: true
        constraints:
          - equal: true

  tosca.capabilities.Endpoint.Public:
    derived_from: tosca.capabilities.Endpoint
    properties:
      # Change the default network_name to use the first public network found
      network_name:
        type: string
        default: PUBLIC
        constraints:
          - equal: PUBLIC
      floating:
        description: >
          Indicates that the public address should be allocated from a pool of
          floating IPs that are associated with the network.
        type: boolean
        default: false
        status: experimental
      dns_name:
        description: The optional name to register with DNS
        type: string
        required: false
        status: experimental

  tosca.capabilities.Scalable:
    derived_from: tosca.capabilities.Root
    properties:
      min_instances:
        type: integer
        required: true
        default: 1
        description: >
          This property is used to indicate the minimum number of instances
          that should be created for the associated TOSCA Node Template by
          a TOSCA orchestrator.
      max_instances:
        type: integer
        required: true
        default: 1
        description: >
          This property is used to indicate the maximum number of instances
          that should be created for the associated TOSCA Node Template by
          a TOSCA orchestrator.
      default_instances:
        type: integer
        required: false
        description: >
          An optional property that indicates the requested default number
          of instances that should be the starting number of instances a
          TOSCA orchestrator should attempt to allocate.
          The value for this property MUST be in the range between the values
          set for min_instances and max_instances properties.

  tosca.capabilities.Endpoint.Database:
    derived_from: tosca.capabilities.Endpoint

  tosca.capabilities.Attachment:
    derived_from: tosca.capabilities.Root

  tosca.capabilities.network.Linkable:
    derived_from: tosca.capabilities.Root
    description: >
      A node type that includes the Linkable capability indicates that it can
      be pointed by tosca.relationships.network.LinksTo relationship type, which
      represents an association relationship between Port and Network node types.

  tosca.capabilities.network.Bindable:
    derived_from: tosca.capabilities.Root
    description: >
      A node type that includes the Bindable capability indicates that it can
      be pointed by tosca.relationships.network.BindsTo relationship type, which
      represents a network association relationship between Port and Compute node
      types.

  tosca.capabilities.OperatingSystem:
    derived_from: tosca.capabilities.Root
    properties:
      architecture:
        required: false
        type: string
        description: >
          The host Operating System (OS) architecture.
      type:
        required: false
        type: string
        description: >
          The host Operating System (OS) type.
      distribution:
        required: false
        type: string
        description: >
          The host Operating System (OS) distribution. Examples of valid values
          for an “type” of “Linux” would include:
          debian, fedora, rhel and ubuntu.
      version:
        required: false
        type: version
        description: >
          The host Operating System version.

  tosca.capabilities.Container.Docker:
    derived_from: tosca.capabilities.Container
    properties:
      version:
        type: list
        required: false
        entry_schema:
          type: version
        description: >
          The Docker version capability.
      publish_all:
        type: boolean
        default: false
        required: false
        description: >
          Indicates that all ports (ranges) listed in the dockerfile
          using the EXPOSE keyword be published.
      publish_ports:
        type: list
        entry_schema:
          type: tosca.datatypes.network.PortSpec
        required: false
        description: >
          List of ports mappings from source (Docker container)
          to target (host) ports to publish.
      expose_ports:
        type: list
        entry_schema:
          type: tosca.datatypes.network.PortSpec
        required: false
        description: >
          List of ports mappings from source (Docker container) to expose
          to other Docker containers (not accessible outside host).
      volumes:
        type: list
        entry_schema:
          type: string
        required: false
        description: >
          The dockerfile VOLUME command which is used to enable access
          from the Docker container to a directory on the host machine.

##########################################################################
# Interfaces Type.
# The Interfaces element describes a list of one or more interface
# definitions for a modelable entity (e.g., a Node or Relationship Type)
# as defined within the TOSCA Simple Profile specification.
##########################################################################
interface_types:
  tosca.interfaces.Root:
    description: >
      The TOSCA root Interface Type all other TOSCA Interface types derive from
  
  tosca.interfaces.node.lifecycle.Standard:
    operations:
      create:
        description: Standard lifecycle create operation.
      configure:
        description: Standard lifecycle configure operation.
      start:
        description: Standard lifecycle start operation.
      stop:
        description: Standard lifecycle stop operation.
      delete:
        description: Standard lifecycle delete operation.

  tosca.interfaces.relationship.Configure:
    operations:
      pre_configure_source:
        description: Operation to pre-configure the source endpoint.
      pre_configure_target:
        description: Operation to pre-configure the target endpoint.
      post_configure_source:
        description: Operation to post-configure the source endpoint.
      post_configure_target:
        description: Operation to post-configure the target endpoint.
      add_target:
        description: Operation to add a target node.
      remove_target:
        description: Operation to remove a target node.
      add_source:
        description: >
          Operation to notify the target node of a source node which
          is now available via a relationship.
      remove_source:
        description: >
          Operation to notify the target node of a source node which
          is no longer available via a relationship.
      target_changed:
        description: >
          Operation to notify source some property or attribute of the
          target changed

##########################################################################
# Data Type.
# A Datatype is a complex data type declaration which contains other
# complex or simple data types.
##########################################################################
data_types:
  tosca.datatypes.Root:
    description: >
      The TOSCA root Data Type all other TOSCA base Data Types derive from

  tosca.datatypes.network.NetworkInfo:
    derived_from: tosca.datatypes.Root
    properties:
      network_name:
        type: string
      network_id:
        type: string
      addresses:
        type: list
        entry_schema:
          type: string

  tosca.datatypes.network.PortInfo:
    derived_from: tosca.datatypes.Root
    properties:
      port_name:
        type: string
      port_id:
        type: string
      network_id:
        type: string
      mac_address:
        type: string
      addresses:
        type: list
        entry_schema:
          type: string

  tosca.datatypes.network.PortDef:
    type: integer
    constraints:
      - in_range: [1, 65535]

  tosca.datatypes.network.PortSpec:
    derived_from: tosca.datatypes.Root
    properties:
      protocol:
        type: string
        required: true
        default: tcp
        constraints:
          - valid_values: [udp, tcp, icmp]
      target:
        type: tosca.datatypes.network.PortDef
        required: false
      target_range:
        type: range
        required: false
        constraints:
          - in_range: [1, 65535]
      source:
        type: tosca.datatypes.network.PortDef
        required: false
      source_range:
        type: range
        required: false
        constraints:
          - in_range: [1, 65535]

  tosca.datatypes.Credential:
    derived_from: tosca.datatypes.Root
    properties:
      protocol:
        type: string
        required: false
      token_type:
        type: string
        default: password
        required: true
      token:
        type: string
        required: true
      keys:
        type: map
        entry_schema:
          type: string
        required: false
      user:
        type: string
        required: false

  tosca.datatypes.json:
    type: string

  tosca.datatypes.xml:
    type: string

##########################################################################
# Artifact Type.
# An Artifact Type is a reusable entity that defines the type of one or more
# files which Node Types or Node Templates can have dependent relationships
# and used during operations such as during installation or deployment.
##########################################################################
artifact_types:
  tosca.artifacts.Root:
    description: >
      The TOSCA Artifact Type all other TOSCA Artifact Types derive from

  tosca.artifacts.File:
    derived_from: tosca.artifacts.Root

  tosca.artifacts.Deployment:
    derived_from: tosca.artifacts.Root
    description: TOSCA base type for deployment artifacts

  tosca.artifacts.Deployment.Image:
    derived_from: tosca.artifacts.Deployment

  tosca.artifacts.Deployment.Image.VM:
    derived_from: tosca.artifacts.Deployment.Image
    description: Virtual Machine (VM) Image

  tosca.artifacts.Implementation:
    derived_from: tosca.artifacts.Root
    description: TOSCA base type for implementation artifacts

  tosca.artifacts.Implementation.Bash:
    derived_from: tosca.artifacts.Implementation
    description: Script artifact for the Unix Bash shell
    mime_type: application/x-sh
    file_ext: [sh]

  tosca.artifacts.Implementation.Python:
    derived_from: tosca.artifacts.Implementation
    description: Artifact for the interpreted Python language
    mime_type: application/x-python
    file_ext: [py]

  tosca.artifacts.Deployment.Image.Container.Docker:
    derived_from: tosca.artifacts.Deployment.Image
    description: Docker container image

  tosca.artifacts.Deployment.Image.VM.ISO:
    derived_from: tosca.artifacts.Deployment.Image
    description: Virtual Machine (VM) image in ISO disk format
    mime_type: application/octet-stream
    file_ext: [iso]

  tosca.artifacts.Deployment.Image.VM.QCOW2:
    derived_from: tosca.artifacts.Deployment.Image
    description: Virtual Machine (VM) image in QCOW v2 standard disk format
    mime_type: application/octet-stream
    file_ext: [qcow2]

  tosca.artifacts.template:
    derived_from: tosca.artifacts.Root
    description: TOSCA base type for template type artifacts

##########################################################################
# Policy Type.
# TOSCA Policy Types represent logical grouping of TOSCA nodes that have
# an implied relationship and need to be orchestrated or managed together
# to achieve some result.
##########################################################################
policy_types:
  tosca.policies.Root:
    description: The TOSCA Policy Type all other TOSCA Policy Types derive from.

  tosca.policies.Placement:
    derived_from: tosca.policies.Root
    description: The TOSCA Policy Type definition that is used to govern
      placement of TOSCA nodes or groups of nodes.

  tosca.policies.Scaling:
    derived_from: tosca.policies.Root
    description: The TOSCA Policy Type definition that is used to govern
      scaling of TOSCA nodes or groups of nodes.

  tosca.policies.Monitoring:
    derived_from: tosca.policies.Root
    description: The TOSCA Policy Type definition that is used to govern
      monitoring of TOSCA nodes or groups of nodes.

  tosca.policies.Update:
    derived_from: tosca.policies.Root
    description: The TOSCA Policy Type definition that is used to govern
      update of TOSCA nodes or groups of nodes.

  tosca.policies.Performance:
    derived_from: tosca.policies.Root
    description: The TOSCA Policy Type definition that is used to declare
      performance requirements for TOSCA nodes or groups of nodes.

  tosca.policies.Reservation:
    derived_from: tosca.policies.Root
    description: The TOSCA Policy Type definition that is used to create
      TOSCA nodes or group of nodes based on the reservation.

##########################################################################
# Group Type.
# Group Type represents logical grouping of TOSCA nodes that have an
# implied membership relationship and may need to be orchestrated or
# managed together to achieve some result.
##########################################################################
group_types:
  tosca.groups.Root:
    description: The TOSCA Group Type all other TOSCA Group Types derive from
    interfaces:
      Standard:
        type: tosca.interfaces.node.lifecycle.Standard

Unfurl types

# Copyright (c) 2020 Adam Souzis
# SPDX-License-Identifier: MIT
tosca_definitions_version: tosca_simple_unfurl_1_0_0 # unfurl/v1alpha1.ServiceTemplate
metadata:
  template_name: Unfurl types
  template_author: onecommons.org
  template_version: 1.0.0

artifact_types:
  unfurl.artifacts.HasConfigurator:
    derived_from: tosca.artifacts.Implementation
    properties:
      className:
        type: string
        description: Name of the python class that implements the configurator interface

  unfurl.artifacts.TemplateOperation:
    derived_from: unfurl.artifacts.HasConfigurator
    properties:
      className:
        type: string
        default: unfurl.configurators.TemplateConfigurator

  unfurl.artifacts.ShellExecutable:
    derived_from: unfurl.artifacts.HasConfigurator
    properties:
      className:
        type: string
        default: unfurl.configurators.shell.ShellConfigurator

  unfurl.artifacts.AnsiblePlaybook:
    derived_from: unfurl.artifacts.HasConfigurator
    properties:
      className:
        type: string
        default: unfurl.configurators.ansible.AnsibleConfigurator

node_types:
  tosca.nodes.Root:
    interfaces:
      Install: # all nodes can implement this interface
        type: unfurl.interfaces.Install
      Standard:
        type: tosca.interfaces.node.lifecycle.Standard

  unfurl.nodes.Repository:
    derived_from: tosca.nodes.Root
    description: >
      Reification of a TOSCA repository. Artifacts listed in the "artifacts" section
      of this node template will able available in the repository.
    properties:
      repository:
        description: The name of the repository this node instance represent.
        type: string
        required: false
      url:
        description: The url of this repository
        type: string
        required: false
      credential:
        description: >
          The credential, if present, of the repository this node instance represents.
        type: tosca.datatypes.Credential
        required: false
        metadata:
          sensitive: true

  unfurl.nodes.LocalRepository:
    derived_from: unfurl.nodes.Repository
    description: >
      Represents the collection of artifacts available to the local operation host.

  unfurl.nodes.ArtifactBuilder:
    derived_from: tosca.nodes.Root
    description: >
      Creates or builds the given artifact and "uploads" it to the artifact's repository.

  unfurl.nodes.ArtifactInstaller:
    derived_from: tosca.nodes.Root
    description: >
      Reification of an artifact that needs to be installed.
      Node templates of this type are "discovered" when artifacts need to be installed on an operation_host.
    artifacts:
      install:
        type: tosca.artifacts.Root
    interfaces:
      defaults:
        # delegate operations to the associated artifact
        implementation:
          className: unfurl.configurators.DelegateConfigurator
        inputs:
          target:
            eval: .artifacts::install
          inputs: {}
      Standard:
        operations:
          delete:
          create:
          configure:
          start:
          stop:
      Install:
        operations:
          check:
      Mock:
        operations:
          delete:
          create:
          configure:
          start:
          stop:
          check:

  unfurl.nodes.Installer:
    derived_from: tosca.nodes.Root
    capabilities:
      installer:
        type: unfurl.capabilities.Installer

  unfurl.nodes.Installation:
    derived_from: tosca.nodes.Root
    requirements:
      - installer:
          capability: unfurl.capabilities.Installer
          node: unfurl.nodes.Installer
          relationship: unfurl.relationships.InstalledBy
          occurrences: [0, 1] # it isn't necessarily required

  unfurl.nodes.Default:
    derived_from: unfurl.nodes.Installation
    description: "Used if pre-existing instances are declared with no TOSCA template"
    metadata:
      additionalProperties: true

  unfurl.nodes.Generic:
    derived_from: tosca.nodes.Root
    description: An open, generic type that allows your template to declare arbitrary properties.
    metadata:
      additionalProperties: true

  unfurl.nodes.CloudAccount:
    derived_from: tosca.nodes.Root
    attributes:
      account_id:
        description: "Cloud provider specific account identifier"
        type: string

  unfurl.nodes.CloudObject:
    derived_from: tosca.nodes.Root
    attributes:
      uri:
        description: "Unique identifier"
        type: string
      name:
        description: "Human-friendly name of the resource"
        type: string
      console_url:
        description: "URL for viewing this resource in its cloud provider's console"
        type: string
        required: False
    # XXX re-enable this when we handle subtypes of requirements properly
    # requirements:
    #   - cloud:
    #       node: unfurl.nodes.CloudAccount
    #       relationship: unfurl.relationships.ConnectsTo.CloudAccount
    #       occurrences: [0, 1] # make optional so we aren't forced to always explicitly declare this

  unfurl.nodes.AWSAccount:
    derived_from: unfurl.nodes.CloudAccount

  unfurl.nodes.AWSResource:
    derived_from: unfurl.nodes.CloudObject
    requirements:
      - cloud:
          node: unfurl.nodes.AWSAccount
          relationship: unfurl.relationships.ConnectsTo.AWSAccount
          occurrences: [0, 1] # make optional so we aren't forced to always explicitly declare this
          metadata:
            visibility: hidden

  unfurl.nodes.AzureAccount:
    derived_from: unfurl.nodes.CloudAccount

  unfurl.nodes.AzureResource:
    derived_from: unfurl.nodes.CloudObject
    requirements:
      - cloud:
          node: unfurl.nodes.AzureAccount
          relationship: unfurl.relationships.ConnectsTo.Azure
          occurrences: [0, 1] # make optional so we aren't forced to always explicitly declare this
          metadata:
            visibility: hidden

data_types:
  unfurl.datatypes.EnvVar:
    derived_from: tosca.datatypes.Root
    type: string
    description: The value of an environment variable whose name matches the property's name

  unfurl.datatypes.EnvironmentVariables:
    derived_from: tosca.datatypes.Root
    description: An open type (properties don't need to be declared) that serializes as a map of environment variables.
    metadata:
      additionalProperties: true
      transform:
        eval:
          to_env:
            eval: $value

capability_types:
  unfurl.capabilities.Installer:
    derived_from: tosca.capabilities.Root

  unfurl.capabilities.Endpoint.Ansible:
    derived_from: tosca.capabilities.Endpoint.Admin
    description: Capability to connect to Ansible
    properties:
      connection:
        description: The connection type (sets "ansible_connection")
        type: string
        default: local
      port:
        type: tosca.datatypes.network.PortDef
        description: sets "ansible_port"
        required: false
      host:
        type: string
        description: Sets "ansible_host"
        required: false
      user:
        description: Sets "ansible_user" if not set in credentials
        type: string
        required: false
      authentication_type:
        description: "Type of authentication required, should match the credential's token_type"
        type: string
        required: false
      hostvars:
        type: map
        required: false
        description: >
          Passed to ansible as host vars
          See https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#connecting-to-hosts-behavioral-inventory-parameters

  unfurl.capabilities.Endpoint.SSH:
    derived_from: unfurl.capabilities.Endpoint.Ansible
    description: Capability to connect to the host via SSH
    properties:
      protocol:
        type: string
        value: ssh
        default: ssh
      connection:
        type: string
        default: ssh
      port:
        type: tosca.datatypes.network.PortDef
        default: 22

relationship_types:
  unfurl.relationships.InstalledBy:
    derived_from: tosca.relationships.Root
    valid_target_types: [unfurl.capabilities.Installer]

  unfurl.relationships.Configures:
    derived_from: tosca.relationships.Root

  unfurl.relationships.ConfiguringHostedOn:
    derived_from:
      [unfurl.relationships.Configures, tosca.relationships.HostedOn]

  unfurl.relationships.ConnectsTo.Ansible:
    derived_from: tosca.relationships.ConnectsTo
    valid_target_types: [unfurl.capabilities.Endpoint.Ansible]
    properties:
      credential:
        description: Its "user" property sets "ansible_user", add properties like "ssh_private_key_file" to "keys"
        type: tosca.datatypes.Credential
        required: false
        metadata:
          sensitive: true
      hostvars:
        type: map
        required: false
        description: >
          Passed to ansible as host vars
          See https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#connecting-to-hosts-behavioral-inventory-parameters

  unfurl.relationships.ConnectsTo.ComputeMachines:
    derived_from: tosca.relationships.ConnectsTo

  unfurl.relationships.ConnectsTo.CloudAccount:
    derived_from: unfurl.relationships.ConnectsTo.ComputeMachines
    # valid_target_types: [unfurl.capabilities.Endpoint.CloudAccount]

  unfurl.relationships.ConnectsTo.GoogleCloudProject:
    derived_from: unfurl.relationships.ConnectsTo.CloudAccount
    properties:
      CLOUDSDK_CORE_PROJECT:
        description: id of the project
        type: unfurl.datatypes.EnvVar
        default: { get_env: CLOUDSDK_CORE_PROJECT }
        required: false
      CLOUDSDK_COMPUTE_REGION:
        description: default region to use
        type: unfurl.datatypes.EnvVar
        default: { get_env: CLOUDSDK_COMPUTE_REGION }
        required: false
      CLOUDSDK_COMPUTE_ZONE:
        description: default zone to use
        type: unfurl.datatypes.EnvVar
        default: { get_env: CLOUDSDK_COMPUTE_ZONE }
        required: false
      GOOGLE_APPLICATION_CREDENTIALS:
        description: "Path to file containing service account private keys in JSON format"
        type: unfurl.datatypes.EnvVar
        default: { get_env: GOOGLE_APPLICATION_CREDENTIALS }
        required: false

      # other authentication options:
      GOOGLE_OAUTH_ACCESS_TOKEN:
        description: A temporary OAuth 2.0 access token obtained from the Google Authorization server
        type: unfurl.datatypes.EnvVar
        default: { get_env: GOOGLE_OAUTH_ACCESS_TOKEN }
        required: false

      GCP_SERVICE_ACCOUNT_CONTENTS:
        description: "Content of file containing service account private keys"
        type: tosca.datatypes.json
        default: { get_env: GCP_SERVICE_ACCOUNT_CONTENTS }
        required: false
        metadata:
          sensitive: true
        # some of the keys in the credential json:
        #   project_id
        #   type: auth_kind: type of authentication being used (choices: machineaccount, serviceaccount, application)
        #   client_email: email associated with the project
        #   scopes: The specific scopes that you want the actions to use.
      GCP_AUTH_KIND:
        type: unfurl.datatypes.EnvVar
        constraints:
          - valid_values: [application, machineaccount, serviceaccount]
        default: { get_env: [GCP_AUTH_KIND, "serviceaccount"] }
        required: false
      scopes:
        type: list
        entry_schema:
          type: string
        required: false
    interfaces:
      Install:
        check:
          implementation:
            className: unfurl.configurators.gcp.CheckGoogleCloudConnectionConfigurator
            # XXX defined in artifacts.yaml
            # dependencies:
            #   - google-auth

  unfurl.relationships.ConnectsTo.AWSAccount:
    derived_from: unfurl.relationships.ConnectsTo.CloudAccount
    properties:
      endpoints:
        description: custom service endpoints
        type: map
        required: false
      AWS_DEFAULT_REGION:
        description: "The default region to use, e.g. us-west-1, us-west-2, etc."
        type: unfurl.datatypes.EnvVar
        default: { get_env: AWS_DEFAULT_REGION }
        required: false
      AWS_ACCESS_KEY_ID:
        description: "The access key for your AWS account"
        type: unfurl.datatypes.EnvVar
        default: { get_env: AWS_ACCESS_KEY_ID }
        required: false
      AWS_SECRET_ACCESS_KEY:
        description: "The secret key for your AWS account."
        type: unfurl.datatypes.EnvVar
        default: { get_env: AWS_SECRET_ACCESS_KEY }
        required: false
        metadata:
          sensitive: true
      # other authentication options:
      AWS_SESSION_TOKEN:
        description: "The session key for your AWS account."
        type: unfurl.datatypes.EnvVar
        default: { get_env: AWS_SESSION_TOKEN }
        required: false
        metadata:
          sensitive: true
      AWS_PROFILE:
        type: unfurl.datatypes.EnvVar
        default: { get_env: AWS_PROFILE }
        required: false
      AWS_SHARED_CREDENTIALS_FILE:
        type: unfurl.datatypes.EnvVar
        default: { get_env: AWS_SHARED_CREDENTIALS_FILE }
        required: false
      AWS_CONFIG_FILE:
        type: unfurl.datatypes.EnvVar
        default: { get_env: AWS_CONFIG_FILE }
        required: false
    # see https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html#using-environment-variables
    # for more environment variables

  unfurl.relationships.ConnectsTo.DigitalOcean:
    derived_from: unfurl.relationships.ConnectsTo.CloudAccount
    properties:
      credential:
        metadata:
          user_settable: false
          sensitive: true
      DIGITALOCEAN_TOKEN:
        type: unfurl.datatypes.EnvVar
        default: { get_env: DIGITALOCEAN_TOKEN }
        metadata:
          user_settable: true
          sensitive: true
      SPACES_ACCESS_KEY_ID:
        description: "The access key for Spaces object storage."
        type: unfurl.datatypes.EnvVar
        default: { get_env: SPACES_ACCESS_KEY_ID }
        required: false
        metadata:
          user_settable: true
      SPACES_SECRET_ACCESS_KEY:
        description: "The secret key for Spaces object storage."
        type: unfurl.datatypes.EnvVar
        default: { get_env: SPACES_SECRET_ACCESS_KEY }
        required: false
        metadata:
          user_settable: true
          sensitive: true
      default_region:
        type: string
        title: Default Region
        default: nyc1
        description: "The default region to use, e.g. fra1, nyc2, etc."
        metadata:
          user_settable: true

  unfurl.relationships.ConnectsTo.Azure:
    derived_from: unfurl.relationships.ConnectsTo.CloudAccount
    properties:
      AZURE_CLIENT_ID:
        description: >
          Also known as an Application ID or `appId`.
          Can be created via [CLI](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/service_principal_client_certificate)
          or through the [Azure portal](https://learn.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal).
        type: string
        metadata:
          env_vars: [ARM_CLIENT_ID, AZURE_CLIENT_ID]
          title: Client ID
          user_settable: true
        default: { get_env: [ARM_CLIENT_ID, {get_env: AZURE_CLIENT_ID}] }
        required: false
      AZURE_TENANT:
        description: >
          [Find your Azure active directory tenant](https://learn.microsoft.com/en-us/azure/azure-portal/get-subscription-tenant-id#find-your-azure-ad-tenant)
        type: string
        metadata:
          env_vars: [ARM_TENANT_ID, AZURE_TENANT]
          title: Tenant
          user_settable: true
        default: { get_env: [ARM_TENANT_ID, {get_env: AZURE_TENANT}] }
        required: false
      AZURE_SUBSCRIPTION_ID:
        description: >
          [Find your Azure subscription](https://learn.microsoft.com/en-us/azure/azure-portal/get-subscription-tenant-id#find-your-azure-subscription)
        type: string
        required: false
        metadata:
          env_vars: [ARM_SUBSCRIPTION_ID, AZURE_SUBSCRIPTION_ID]
          title: Azure Subscription
          user_settable: true
        default: { get_env: [ARM_SUBSCRIPTION_ID, {get_env: AZURE_SUBSCRIPTION_ID}] }
      AZURE_SECRET:
        description: >
          For authentication with service principal. [(Portal link)](https://learn.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret)
        type: string
        required: false
        default: { get_env: [ARM_CLIENT_SECRET, {get_env: AZURE_SECRET}] }
        metadata:
          env_vars: [ARM_CLIENT_SECRET, AZURE_SECRET]
          sensitive: true
          title: Client Secret
          user_settable: true
      AZURE_AD_USER:
        description: for authentication with Active Directory
        type: unfurl.datatypes.EnvVar
        default: { get_env: AZURE_AD_USER }
        required: false
      AZURE_PASSWORD:
        description: for authentication with Active Directory
        type: unfurl.datatypes.EnvVar
        default: { get_env: AZURE_PASSWORD }
        required: false
        metadata:
          sensitive: true
      AZURE_ADFS_AUTHORITY_URL:
        description: set if you have your own ADFS authority
        type: unfurl.datatypes.EnvVar
        default: { get_env: AZURE_ADFS_AUTHORITY_URL }
        required: false

  unfurl.relationships.ConnectsTo.Packet:
    derived_from: unfurl.relationships.ConnectsTo.CloudAccount
    properties:
      project:
        description: UUID to packet project
        type: string
      PACKET_API_TOKEN:
        type: unfurl.datatypes.EnvVar
        default: { get_env: PACKET_API_TOKEN }
        metadata:
          sensitive: true

  unfurl.relationships.ConnectsTo.OpenStack:
    derived_from: unfurl.relationships.ConnectsTo.CloudAccount
    # from pyrax (rackspace, openstack)
    # RAX_CREDS_FILE
    # CLOUD_ID_TYPE "rackspace" or "keystone"
    # CLOUD_REGION default: "DFW"
    # also CLOUD_* in https://github.com/pycontribs/pyrax/blob/master/docs/getting_started.md#available-configuration-settings

  unfurl.relationships.ConnectsTo.Rackspace:
    derived_from: unfurl.relationships.ConnectsTo.OpenStack

interface_types:
  Mock:
    derived_from: tosca.interfaces.Root

  unfurl.interfaces.Install:
    derived_from: tosca.interfaces.Root
    operations:
      check:
        description: Checks and sets the status and attributes of the instance
      discover:
        description: Discovers current state of the current instance and (possibly) related instances, updates the spec as needed.
      revert:
        description: Restore the instance to the state it was original found in.
      connect:
        description: Connect to a pre-existing resource.
      restart:
        description: Restart the resource.

group_types:
  unfurl.groups.AnsibleInventoryGroup:
    derived_from: tosca.groups.Root
    description: Use this to place hosts in Ansible inventory groups
    properties:
      hostvars:
        description: Ansible hostvars for members of this group
        type: map
        default: {}
    members: [tosca.nodes.Compute, unfurl.groups.ansibleInventoryGroup]