ARIA-321 Provide Clearwater IMS example

* Allows capabilities, interfaces, and properties to override parent
definition types only if the new type is a descendant of the overridden
type
* Fix bugs in model instrumentation (to allow ctx access to capability
properties and complex values)
* Fix to get_property intrinsic function
* Don't let scalar values be negative
* Doc fixes related to ARIA-277


Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/32891428
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/32891428
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/32891428

Branch: refs/heads/ARIA-321-clearwater
Commit: 328914285487f59b566fc55306662cfdac3b52e1
Parents: df2b916
Author: Tal Liron <tal.li...@gmail.com>
Authored: Thu Jul 27 17:58:17 2017 -0500
Committer: Tal Liron <tal.li...@gmail.com>
Committed: Wed Aug 9 11:41:57 2017 -0500

----------------------------------------------------------------------
 README.rst                                      |   2 +-
 aria/modeling/functions.py                      |   4 +-
 aria/modeling/service_common.py                 |   2 +-
 aria/modeling/service_instance.py               |  89 ++-
 aria/orchestrator/topology/template_handler.py  |  17 +-
 aria/orchestrator/topology/topology.py          |  12 +-
 .../clearwater/clearwater-single-static.yaml    | 109 +++
 examples/clearwater/scripts/bono/create.sh      |   4 +
 examples/clearwater/scripts/bono/delete.sh      |   0
 examples/clearwater/scripts/dime/create.sh      |   5 +
 examples/clearwater/scripts/dime/delete.sh      |   0
 examples/clearwater/scripts/ellis/configure.sh  |  14 +
 examples/clearwater/scripts/ellis/create.sh     |   4 +
 examples/clearwater/scripts/ellis/delete.sh     |   0
 examples/clearwater/scripts/homer/create.sh     |  12 +
 examples/clearwater/scripts/homer/delete.sh     |   0
 examples/clearwater/scripts/homestead/create.sh |  10 +
 examples/clearwater/scripts/homestead/delete.sh |   0
 examples/clearwater/scripts/host/configure.sh   | 157 +++++
 examples/clearwater/scripts/memento/create.sh   |   4 +
 examples/clearwater/scripts/memento/delete.sh   |   0
 examples/clearwater/scripts/ralf/create.sh      |   0
 examples/clearwater/scripts/ralf/delete.sh      |   0
 examples/clearwater/scripts/sprout/create.sh    |   4 +
 examples/clearwater/scripts/sprout/delete.sh    |   0
 examples/clearwater/scripts/vellum/create.sh    |   8 +
 examples/clearwater/scripts/vellum/delete.sh    |   0
 examples/clearwater/types/cassandra.yaml        |  16 +
 examples/clearwater/types/clearwater.yaml       | 673 +++++++++++++++++++
 examples/clearwater/types/ims.yaml              | 431 ++++++++++++
 examples/clearwater/types/smtp.yaml             |  21 +
 examples/hello-world/hello-world.yaml           |  38 ++
 examples/hello-world/helloworld.yaml            |  38 --
 .../block-storage-1/block-storage-1.yaml        |   6 +-
 .../block-storage-2/block-storage-2.yaml        |   6 +-
 .../block-storage-3/block-storage-3.yaml        |   4 +-
 .../block-storage-4/block-storage-4.yaml        |   2 +-
 .../use-cases/non-normative-types.yaml          |   6 +-
 .../webserver-dbms-1/webserver-dbms-1.yaml      |  10 +-
 .../profiles/tosca-simple-1.0/artifacts.yaml    |  18 +-
 .../profiles/tosca-simple-1.0/capabilities.yaml |   8 +-
 .../profiles/tosca-simple-1.0/data.yaml         |  10 +-
 .../profiles/tosca-simple-1.0/interfaces.yaml   |   2 +-
 .../profiles/tosca-simple-1.0/nodes.yaml        |  18 +-
 .../profiles/tosca-simple-1.0/policies.yaml     |   8 +-
 .../tosca-simple-1.0/relationships.yaml         |  16 +-
 .../profiles/tosca-simple-nfv-1.0/nodes.yaml    |   4 +-
 .../simple_v1_0/data_types.py                   |  15 +-
 .../simple_v1_0/modeling/capabilities.py        |  14 +-
 .../simple_v1_0/modeling/data_types.py          |   4 -
 .../simple_v1_0/modeling/functions.py           |  18 +-
 .../simple_v1_0/modeling/interfaces.py          |  14 +-
 .../simple_v1_0/modeling/parameters.py          |  27 +-
 .../simple_v1_0/presentation/types.py           |   8 +-
 .../aria_extension_tosca/simple_v1_0/types.py   |  19 +
 tests/end2end/test_hello_world.py               |   2 +-
 .../node-cellar/node-cellar.yaml                |  18 +-
 .../node-cellar/types/mongodb.yaml              |   2 +-
 .../node-cellar/types/nodejs.yaml               |   2 +-
 .../node-cellar/types/openstack.yaml            |   4 +-
 .../types/shorthand-1/shorthand-1.yaml          |   6 +-
 .../types/typequalified-1/typequalified-1.yaml  |   6 +-
 62 files changed, 1770 insertions(+), 181 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/README.rst
----------------------------------------------------------------------
diff --git a/README.rst b/README.rst
index b9a8213..1284808 100644
--- a/README.rst
+++ b/README.rst
@@ -91,7 +91,7 @@ This section will describe how to run a simple "Hello World" 
example.
 First, provide ARIA with the ARIA "hello world" service-template and name it 
(e.g.
 ``my-service-template``)::
 
-    aria service-templates store examples/hello-world/helloworld.yaml 
my-service-template
+    aria service-templates store examples/hello-world/hello-world.yaml 
my-service-template
 
 Now create a service based on this service-template and name it (e.g. 
``my-service``)::
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/aria/modeling/functions.py
----------------------------------------------------------------------
diff --git a/aria/modeling/functions.py b/aria/modeling/functions.py
index 31c3839..554bbfb 100644
--- a/aria/modeling/functions.py
+++ b/aria/modeling/functions.py
@@ -19,6 +19,7 @@ Mechanism for evaluating intrinsic functions.
 from ..parser.exceptions import InvalidValueError
 from ..parser.consumption import ConsumptionContext
 from ..utils.collections import OrderedDict
+from ..utils.type import full_type_name
 from . import exceptions
 
 
@@ -88,7 +89,8 @@ def evaluate(value, container_holder, report_issues=False): # 
pylint: disable=to
             if (evaluation is None) \
                 or (not hasattr(evaluation, 'value')) \
                 or (not hasattr(evaluation, 'final')):
-                raise InvalidValueError('bad __evaluate__ implementation')
+                raise InvalidValueError('bad __evaluate__ implementation: {0}'
+                                        .format(full_type_name(value)))
 
             evaluated = True
             value = evaluation.value

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/aria/modeling/service_common.py
----------------------------------------------------------------------
diff --git a/aria/modeling/service_common.py b/aria/modeling/service_common.py
index 478e530..d1f6b00 100644
--- a/aria/modeling/service_common.py
+++ b/aria/modeling/service_common.py
@@ -28,7 +28,7 @@ from sqlalchemy.ext.declarative import declared_attr
 
 from ..utils import (
     collections,
-    formatting,
+    formatting
 )
 from .mixins import InstanceModelMixin, TemplateModelMixin, ParameterMixin
 from . import relationship

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/aria/modeling/service_instance.py
----------------------------------------------------------------------
diff --git a/aria/modeling/service_instance.py 
b/aria/modeling/service_instance.py
index daeb0a4..0205488 100644
--- a/aria/modeling/service_instance.py
+++ b/aria/modeling/service_instance.py
@@ -38,7 +38,7 @@ from .mixins import InstanceModelMixin
 
 from ..utils import (
     collections,
-    formatting,
+    formatting
 )
 
 
@@ -228,6 +228,80 @@ class ServiceBase(InstanceModelMixin):
     :type: :class:`~datetime.datetime`
     """)
 
+    def get_node_by_type(self, type_name):
+        """
+        Finds the first node of a type (or descendent type).
+        """
+        service_template = self.service_template
+
+        if service_template is not None:
+            node_types = service_template.node_types
+            if node_types is not None:
+                for node in self.nodes.itervalues():
+                    if node_types.is_descendant(type_name, node.type.name):
+                        return node
+
+        return None
+
+    def get_policy_by_type(self, type_name):
+        """
+        Finds the first policy of a type (or descendent type).
+        """
+        service_template = self.service_template
+
+        if service_template is not None:
+            policy_types = service_template.policy_types
+            if policy_types is not None:
+                for policy in self.policies.itervalues():
+                    if policy_types.is_descendant(type_name, policy.type.name):
+                        return policy
+
+        return None
+
+    def satisfy_requirements(self):
+        satisfied = True
+        for node in self.nodes.itervalues():
+            if not node.satisfy_requirements():
+                satisfied = False
+        return satisfied
+
+    def validate_capabilities(self):
+        satisfied = True
+        for node in self.nodes.itervalues():
+            if not node.validate_capabilities():
+                satisfied = False
+        return satisfied
+
+    def find_hosts(self):
+        for node in self.nodes.itervalues():
+            node.find_host()
+
+    def configure_operations(self):
+        for node in self.nodes.itervalues():
+            node.configure_operations()
+        for group in self.groups.itervalues():
+            group.configure_operations()
+        for operation in self.workflows.itervalues():
+            operation.configure()
+
+    def is_node_a_target(self, target_node):
+        for node in self.nodes.itervalues():
+            if self._is_node_a_target(node, target_node):
+                return True
+        return False
+
+    def _is_node_a_target(self, source_node, target_node):
+        if source_node.outbound_relationships:
+            for relationship_model in source_node.outbound_relationships:
+                if relationship_model.target_node.name == target_node.name:
+                    return True
+                else:
+                    node = relationship_model.target_node
+                    if node is not None:
+                        if self._is_node_a_target(node, target_node):
+                            return True
+        return False
+
     @property
     def as_raw(self):
         return collections.OrderedDict((
@@ -479,14 +553,15 @@ class NodeBase(InstanceModelMixin):
 
     @classmethod
     def determine_state(cls, op_name, is_transitional):
-        """ :returns the state the node should be in as a result of running the
-            operation on this node.
+        """
+        :returns the state the node should be in as a result of running the 
operation on this node.
 
-            e.g. if we are running 
tosca.interfaces.node.lifecycle.Standard.create, then
-            the resulting state should either 'creating' (if the task just 
started) or 'created'
-            (if the task ended).
+        E.g. if we are running 
tosca.interfaces.node.lifecycle.Standard.create, then
+        the resulting state should either 'creating' (if the task just 
started) or 'created'
+        (if the task ended).
 
-            If the operation is not a standard tosca lifecycle operation, then 
we return None"""
+        If the operation is not a standard TOSCA lifecycle operation, then we 
return None.
+        """
 
         state_type = 'transitional' if is_transitional else 'finished'
         try:

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/aria/orchestrator/topology/template_handler.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/topology/template_handler.py 
b/aria/orchestrator/topology/template_handler.py
index bf0ef9f..a84a988 100644
--- a/aria/orchestrator/topology/template_handler.py
+++ b/aria/orchestrator/topology/template_handler.py
@@ -206,12 +206,15 @@ class CapabilityTemplate(common.TemplateHandlerBase):
         self._topology.coerce(self._model.properties, **kwargs)
 
     def instantiate(self, instance_cls, **_):
-        return instance_cls(name=self._model.name,
-                            type=self._model.type,
-                            min_occurrences=self._model.min_occurrences,
-                            max_occurrences=self._model.max_occurrences,
-                            occurrences=0,
-                            capability_template=self._model)
+        capability = instance_cls(
+            name=self._model.name,
+            type=self._model.type,
+            min_occurrences=self._model.min_occurrences,
+            max_occurrences=self._model.max_occurrences,
+            occurrences=0,
+            capability_template=self._model)
+        capability.properties = 
self._topology.instantiate(self._model.properties)
+        return capability
 
     def validate(self, **kwargs):
         self._topology.validate(self._model.properties, **kwargs)
@@ -446,7 +449,7 @@ class SubstitutionTemplate(common.TemplateHandlerBase):
 class SubstitutionTemplateMapping(common.TemplateHandlerBase):
 
     def dump(self, out_stream):
-        if self._topology.capability_template is not None:
+        if self._model.capability_template is not None:
             node_template = self._model.capability_template.node_template
         else:
             node_template = self._model.requirement_template.node_template

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/aria/orchestrator/topology/topology.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/topology/topology.py 
b/aria/orchestrator/topology/topology.py
index 8ee33d1..f86c9dd 100644
--- a/aria/orchestrator/topology/topology.py
+++ b/aria/orchestrator/topology/topology.py
@@ -57,11 +57,11 @@ class Topology(issue.ReporterMixin):
     @staticmethod
     def _init_handlers(module_):
         """
-        Register handlers from a handler module to the models
+        Register handlers from a handler module to the models.
 
-        :param module_: The module to look for handlers
-        :return: a dict where the key is the models class, and the value is 
the handler class
-        associated with it from the provided module
+        :param module_: the module to look for handlers
+        :returns: dict where the key is the models class, and the value is the 
handler class
+         associated with it from the provided module
         """
         handlers = {}
         for attribute_name in dir(module_):
@@ -74,11 +74,11 @@ class Topology(issue.ReporterMixin):
 
     def instantiate(self, model, **kwargs):
         """
-        instantiate the provided model
+        Instantiate the provided model.
 
         :param model:
         :param kwargs:
-        :return:
+        :returns:
         """
         if isinstance(model, dict):
             return dict((name, self.instantiate(value, **kwargs))

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/clearwater-single-static.yaml
----------------------------------------------------------------------
diff --git a/examples/clearwater/clearwater-single-static.yaml 
b/examples/clearwater/clearwater-single-static.yaml
new file mode 100644
index 0000000..d102a94
--- /dev/null
+++ b/examples/clearwater/clearwater-single-static.yaml
@@ -0,0 +1,109 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+description: >-
+  Project Clearwater is an open-source IMS core, developed by Metaswitch 
Networks and released under
+  the GNU GPLv3.
+
+metadata:
+  template_name: clearwater-single-static
+  template_author: ARIA
+  template_version: '1.0'
+  aria_version: '0.1.2'
+
+imports:
+  - types/clearwater.yaml
+  - aria-1.0
+
+topology_template:
+
+  inputs:
+    hosts.ssh.user:
+      type: string
+    hosts.ssh.password:
+      type: string
+    static_host.public_address:
+      type: string
+    static_host.private_address:
+      type: string
+      default: { get_input: static_host.public_address }
+
+  node_templates:
+    bono:
+      type: clearwater.Bono
+      requirements:
+        - sip_downstream: clearwater.Sprout
+        - sip_secure_downstream: clearwater.Sprout
+
+    i-cscf:
+      type: clearwater.I-CSCF
+
+    s-cscf:
+      type: clearwater.S-CSCF
+
+    sprout:
+      type: clearwater.Sprout
+# cyclical: see ARIA-327
+#      requirements:
+#        - sip_upstream: clearwater.Bono
+
+    dime:
+      type: clearwater.Dime
+
+    homestead:
+      type: clearwater.Homestead
+
+    ralf:
+      type: clearwater.Ralf
+
+    vellum:
+      type: clearwater.Vellum
+
+    homer:
+      type: clearwater.Homer
+
+    ellis:
+      type: clearwater.Ellis
+      properties:
+        provision_numbers_count: 1000
+
+    static_host:
+      type: clearwater.Host
+      attributes:
+        public_address: { get_input: static_host.public_address }
+        private_address: { get_input: static_host.private_address }
+      capabilities:
+        host:
+          properties:
+            ssh.user: { get_input: hosts.ssh.user }
+            ssh.password: { get_input: hosts.ssh.password }
+            max_log_directory_size: 50 MiB
+            reduce_cassandra_mem_usage: true
+
+    smtp:
+      type: smtp.SMTP
+      properties:
+          # TODO: not validating required :(
+        address: 127.0.0.1
+      capabilities:
+        smtp:
+          properties:
+            # TODO: not validating required :(
+            username: username
+            password: password
+
+  policies:
+    configuration:
+      type: clearwater.Configuration
+      properties:
+        zone: example.com
+        secret: secret
+
+  substitution_mappings:
+    node_type: ims.nodes.IMS
+    capabilities:
+       p-cscf: [ bono, p-cscf ]
+       i-cscf: [ i-cscf, i-cscf ]
+       s-cscf: [ s-cscf, s-cscf ]
+       hss: [ homestead, hss ]
+       ctf: [ ralf, ctf ]
+       xdms: [ homer, xdms ]

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/bono/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/bono/create.sh 
b/examples/clearwater/scripts/bono/create.sh
new file mode 100644
index 0000000..7eb94b1
--- /dev/null
+++ b/examples/clearwater/scripts/bono/create.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -e
+
+yes | aptdcon --hide-terminal --install bono restund

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/bono/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/bono/delete.sh 
b/examples/clearwater/scripts/bono/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/dime/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/dime/create.sh 
b/examples/clearwater/scripts/dime/create.sh
new file mode 100644
index 0000000..04b2d2d
--- /dev/null
+++ b/examples/clearwater/scripts/dime/create.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+set -e
+
+# Installs Homestead and Ralf
+yes | aptdcon --hide-terminal --install dime clearwater-prov-tools

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/dime/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/dime/delete.sh 
b/examples/clearwater/scripts/dime/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/ellis/configure.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/ellis/configure.sh 
b/examples/clearwater/scripts/ellis/configure.sh
new file mode 100644
index 0000000..7ed387d
--- /dev/null
+++ b/examples/clearwater/scripts/ellis/configure.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+set -e
+
+PROVISION_NUMBERS_START=$(ctx node properties provision_numbers_start)
+PROVISION_NUMBERS_COUNT=$(ctx node properties provision_numbers_count)
+
+if [ "$PROVISION_NUMBERS_COUNT" != 0 ]; then
+       cd /usr/share/clearwater/ellis
+       . env/bin/activate
+       python src/metaswitch/ellis/tools/create_numbers.py \
+               --start "$PROVISION_NUMBERS_START" \
+               --count "$PROVISION_NUMBERS_COUNT"
+       deactivate
+fi

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/ellis/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/ellis/create.sh 
b/examples/clearwater/scripts/ellis/create.sh
new file mode 100644
index 0000000..93d3fb4
--- /dev/null
+++ b/examples/clearwater/scripts/ellis/create.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -e
+
+yes | aptdcon --hide-terminal --install ellis

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/ellis/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/ellis/delete.sh 
b/examples/clearwater/scripts/ellis/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/homer/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/homer/create.sh 
b/examples/clearwater/scripts/homer/create.sh
new file mode 100644
index 0000000..74510ab
--- /dev/null
+++ b/examples/clearwater/scripts/homer/create.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -e
+
+yes | aptdcon --hide-terminal --install homer
+
+# ARIA fix to avoid warnings by Twisted for missing service_identity library
+# (Crest is used by both Homer and Homestead-prov)
+cd /usr/share/clearwater/crest
+. env/bin/activate
+pip install service_identity
+deactivate
+service homer restart

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/homer/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/homer/delete.sh 
b/examples/clearwater/scripts/homer/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/homestead/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/homestead/create.sh 
b/examples/clearwater/scripts/homestead/create.sh
new file mode 100644
index 0000000..b130bd2
--- /dev/null
+++ b/examples/clearwater/scripts/homestead/create.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -e
+
+# ARIA fix to avoid warnings by Twisted for missing service_identity library
+# (Crest is used by both Homer and Homestead-prov)
+cd /usr/share/clearwater/crest
+. env/bin/activate
+pip install service_identity
+deactivate
+service homer restart

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/homestead/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/homestead/delete.sh 
b/examples/clearwater/scripts/homestead/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/host/configure.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/host/configure.sh 
b/examples/clearwater/scripts/host/configure.sh
new file mode 100644
index 0000000..d27f58d
--- /dev/null
+++ b/examples/clearwater/scripts/host/configure.sh
@@ -0,0 +1,157 @@
+#!/bin/bash
+set -e
+
+ZONE=$(ctx service get_policy_by_type [ clearwater.Configuration ] properties 
zone)
+GEOGRAPHICALLY_REDUNDANT=$(ctx service get_policy_by_type [ 
clearwater.Configuration ] properties geographically_redundant)
+SITE_NAME=$(ctx service get_policy_by_type [ clearwater.Configuration ] 
properties site_name)
+SECRET=$(ctx service get_policy_by_type [ clearwater.Configuration ] 
properties secret)
+
+SMTP_HOSTNAME=$(ctx service get_node_by_type [ smtp.SMTP ] properties address)
+SMTP_USERNAME=$(ctx service get_node_by_type [ smtp.SMTP ] capabilities smtp 
properties username)
+SMTP_PASSWORD=$(ctx service get_node_by_type [ smtp.SMTP ] capabilities smtp 
properties password)
+
+MAX_LOG_DIRECTORY_SIZE=$(ctx node capabilities host properties 
max_log_directory_size value)
+REDUCE_CASSANDRA_MEM_USAGE=$(ctx node capabilities host properties 
reduce_cassandra_mem_usage)
+
+PRIVATE_IP=$(ctx node attributes private_address)
+PUBLIC_IP=$(ctx node attributes public_address)
+PUBLIC_HOSTNAME=$(hostname)
+# TODO: comma-separated list of all private IP addresses in group
+ETCD_CLUSTER=$PRIVATE_IP
+
+REPO_FILE=/etc/apt/sources.list.d/clearwater.list
+REPO_LINE='deb http://repo.cw-ngv.com/stable binary/'
+KEY_URL=http://repo.cw-ngv.com/repo_key
+
+
+#
+# Repository
+#
+
+if [ ! -f "$REPO_FILE" ]; then
+       echo "$REPO_LINE" > "$REPO_FILE"
+       curl --location "$KEY_URL" | apt-key add -
+       apt update
+fi
+
+if ! type aptdcon > /dev/null; then
+       # This will allow us to do concurrent installs
+       apt install aptdaemon --yes
+fi
+
+yes | aptdcon --hide-terminal --install clearwater-management
+
+
+#
+# DNS
+#
+
+S_CSCF_HOST="$PRIVATE_IP scscf.$HOSTNAME # ARIA"
+grep --quiet --fixed-strings "$S_CSCF_HOST" /etc/hosts || echo "$S_CSCF_HOST" 
>> /etc/hosts
+
+
+#
+# Local configuration
+#
+
+mkdir --parents /etc/clearwater
+CONFIG_FILE=/etc/clearwater/local_config
+echo "# Created by ARIA on $(date -u)" > "$CONFIG_FILE"
+
+echo >> "$CONFIG_FILE"
+echo "# Local IP configuration" >> "$CONFIG_FILE"
+echo "local_ip=$PRIVATE_IP" >> "$CONFIG_FILE"
+echo "public_ip=$PUBLIC_IP" >> "$CONFIG_FILE"
+echo "public_hostname=$PUBLIC_HOSTNAME" >> "$CONFIG_FILE"
+echo "etcd_cluster=$ETCD_CLUSTER" >> "$CONFIG_FILE"
+
+if [ "$MAX_LOG_DIRECTORY_SIZE" != 0 ]; then
+       echo >> "$CONFIG_FILE"
+       echo "max_log_directory_size=$MAX_LOG_DIRECTORY_SIZE" >> "$CONFIG_FILE"
+fi
+
+if [ "$GEOGRAPHICALLY_REDUNDANT" = True ]; then
+       echo >> "$CONFIG_FILE"
+       echo "# Geographically redundant" >> "$CONFIG_FILE"
+       echo "local_site_name=$SITE_NAME" >> "$CONFIG_FILE"
+
+       # On the first Vellum node in the second site, you should set 
remote_cassandra_seeds to the
+       # IP address of a Vellum node in the first site.
+       #echo "remote_cassandra_seeds=" >> "$CONFIG_FILE"
+fi
+
+
+#
+# Shared configuration
+#
+
+if [ "$GEOGRAPHICALLY_REDUNDANT" = True ]; then
+       SPROUT_HOSTNAME=sprout.$SITE_NAME.$ZONE
+       SPROUT_REGISTRATION_STORE=vellum.$SITE_NAME.$ZONE
+       HS_HOSTNAME=hs.$SITE_NAME.$ZONE:8888
+       HS_PROVISIONING_HOSTNAME=hs.$SITE_NAME.$ZONE:8889
+       RALF_HOSTNAME=ralf.$SITE_NAME.$ZONE:10888
+       RALF_SESSION_STORE=vellum.$ZONE
+       XDMS_HOSTNAME=homer.$SITE_NAME.$ZONE:7888
+       CHRONOS_HOSTNAME=vellum.$SITE_NAME.$ZONE
+       CASSANDRA_HOSTNAME=vellum.$SITE_NAME.$ZONE
+else
+       VELLUM_IP=$PRIVATE_IP
+       HOMESTEAD_IP=$PRIVATE_IP
+       HOMER_IP=$PRIVATE_IP
+
+       SPROUT_HOSTNAME=$PUBLIC_HOSTNAME
+       SPROUT_REGISTRATION_STORE=$VELLUM_IP
+       HS_HOSTNAME=$HOMESTEAD_IP:8888
+       HS_PROVISIONING_HOSTNAME=$HOMESTEAD_IP:8889
+       RALF_HOSTNAME=
+       RALF_SESSION_STORE=
+       XDMS_HOSTNAME=$HOMER_IP:7888
+       CHRONOS_HOSTNAME=
+       CASSANDRA_HOSTNAME=
+fi
+
+mkdir --parents /etc/clearwater
+CONFIG_FILE=/etc/clearwater/shared_config
+echo "# Created by ARIA on $(date -u)" > "$CONFIG_FILE"
+
+echo >> "$CONFIG_FILE"
+echo "# Deployment definitions" >> "$CONFIG_FILE"
+echo "home_domain=$ZONE" >> "$CONFIG_FILE"
+echo "sprout_hostname=$SPROUT_HOSTNAME" >> "$CONFIG_FILE"
+echo "sprout_registration_store=$SPROUT_REGISTRATION_STORE" >> "$CONFIG_FILE"
+echo "hs_hostname=$HS_HOSTNAME" >> "$CONFIG_FILE"
+echo "hs_provisioning_hostname=$HS_PROVISIONING_HOSTNAME" >> "$CONFIG_FILE"
+echo "ralf_hostname=$RALF_HOSTNAME" >> "$CONFIG_FILE"
+echo "ralf_session_store=$RALF_SESSION_STORE" >> "$CONFIG_FILE"
+echo "xdms_hostname=$XDMS_HOSTNAME" >> "$CONFIG_FILE"
+echo "chronos_hostname=$CHRONOS_HOSTNAME" >> "$CONFIG_FILE"
+echo "cassandra_hostname=$CASSANDRA_HOSTNAME" >> "$CONFIG_FILE"
+
+echo >> "$CONFIG_FILE"
+echo "# Email server configuration" >> "$CONFIG_FILE"
+echo "smtp_smarthost=$SMTP_HOSTNAME" >> "$CONFIG_FILE"
+echo "smtp_username=$SMTP_USERNAME" >> "$CONFIG_FILE"
+echo "smtp_password=$SMTP_PASSWORD" >> "$CONFIG_FILE"
+echo "email_recovery_sender=clearwater@$ZONE" >> "$CONFIG_FILE"
+
+echo >> "$CONFIG_FILE"
+echo "# I-CSCF/S-CSCF configuration (used by Bono to proxy to Sprout)" >> 
"$CONFIG_FILE"
+echo "upstream_hostname=scscf.$HOSTNAME" >> "$CONFIG_FILE"
+
+echo >> "$CONFIG_FILE"
+echo "# Keys" >> "$CONFIG_FILE"
+echo "signup_key=$SECRET" >> "$CONFIG_FILE"
+echo "turn_workaround=$SECRET" >> "$CONFIG_FILE"
+echo "ellis_api_key=$SECRET" >> "$CONFIG_FILE"
+echo "ellis_cookie_key=$SECRET" >> "$CONFIG_FILE"
+
+if [ "$REDUCE_CASSANDRA_MEM_USAGE" = True ]; then
+       echo >> "$CONFIG_FILE"
+       echo "# $REDUCE_CASSANDRA_MEM_USAGE" >> "$CONFIG_FILE"
+       echo "reduce_cassandra_mem_usage=Y" >> "$CONFIG_FILE"
+fi
+
+# Copy to other hosts in etcd group
+#yes | aptdcon --hide-terminal --install clearwater-config-manager
+#cw-upload_shared_config

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/memento/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/memento/create.sh 
b/examples/clearwater/scripts/memento/create.sh
new file mode 100644
index 0000000..6894015
--- /dev/null
+++ b/examples/clearwater/scripts/memento/create.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -e
+
+yes | aptdcon --hide-terminal --install memento-as memento-nginx

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/memento/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/memento/delete.sh 
b/examples/clearwater/scripts/memento/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/ralf/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/ralf/create.sh 
b/examples/clearwater/scripts/ralf/create.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/ralf/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/ralf/delete.sh 
b/examples/clearwater/scripts/ralf/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/sprout/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/sprout/create.sh 
b/examples/clearwater/scripts/sprout/create.sh
new file mode 100644
index 0000000..c8161e7
--- /dev/null
+++ b/examples/clearwater/scripts/sprout/create.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -e
+
+yes | aptdcon --hide-terminal --install sprout

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/sprout/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/sprout/delete.sh 
b/examples/clearwater/scripts/sprout/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/vellum/create.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/vellum/create.sh 
b/examples/clearwater/scripts/vellum/create.sh
new file mode 100644
index 0000000..98b9d42
--- /dev/null
+++ b/examples/clearwater/scripts/vellum/create.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+set -e
+
+yes | aptdcon --hide-terminal --install vellum
+
+# Memento
+# TODO: see if there is a Memento node
+#yes | aptdcon --hide-terminal --install memento-cassandra

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/scripts/vellum/delete.sh
----------------------------------------------------------------------
diff --git a/examples/clearwater/scripts/vellum/delete.sh 
b/examples/clearwater/scripts/vellum/delete.sh
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/types/cassandra.yaml
----------------------------------------------------------------------
diff --git a/examples/clearwater/types/cassandra.yaml 
b/examples/clearwater/types/cassandra.yaml
new file mode 100644
index 0000000..10ad34f
--- /dev/null
+++ b/examples/clearwater/types/cassandra.yaml
@@ -0,0 +1,16 @@
+
+capability_types:
+
+  cassandra.Endpoint:
+    derived_from: tosca.capabilities.Endpoint.Database
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 7000
+
+  cassandra.Endpoint.Thrift:
+    derived_from: tosca.capabilities.Endpoint.Database
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 9160

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/types/clearwater.yaml
----------------------------------------------------------------------
diff --git a/examples/clearwater/types/clearwater.yaml 
b/examples/clearwater/types/clearwater.yaml
new file mode 100644
index 0000000..cea7b52
--- /dev/null
+++ b/examples/clearwater/types/clearwater.yaml
@@ -0,0 +1,673 @@
+
+imports:
+  - ims.yaml
+  - smtp.yaml
+  - cassandra.yaml
+
+dsl_definitions:
+
+  clearwater_operation_dependencies: &CLEARWATER_OPERATION_DEPENDENCIES
+    - "ssh.user > { get_property: [ HOST, host, ssh.user ] }"
+    - "ssh.password > { get_property: [ HOST, host, ssh.password ] }"
+    - "ssh.address > { get_attribute: [ HOST, public_address ] }"
+    - "ssh.use_sudo > true"
+
+policy_types:
+
+  clearwater.Configuration:
+    derived_from: tosca.policies.Root
+    properties:
+      zone:
+        description: >-
+          The domain name for SIP addresses, for example if its "example.com" 
then a SIP address
+          could be "6505550...@example.com".
+        type: string
+      geographically_redundant:
+        description: >-
+          Enable a geographically redundant deployment.
+        
+          See: 
http://clearwater.readthedocs.io/en/stable/Geographic_redundancy.html
+        type: boolean
+        default: false
+      site_name:
+        description: >-
+          Used by geographically redundant deployments.
+        type: string
+      secret:
+        description: >-
+          Used for registration via Ellis.
+        type: string
+
+capability_types:
+
+  clearwater.Container:
+    description: >-
+      Clearwater container capability.
+    derived_from: tosca.capabilities.Container
+    properties:
+      ssh.user:
+        type: string
+      ssh.password:
+        type: string
+      max_log_directory_size:
+        type: scalar-unit.size
+        default: 0 B # 0 means no max size
+      reduce_cassandra_mem_usage:
+        type: boolean
+        default: false
+
+  # http://clearwater.readthedocs.io/en/stable/Clearwater_IP_Port_Usage.html
+
+  # SIP endpoints
+
+  clearwater.Endpoint.SIP.Upstream:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: sip
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 5052
+
+  clearwater.Endpoint.SIP.Upstream.Secure:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: sip
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 5054
+      secure: # override
+        type: boolean
+        default: true
+
+  clearwater.Endpoint.SIP.Proxy:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: sip
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 5058
+
+  clearwater.Endpoint.SIP.Public:
+    derived_from: tosca.capabilities.Endpoint.Public
+    properties:
+      protocol: # override
+        type: string
+        default: sip
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 5060
+
+  clearwater.Endpoint.SIP.Public.Secure:
+    derived_from: tosca.capabilities.Endpoint.Public
+    properties:
+      protocol: # override
+        type: string
+        default: sip
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 5062
+      secure: # override
+        type: boolean
+        default: true
+
+  # STUN endpoints
+
+  clearwater.Endpoint.STUN:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: stun
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 3478
+
+  # Diameter endpoints
+
+  clearwater.Endpoint.Diameter.HSS:
+    description: >-
+      In shared_config: hs_listen_port
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: diameter
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 3868
+
+  clearwater.Endpoint.Diameter.CTF:
+    description: >-
+      In shared_config: ralf_listen_port
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: diameter
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 3869
+
+  # Management endpoints
+
+  clearwater.Endpoint.Management.Homer:
+    derived_from: ims.interfaces.HTTP
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 7888
+
+  clearwater.Endpoint.Management.Homestead:
+    derived_from: ims.interfaces.HTTP
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 8888
+
+  clearwater.Endpoint.Management.Homestead.Provisioning:
+    description: >-
+      In shared_config: homestead_provisioning_port
+    derived_from: ims.interfaces.HTTP
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 8889
+
+  clearwater.Endpoint.Management.Sprout:
+    derived_from: ims.interfaces.HTTP
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 9886
+
+  clearwater.Endpoint.Management.Ralf:
+    derived_from: ims.interfaces.HTTP
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 9888 # note: some documentation shows 10888
+
+  # Web endpoints
+
+  clearwater.Endpoint.Public.Web:
+    derived_from: tosca.capabilities.Endpoint.Public
+    properties:
+      protocol: # override
+        type: string
+        default: http
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 80
+      url_path: # override
+        type: string
+        default: /
+
+  clearwater.Endpoint.Public.Web.Secure:
+    derived_from: tosca.capabilities.Endpoint.Public
+    properties:
+      protocol: # override
+        type: string
+        default: https
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 443
+      secure: # override
+        type: boolean
+        default: true
+      url_path: # override
+        type: string
+        default: /        
+
+  # Other endpoints
+
+  clearwater.Endpoint.Chronos:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 7253
+
+  clearwater.Endpoint.Memcached:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 11211
+
+  clearwater.Endpoint.Astaire:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      port: # override
+        type: tosca.datatypes.network.PortDef
+        default: 11311
+
+data_types:
+
+  clearwater.Number:
+    derived_from: string
+    constraints:
+      - pattern: '^\d{10}$'
+
+node_types:
+
+  # http://clearwater.readthedocs.io/en/stable/Clearwater_Architecture.html
+
+  clearwater.SoftwareComponent:
+    description: >-
+      Clearwater software components must be installed in a Clearwater-capable 
compute node.
+    derived_from: tosca.nodes.SoftwareComponent
+    requirements:
+      - host: # override
+          capability: clearwater.Container
+          relationship: tosca.relationships.HostedOn
+
+  clearwater.Bono:
+    description: >-
+      Clearwater edge proxy.
+
+      The Bono nodes form a horizontally scalable SIP edge proxy providing 
both a SIP IMS Gm
+      compliant interface and a WebRTC interface to clients. Client 
connections are load balanced
+      across the nodes. The Bono node provides the anchor point for the 
client's connection to the
+      Clearwater system, including support for various NAT traversal 
mechanisms. A client is
+      therefore anchored to a particular Bono node for the duration of its 
registration, but can
+      move to another Bono node if the connection or client fails.
+
+      Clients can connect to Bono using SIP/UDP or SIP/TCP. Bono supports any 
WebRTC client that
+      performs call setup signaling using SIP over WebSocket.
+
+      Alternatively, Clearwater can be deployed with a third party P-CSCF or 
Session Border
+      Controller implementing P-CSCF. In this case Bono nodes are not required.
+    derived_from: clearwater.SoftwareComponent
+    capabilities:
+      p-cscf: ims.functions.P-CSCF
+      gm: ims.interfaces.Gm
+      sip_endpoint: clearwater.Endpoint.SIP.Public
+      sip_secure_endpoint: clearwater.Endpoint.SIP.Public.Secure
+      sip_proxy: clearwater.Endpoint.SIP.Proxy # open to Sprout
+      stun_endoint: clearwater.Endpoint.STUN
+    requirements:
+      - sip_downstream:
+          capability: clearwater.Endpoint.SIP.Upstream
+          occurrences: [ 0, UNBOUNDED ]       
+      - sip_secure_downstream:
+          capability: clearwater.Endpoint.SIP.Upstream.Secure
+          occurrences: [ 0, UNBOUNDED ]       
+      - ralf: # for billable events
+          capability: clearwater.Endpoint.Management.Ralf
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/bono/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/bono/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.Sprout:
+    description: >-
+      Clearwater SIP router.
+
+      The Sprout nodes act as a horizontally scalable, combined SIP registrar 
and authoritative
+      routing proxy, and handle client authentication and the ISC interface to 
application servers.
+      The Sprout nodes also contain the in-built MMTEL application server. SIP 
transactions are load
+      balanced across the Sprout cluster, so there is no long-lived 
association between a client and
+      a particular Sprout node. Sprout does not store any long-lived data 
itself and instead uses
+      web service interfaces to Homestead and Homer to retrieve HSS 
configuration such as
+      authentication data/user profiles and MMTEL service settings APIs to 
Vellum for storing
+      subscriber registration data and for running timers.
+
+      Sprout is where the bulk of the I-CSCF and S-CSCF function resides, with 
the remainder
+      provided by Dime (and backed by the long-lived data stores on Vellum).   
         
+    derived_from: clearwater.SoftwareComponent
+    capabilities:
+      sip_endpoint: clearwater.Endpoint.SIP.Upstream # open to Bono
+      sip_secure_endpoint: clearwater.Endpoint.SIP.Upstream.Secure # open to 
Bono
+      management_endpoint: clearwater.Endpoint.Management.Sprout
+      memento:
+        type: tosca.capabilities.Container
+        valid_source_types: [ clearwater.Memento ]
+    requirements:
+# cyclical: see ARIA-327
+#      - sip_upstream:
+#          capability: clearwater.Endpoint.SIP.Proxy      
+#          occurrences: [ 0, UNBOUNDED ]       
+      - homer: # for subscriber profiles
+          capability: clearwater.Endpoint.Management.Homer
+      - ralf: # for billable events
+          capability: clearwater.Endpoint.Management.Ralf
+      - chronos:
+          capability: clearwater.Endpoint.Chronos
+          node: clearwater.Vellum
+      - astaire:
+          capability: clearwater.Endpoint.Astaire
+          node: clearwater.Vellum
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/sprout/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/sprout/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.Memento:
+    derived_from: tosca.nodes.Root
+    capabilities:
+      sip-as: ims.functions.SIP-AS
+      web_secure_endpoint: clearwater.Endpoint.Public.Web.Secure
+    requirements:
+      - host:
+          capability: tosca.capabilities.Container
+          node: clearwater.Sprout
+      - cassandra_thrift:
+          capability: cassandra.Endpoint.Thrift
+          node: clearwater.Vellum
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/memento/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/memento/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.Dime:
+    description: >-
+      Clearwater Diameter gateway.
+
+      Dime nodes run Clearwater's Homestead and Ralf components.
+    derived_from: clearwater.SoftwareComponent
+    capabilities:
+      host:
+         type: tosca.capabilities.Container
+         valid_source_types: [ clearwater.DimeSoftwareComponent ]
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/dime/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/dime/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.DimeSoftwareComponent:
+    description: >-
+      Base type for Dime software components.
+    derived_from: clearwater.SoftwareComponent
+    requirements:
+      - host: # override
+          capability: tosca.capabilities.Container
+          node: clearwater.Dime
+
+  clearwater.Homestead:
+    description: >-
+      Clearwater HSS cache.
+
+      Homestead provides a web services interface to Sprout for retrieving 
authentication
+      credentials and user profile information. It can either master the data 
(in which case it
+      exposes a web services provisioning interface) or can pull the data from 
an IMS compliant HSS
+      over the Cx interface. The Homestead nodes themselves are stateless - 
the mastered / cached
+      subscriber data is all stored on Vellum (via Cassandra's Thrift 
interface).
+
+      In the IMS architecture, the HSS mirror function is considered to be 
part of the I-CSCF and
+      S-CSCF components, so in Clearwater I-CSCF and S-CSCF function is 
implemented with a
+      combination of Sprout and Dime clusters.
+    derived_from: clearwater.DimeSoftwareComponent
+    capabilities:
+      hss: ims.functions.HSS
+      cx: ims.interfaces.Cx
+      diameter_endpoint: clearwater.Endpoint.Diameter.HSS
+      management_endpoint: clearwater.Endpoint.Management.Homestead # open to 
Ellis
+      provisioning_management_endpoint: 
clearwater.Endpoint.Management.Homestead.Provisioning # open to Ellis
+    requirements:
+      - cassandra_thrift:
+          capability: cassandra.Endpoint.Thrift
+          node: clearwater.Vellum
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/homestead/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/homestead/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.Ralf:
+    description: >-
+      Clearwater CTF.
+
+      Ralf provides an HTTP API that both Bono and Sprout can use to report 
billable events that
+      should be passed to the CDF (Charging Data Function) over the Rf billing 
interface. Ralf is
+      stateless, using Vellum to maintain the long lived session state and run 
the timers necessary
+      to enable it to conform to the Rf protocol.
+    derived_from: clearwater.DimeSoftwareComponent
+    capabilities:
+      ctf: ims.functions.CTF
+      rf: ims.interfaces.Rf
+      diameter_endpoint: clearwater.Endpoint.Diameter.CTF
+      management_endpoint: clearwater.Endpoint.Management.Ralf # open to 
Sprout, Bono, Vellum
+    requirements:
+      - chronos:
+          capability: clearwater.Endpoint.Chronos
+          node: clearwater.Vellum
+      - astaire:
+          capability: clearwater.Endpoint.Astaire
+          node: clearwater.Vellum
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/ralf/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/ralf/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.Vellum:
+    description: >-
+      Clearwater state store.
+
+      Vellum is used to maintain all long-lived state in the deployment. It 
does this by running a
+      number of cloud optimized, distributed storage clusters.
+
+      - Cassandra. Cassandra is used by Homestead to store authentication 
credentials and profile
+      information, and is used by Homer to store MMTEL service settings. 
Vellum exposes Cassandra's
+      Thrift API.
+
+      - etcd. etcd is used by Vellum itself to share clustering information 
between Vellum nodes and
+      by other nodes in the deployment for shared configuration.
+
+      - Chronos. Chronos is a distributed, redundant, reliable timer service 
developed by
+      Clearwater. It is used by Sprout and Ralf nodes to enable timers to be 
run (e.g. for SIP
+      Registration expiry) without pinning operations to a specific node (one 
node can set the timer
+      and another act on it when it pops). Chronos is accessed via an HTTP API.
+
+      - Memcached / Astaire. Vellum also runs a Memcached cluster fronted by 
Astaire. Astaire is a
+      service developed by Clearwater that enabled more rapid scale up and 
scale down of memcached
+      clusters. This cluster is used by Sprout and Ralf for storing 
registration and session state.
+    derived_from: clearwater.SoftwareComponent
+    capabilities:
+      cassandra_endpoint: cassandra.Endpoint # open to other Vellum
+      cassandra_thrift_endpoint: cassandra.Endpoint.Thrift # open to Homer, 
Dime (Homestead), Sprout (Memento)
+      chronos_endpoint: clearwater.Endpoint.Chronos # open to other Vellum, 
Sprout, Dime (Ralf)
+      memcached_endpoint: clearwater.Endpoint.Memcached # open to other Vellum
+      astaire_endpoint: clearwater.Endpoint.Astaire # open to Sprout, Dime 
(Ralf)
+# cyclical: see ARIA-327
+#    requirements:
+#      - ralf:
+#          capability: clearwater.Endpoint.Management.Ralf
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/vellum/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/vellum/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.Homer:
+    description: >-
+      Clearwater XDMS.
+
+      Homer is a standard XDMS used to store MMTEL service settings documents 
for each user of the
+      system. Documents are created, read, updated and deleted using a 
standard XCAP interface. As
+      with Homestead, the Homer nodes use Vellum as the data store for all 
long lived data.
+    derived_from: clearwater.SoftwareComponent
+    capabilities:
+      xdms: ims.functions.XDMS
+      management_endpoint: clearwater.Endpoint.Management.Homer # open to 
Sprout, Ellis
+    requirements:
+      - cassandra_thrift:
+          capability: cassandra.Endpoint.Thrift
+          node: clearwater.Vellum
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/homer/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/homer/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.Ellis:
+    description: >-
+      Ellis is a sample provisioning portal providing self sign-up, password 
management, line
+      management and control of MMTEL service settings. It is not intended to 
be a part of
+      production Clearwater deployments (it is not easy to horizontally scale 
because of the MySQL
+      underpinnings for one thing) but to make the system easy to use out of 
the box.
+    derived_from: clearwater.SoftwareComponent
+    properties:
+      provision_numbers_start:
+        type: clearwater.Number
+        default: '6505550000'
+      provision_numbers_count:
+        type: integer
+        default: 0 # 0 means do not provision numbers
+        constraints:
+          - greater_or_equal: 0
+    capabilities:
+      web_endpoint: clearwater.Endpoint.Public.Web
+      web_secure_endpoint: clearwater.Endpoint.Public.Web.Secure
+    requirements:
+      - homer: # for subscriber profiles
+          capability: clearwater.Endpoint.Management.Homer
+      - homestead: # for subscriber authentication
+          capability: clearwater.Endpoint.Management.Homestead
+      - homestead_provisioning:
+          capability: clearwater.Endpoint.Management.Homestead.Provisioning
+      - ralf: # TODO: really?
+          capability: clearwater.Endpoint.Management.Ralf
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        create:
+          implementation:
+            primary: scripts/ellis/create.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        configure:
+          implementation:
+            primary: scripts/ellis/configure.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+        delete:
+          implementation:
+            primary: scripts/ellis/delete.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+
+  clearwater.I-CSCF:
+    description: >-
+      Clearwater I-CSCF.
+
+      Logical node encompassing Sprout and Homestead. Required only if you 
need to expose the I-CSCF
+      function.
+    derived_from: tosca.nodes.Root
+    capabilities:
+      i-cscf: ims.functions.I-CSCF
+    requirements:
+      - sprout:
+          capability: tosca.capabilities.Node
+          node: clearwater.Sprout
+      - homestead:
+          capability: tosca.capabilities.Node
+          node: clearwater.Homestead
+
+  clearwater.S-CSCF:
+    description: >-
+      Clearwater S-CSCF.
+
+      Logical node encompassing Sprout and Homestead. Required only if you 
need to expose the S-CSCF
+      function.
+    derived_from: tosca.nodes.Root
+    capabilities:
+      s-cscf: ims.functions.S-CSCF
+    requirements:
+      - sprout:
+          capability: tosca.capabilities.Node
+          node: clearwater.Sprout
+      - homestead:
+          capability: tosca.capabilities.Node
+          node: clearwater.Homestead
+
+  clearwater.Host:
+    description: >-
+      Default Clearwater host.
+
+      Note that any node can function as a Clearwater host as long as it has a 
clearwater.Container
+      capability.
+    derived_from: tosca.nodes.Compute
+    interfaces:
+      Standard:
+        type: tosca.interfaces.node.lifecycle.Standard
+        configure:
+          implementation:
+            primary: scripts/host/configure.sh
+            dependencies: *CLEARWATER_OPERATION_DEPENDENCIES
+    capabilities:
+      host: # override
+        type: clearwater.Container
+        valid_source_types: [ tosca.nodes.SoftwareComponent ]
+      os: # override
+        type: tosca.capabilities.OperatingSystem
+        properties:
+          architecture:
+            type: string
+            default: x86_64
+          type:
+            type: string
+            default: linux
+          distribution:
+            type: string
+            default: ubuntu
+          version:
+            type: version
+            default: 14.04
+      smtp:
+        type: smtp.SMTP

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/types/ims.yaml
----------------------------------------------------------------------
diff --git a/examples/clearwater/types/ims.yaml 
b/examples/clearwater/types/ims.yaml
new file mode 100644
index 0000000..6a64e6e
--- /dev/null
+++ b/examples/clearwater/types/ims.yaml
@@ -0,0 +1,431 @@
+capability_types:
+
+  # https://en.wikipedia.org/wiki/IP_Multimedia_Subsystem#Core_network
+
+  ims.functions.Root:
+    derived_from: tosca.capabilities.Root
+
+  ims.functions.CTF: # not mentioned in Wikipedia
+    description: >-
+      Charging Trigger Function.
+    derived_from: ims.functions.Root
+
+  ims.functions.XDMS: # not mentioned in Wikipedia
+    description: >-
+      XML Document Management Server
+    derived_from: ims.functions.Root
+
+  ims.functions.HSS:
+    description: >-
+      The home subscriber server (HSS), or user profile server function 
(UPSF), is a master user
+      database that supports the IMS network entities that actually handle 
calls. It contains the
+      subscription-related information (subscriber profiles), performs 
authentication and
+      authorization of the user, and can provide information about the 
subscriber's location and IP
+      information. It is similar to the GSM home location register (HLR) and 
Authentication centre
+      (AuC).
+
+      A subscriber location function (SLF) is needed to map user addresses 
when multiple HSSs are
+      used.
+    derived_from: ims.functions.Root
+
+  ims.functions.CSCF:
+    description: >-
+      Several roles of SIP servers or proxies, collectively called Call 
Session Control Function
+      (CSCF), are used to process SIP signalling packets in the IMS.
+    derived_from: ims.functions.Root
+
+  ims.functions.P-CSCF:
+    description: >-
+      A Proxy-CSCF (P-CSCF) is a SIP proxy that is the first point of contact 
for the IMS terminal.
+      It can be located either in the visited network (in full IMS networks) 
or in the home network
+      (when the visited network is not IMS compliant yet). Some networks may 
use a Session Border
+      Controller (SBC) for this function. The P-CSCF is at its core a 
specialized SBC for the
+      User–network interface which not only protects the network, but also 
the IMS terminal. The use
+      of an additional SBC between the IMS terminal and the P-CSCF is 
unnecessary and infeasible due
+      to the signaling being encrypted on this leg. The terminal discovers its 
P-CSCF with either
+      DHCP, or it may be configured (e.g. during initial provisioning or via a 
3GPP IMS Management
+      Object (MO)) or in the ISIM or assigned in the PDP Context (in General 
Packet Radio Service
+      (GPRS)).
+    derived_from: ims.functions.CSCF
+
+  ims.functions.I-CSCF:
+    description: >-
+      An Interrogating-CSCF (I-CSCF) is another SIP function located at the 
edge of an
+      administrative domain. Its IP address is published in the Domain Name 
System (DNS) of the
+      domain (using NAPTR and SRV type of DNS records), so that remote servers 
can find it, and use
+      it as a forwarding point (e.g., registering) for SIP packets to this 
domain.
+    derived_from: ims.functions.CSCF
+
+  ims.functions.S-CSCF:
+    description: >-
+      A Serving-CSCF (S-CSCF) is the central node of the signalling plane. It 
is a SIP server, but
+      performs session control too. It is always located in the home network. 
It uses Diameter Cx
+      and Dx interfaces to the HSS to download user profiles and upload 
user-to-S-CSCF associations
+      (the user profile is only cached locally for processing reasons only and 
is not changed). All
+      necessary subscriber profile information is loaded from the HSS.
+    derived_from: ims.functions.CSCF
+
+  ims.functions.AS:
+    description: >-
+      SIP Application servers (AS) host and execute services, and interface 
with the S-CSCF using
+      SIP. An example of an application server that is being developed in 3GPP 
is the Voice call
+      continuity Function (VCC Server). Depending on the actual service, the 
AS can operate in SIP
+      proxy mode, SIP UA (user agent) mode or SIP B2BUA mode. An AS can be 
located in the home
+      network or in an external third-party network. If located in the home 
network, it can query
+      the HSS with the Diameter Sh or Si interfaces (for a SIP-AS).
+    derived_from: ims.functions.Root
+
+  ims.functions.SIP-AS:
+    description: >-
+      Host and execute IMS specific services.
+    derived_from: ims.functions.AS
+
+  ims.functions.IM-SSF:
+    description: >-
+      IP Multimedia Service Switching Function. Interfaces SIP to CAP to 
communicate with CAMEL
+      Application Servers.
+    derived_from: ims.functions.AS
+
+  ims.functions.OSA-SCS:
+    description: >-
+      OSA service capability server. Interfaces SIP to the OSA framework.
+    derived_from: ims.functions.AS
+
+  ims.functions.AS-ILCM:
+    description: >-
+      The AS-ILCM (Application Server - Incoming Leg Control Model) stores 
transaction state, and
+      may optionally store session state depending on the specific service 
being executed. The
+      AS-ILCM interfaces to the S-CSCF (ILCM) for an incoming leg. Application 
Logic provides the
+      service(s) and interacts between the AS-ILCM and AS-OLCM.
+    derived_from: ims.functions.AS
+
+  ims.functions.AS-OLCM:
+    description: >-
+      The AS-OLCM (Application Server - Outgoing Leg Control Model) stores 
transaction state, and
+      may optionally store session state depending on the specific service 
being executed. The
+      AS-OLCM interfaces to the S-CSCF (OLCM) for an outgoing leg. Application 
Logic provides the
+      service(s) and interacts between the AS-ILCM and AS-OLCM.
+    derived_from: ims.functions.AS
+
+  ims.functions.MRF:
+    description: >-
+      The Media Resource Function (MRF) provides media related functions such 
as media manipulation
+      (e.g. voice stream mixing) and playing of tones and announcements.
+
+      Each MRF is further divided into a media resource function controller 
(MRFC) and a media
+      resource function processor (MRFP).
+    derived_from: ims.functions.Root
+
+  ims.functions.MRFC:
+    description: >-
+      The MRFC is a signalling plane node that interprets information coming 
from an AS and S-CSCF
+      to control the MRFP.
+    derived_from: ims.functions.Root
+
+  ims.functions.MRFP:
+    description: >-
+      The MRFP is a media plane node used to mix, source or process media 
streams. It can also
+      manage access right to shared resources.
+    derived_from: ims.functions.Root
+
+  ims.functions.MRB:
+    description: >-
+      The Media Resource Broker (MRB) is a functional entity that is 
responsible for both collection
+      of appropriate published MRF information and supplying of appropriate 
MRF information to
+      consuming entities such as the AS. MRB can be used in two modes:
+      * Query mode: AS queries the MRB for media and sets up the call using 
the response of MRB
+      * In-Line Mode: AS sends a SIP INVITE to the MRB. The MRB sets up the 
call
+    derived_from: ims.functions.Root
+
+  ims.functions.BGCF:
+    description: >-
+      A Breakout Gateway Control Function (BGCF) is a SIP proxy which 
processes requests for routing
+      from an S-CSCF when the S-CSCF has determined that the session cannot be 
routed using DNS or
+      ENUM/DNS. It includes routing functionality based on telephone numbers.
+    derived_from: ims.functions.Root
+
+  ims.functions.PTSNGateway:
+    description: >-
+      A PSTN/CS gateway interfaces with PSTN circuit switched (CS) networks. 
For signalling, CS
+      networks use ISDN User Part (ISUP) (or BICC) over Message Transfer Part 
(MTP), while IMS uses
+      SIP over IP. For media, CS networks use Pulse-code modulation (PCM), 
while IMS uses Real-time
+      Transport Protocol (RTP).
+    derived_from: ims.functions.Root
+
+  ims.functions.SGW:
+    description: >-
+      A signalling gateway (SGW) interfaces with the signalling plane of the 
CS. It transforms lower
+      layer protocols as Stream Control Transmission Protocol (SCTP, an IP 
protocol) into Message
+      Transfer Part (MTP, an Signalling System 7 (SS7) protocol), to pass ISDN 
User Part (ISUP) from
+      the MGCF to the CS network.
+    derived_from: ims.functions.PTSNGateway
+
+  ims.functions.MGCF:
+    description: >-
+      A media gateway controller function (MGCF) is a SIP endpoint that does 
call control protocol
+      conversion between SIP and ISUP/BICC and interfaces with the SGW over 
SCTP. It also controls
+      the resources in a Media Gateway (MGW) across an H.248 interface.
+    derived_from: ims.functions.PTSNGateway
+
+  ims.functions.MGW:
+    description: >-
+      A media gateway (MGW) interfaces with the media plane of the CS network, 
by converting between
+      RTP and PCM. It can also transcode when the codecs don't match (e.g., 
IMS might use AMR, PSTN
+      might use G.711).
+    derived_from: ims.functions.PTSNGateway
+
+  # 
https://en.wikipedia.org/wiki/IP_Multimedia_Subsystem#Interfaces_description
+
+  ims.interfaces.Diameter:
+    derived_from: tosca.capabilities.Endpoint
+
+  ims.interfaces.TCP:
+    derived_from: tosca.capabilities.Endpoint
+
+  ims.interfaces.SIP:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: sip
+
+  ims.interfaces.RTP:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: rtp
+
+  ims.interfaces.H248:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: h248
+
+  ims.interfaces.HTTP:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: http
+
+  ims.interfaces.MAP:
+    derived_from: tosca.capabilities.Endpoint
+    properties:
+      protocol: # override
+        type: string
+        default: map
+
+  ims.interfaces.Cr:
+    description: >-
+      Used by MRFC to fetch documents (e.g. scripts, announcement files, and 
other resources) from
+      an AS. Also used for media control related commands.
+    derived_from: ims.interfaces.TCP
+
+  ims.interfaces.Cx:
+    description: >-
+      Used to send subscriber data to the S-CSCF; including filter criteria 
and their priority. Also
+      used to furnish CDF and/or OCF addresses.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Dh:
+    description: >-
+      Used by AS to find the HSS holding the user profile information in a 
multi-HSS environment.
+      DH_SLF_QUERY indicates an IMPU and DX_SLF_RESP return the HSS name.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Dx:
+    description: >-
+      Used by I-CSCF or S-CSCF to find a correct HSS in a multi-HSS 
environment. DX_SLF_QUERY
+      indicates an IMPU and DX_SLF_RESP return the HSS name.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Gm:
+    description: >-
+      Used to exchange messages between SIP user equipment (UE) or Voip 
gateway and P-CSCF.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Go:
+    description: >-
+      Allows operators to control QoS in a user plane and exchange charging 
correlation
+      information between IMS and GPRS network.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Gq:
+    description: >-
+      Used to exchange policy decisions-related information between P-CSCF and 
PDF.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Gx:
+    description: >-
+      Used to exchange policy decisions-related information between PCEF and 
PCRF.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Gy:
+    description: >-
+      Used for online flow-based bearer charging. Functionally equivalent to 
Ro interface.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.ISC:
+    description: >-
+      Reference point between S-CSCF and AS. Main functions are to:
+      * Notify the AS of the registered IMPU, registration state and UE 
capabilities
+      * Supply the AS with information to allow it to execute multiple services
+      * Convey charging function addresses
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Ici:
+    description: >-
+      Used to exchange messages between an IBCF and another IBCF belonging to 
a different IMS
+      network.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Izi:
+    description: >-
+      Used to forward media streams from a TrGW to another TrGW belonging to a 
different IMS
+      network.
+    derived_from: ims.interfaces.RTP
+
+  ims.interfaces.Ma:
+    description: >-
+      Main functions are to:
+      * Forward SIP requests which are destined to a public service identity 
hosted by the AS
+      * Originate a session on behalf of a user or public service identity, if 
the AS has no
+        knowledge of a S-CSCF assigned to that user or public service identity
+      * Convey charging function addresses
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mg:
+    description: >-
+      ISUP signalling to SIP signalling and forwards SIP signalling to I-CSCF.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mi:
+    description: >-
+      Used to exchange messages between S-CSCF and BGCF.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mj:
+    description: >-
+      Used for the interworking with the PSTN/CS domain, when the BGCF has 
determined that a
+      breakout should occur in the same IMS network to send SIP message from 
BGCF to MGCF.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mk:
+    description: >-
+      Used for the interworking with the PSTN/CS domain, when the BGCF has 
determined that a
+      breakout should occur in another IMS network to send SIP message from 
BGCF to the BGCF in the
+      other network.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mm:
+    description: >-
+      Used for exchanging messages between IMS and external IP networks.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mn:
+    description: >-
+      Allows control of user-plane resources.
+    derived_from: ims.interfaces.H248
+
+  ims.interfaces.Mp:
+    description: >-
+      Allows an MRFC to control media stream resources provided by an MRFP.
+    derived_from: ims.interfaces.H248
+
+  ims.interfaces.Mr:
+    description: >-
+      Used to exchange information between S-CSCF and MRFC.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mr2:
+    description: >-
+      Used to exchange session controls between AS and MRFC.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mw:
+    description: >-
+      Used to exchange messages between CSCFs. AGCF appears as a P-CSCF to the 
other CSCFs.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Mx:
+    description: >-
+      Used for the interworking with another IMS network, when the BGCF has 
determined that a
+      breakout should occur in the other IMS network to send SIP message from 
BGCF to the IBCF in
+      the other network.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.P1:
+    description: >-
+      Used for call control services by AGCF to control H.248 A-MGW and 
residential gateways.
+    derived_from: ims.interfaces.H248
+
+  ims.interfaces.P2:
+    description: >-
+      Reference point between AGCF and CSCF.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Rc:
+    description: >-
+      Used by the AS to request that media resources be assigned to a call 
when using MRB in-line
+      mode or in query mode.
+    derived_from: ims.interfaces.SIP
+
+  ims.interfaces.Rf:
+    description: >-
+      Used to exchange offline charging information with CDF.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Ro:
+    description: >-
+        Used to exchange online charging information with OCF.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Rx:
+    description: >-
+      Used to exchange policy and charging related information between P-CSCF 
and PCRF. Replacement
+      for the Gq reference point.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Sh:
+    description: >-
+      Used to exchange User Profile information (e.g., user-related data, 
group lists,
+      user-service-related information or user location information or 
charging function addresses
+      (used when the AS has not received the third-party REGISTER for a user)) 
between an AS (SIP
+      AS or OSA SCS) and HSS. Also allow AS to activate/deactivate filter 
criteria stored in the HSS
+      on a per-subscriber basis.
+    derived_from: ims.interfaces.Diameter
+
+  ims.interfaces.Si:
+    description: >-
+      Transports CAMEL subscription information, including triggers for use by 
CAMEL-based
+      application services information.
+    derived_from: ims.interfaces.MAP
+
+  ims.interfaces.Sr:
+    description: >-
+      Used by MRFC to fetch documents (scripts and other resources) from an AS.
+    derived_from: ims.interfaces.HTTP
+
+  ims.interfaces.Ut:
+    description: >-
+      Facilitates the management of subscriber information related to services 
and settings.
+    derived_from: ims.interfaces.HTTP
+
+  ims.interfaces.Z:
+    description: >-
+      Conversion of POTS services to SIP messages.
+    derived_from: tosca.capabilities.Root
+
+node_types:
+
+  ims.nodes.IMS:
+    derived_from: tosca.nodes.Root
+    capabilities:
+      p-cscf: ims.functions.P-CSCF
+      i-cscf: ims.functions.I-CSCF
+      s-cscf: ims.functions.S-CSCF
+      hss: ims.functions.HSS
+      ctf: ims.functions.CTF
+      xdms: ims.functions.XDMS

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/clearwater/types/smtp.yaml
----------------------------------------------------------------------
diff --git a/examples/clearwater/types/smtp.yaml 
b/examples/clearwater/types/smtp.yaml
new file mode 100644
index 0000000..b79d9d2
--- /dev/null
+++ b/examples/clearwater/types/smtp.yaml
@@ -0,0 +1,21 @@
+
+capability_types:
+
+  smtp.SMTP:
+    derived_from: tosca.capabilities.Root
+    properties:
+      username:
+        type: string
+      password:
+        type: string
+
+node_types:
+
+  smtp.SMTP:
+    derived_from: tosca.nodes.SoftwareComponent
+    properties:
+      address:
+        type: string
+    capabilities:
+      smtp:
+        type: smtp.SMTP

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/hello-world/hello-world.yaml
----------------------------------------------------------------------
diff --git a/examples/hello-world/hello-world.yaml 
b/examples/hello-world/hello-world.yaml
new file mode 100644
index 0000000..86e2ad0
--- /dev/null
+++ b/examples/hello-world/hello-world.yaml
@@ -0,0 +1,38 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+node_types:
+
+  WebServer:
+    derived_from: tosca:Root
+    capabilities:
+      host:
+        type: tosca:Container
+
+  WebApp:
+    derived_from: tosca:WebApplication
+    properties:
+      port:
+        type: integer
+
+topology_template:
+
+  node_templates:
+    web_server:
+      type: WebServer
+
+    web_app:
+      type: WebApp
+      properties:
+        port: 9090
+      requirements:
+        - host: web_server
+      interfaces:
+        Standard:
+          configure: scripts/configure.sh
+          start: scripts/start.sh
+          stop: scripts/stop.sh
+
+  outputs:
+    port:
+      type: integer
+      value: { get_property: [ web_app, port ] }

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/hello-world/helloworld.yaml
----------------------------------------------------------------------
diff --git a/examples/hello-world/helloworld.yaml 
b/examples/hello-world/helloworld.yaml
deleted file mode 100644
index 2fdc4d4..0000000
--- a/examples/hello-world/helloworld.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_0
-
-node_types:
-
-  WebServer:
-    derived_from: tosca:Root
-    capabilities:
-      host:
-        type: tosca.capabilities.Container
-
-  WebApp:
-    derived_from: tosca.nodes.WebApplication
-    properties:
-      port:
-        type: integer
-
-topology_template:
-
-  node_templates:
-    web_server:
-      type: WebServer
-
-    web_app:
-      type: WebApp
-      properties:
-        port: 9090
-      requirements:
-        - host: web_server
-      interfaces:
-        Standard:
-          configure: scripts/configure.sh
-          start: scripts/start.sh
-          stop: scripts/stop.sh
-
-  outputs:
-    port:
-      type: integer
-      value: { get_property: [ web_app, port ] }

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml
----------------------------------------------------------------------
diff --git 
a/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml 
b/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml
index b912fb2..8b3bab3 100644
--- a/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml
+++ b/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml
@@ -24,7 +24,7 @@ topology_template:
     storage_snapshot_id:
       type: string
       description: >-
-        Optional identifier for an existing snapshot to use when creating 
storage.    
+        Optional identifier for an existing snapshot to use when creating 
storage.
     storage_location:
       type: string
       description: Block storage mount point (filesystem path).
@@ -42,8 +42,8 @@ topology_template:
         os:
           properties:
             architecture: x86_64
-            type: linux 
-            distribution: fedora 
+            type: linux
+            distribution: fedora
             version: 18.0
       requirements:
         - local_storage:

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml
----------------------------------------------------------------------
diff --git 
a/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml 
b/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml
index ac475cf..9a2c0b0 100644
--- a/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml
+++ b/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml
@@ -29,7 +29,7 @@ topology_template:
     storage_snapshot_id:
       type: string
       description: >-
-        Optional identifier for an existing snapshot to use when creating 
storage.    
+        Optional identifier for an existing snapshot to use when creating 
storage.
     storage_location:
       type: string
       description: Block storage mount point (filesystem path).
@@ -47,8 +47,8 @@ topology_template:
         os:
           properties:
             architecture: x86_64
-            type: Linux 
-            distribution: Fedora 
+            type: Linux
+            distribution: Fedora
             version: 18.0
       requirements:
         - local_storage:

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml
----------------------------------------------------------------------
diff --git 
a/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml 
b/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml
index c3f183e..0b09b34 100644
--- a/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml
+++ b/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml
@@ -38,8 +38,8 @@ topology_template:
         os:
           properties:
             architecture: x86_64
-            type: Linux 
-            distribution: Fedora 
+            type: Linux
+            distribution: Fedora
             version: 18.0
       requirements:
         - local_storage:

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml
----------------------------------------------------------------------
diff --git 
a/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml 
b/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml
index e2bdb9f..d3c2614 100644
--- a/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml
+++ b/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml
@@ -33,7 +33,7 @@ topology_template:
     storage_snapshot_id:
       type: string
       description: >-
-        Optional identifier for an existing snapshot to use when creating 
storage.    
+        Optional identifier for an existing snapshot to use when creating 
storage.
 
   node_templates:
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml
----------------------------------------------------------------------
diff --git a/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml 
b/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml
index 24f22a3..da89dcb 100644
--- a/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml
+++ b/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml
@@ -50,7 +50,7 @@ capability_types:
         required: false
       publish_ports:
         description: >-
-          List of ports mappings from source (Docker container) to target 
(host) ports to publish. 
+          List of ports mappings from source (Docker container) to target 
(host) ports to publish.
         type: list
         entry_schema: PortSpec
         required: false
@@ -118,7 +118,7 @@ node_types:
       # Further constrain the 'host' capability to only allow MySQL databases
       host:
         type: tosca.capabilities.Container # ARIA NOTE: missing in spec
-        valid_source_types: [ tosca.nodes.Database.MySQL ] 
+        valid_source_types: [ tosca.nodes.Database.MySQL ]
 
   tosca.nodes.WebServer.Apache:
     _extensions:
@@ -143,7 +143,7 @@ node_types:
         required: false # ARIA NOTE: missing in spec
     requirements:
       - database_endpoint:
-          capability: tosca.capabilities.Endpoint.Database  
+          capability: tosca.capabilities.Endpoint.Database
           node: tosca.nodes.Database
           relationship: tosca.relationships.ConnectsTo
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/32891428/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml
----------------------------------------------------------------------
diff --git 
a/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml 
b/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml
index faf109d..daa24df 100644
--- a/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml
+++ b/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml
@@ -51,11 +51,11 @@ topology_template:
         Standard:
           create: wordpress_install.sh
           configure:
-            implementation: wordpress_configure.sh           
+            implementation: wordpress_configure.sh
             inputs:
               wp_db_name: { get_property: [ mysql_database, name ] }
               wp_db_user: { get_property: [ mysql_database, user ] }
-              wp_db_password: { get_property: [ mysql_database, password ] }  
+              wp_db_password: { get_property: [ mysql_database, password ] }
               # In my own template, find requirement/capability, find port 
property
               wp_db_port: { get_property: [ SELF, database_endpoint, port ] }
 
@@ -85,7 +85,7 @@ topology_template:
         - host: server
       interfaces:
         Standard:
-          # ARIA NOTE: not declared in spec              
+          # ARIA NOTE: not declared in spec
           #inputs:
           #  db_root_password: { get_property: [ mysql_dbms, root_password ] }
           create: mysql_dbms_install.sh
@@ -112,8 +112,8 @@ topology_template:
         os:
           properties:
             architecture: x86_64
-            type: linux 
-            distribution: fedora 
+            type: linux
+            distribution: fedora
             version: 17.0
 
   outputs:

Reply via email to