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/f7d5f0f0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/f7d5f0f0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/f7d5f0f0 Branch: refs/heads/ARIA-321-clearwater Commit: f7d5f0f04301a0866ec1712b4c1830166676c028 Parents: c2b8e65 Author: Tal Liron <tal.li...@gmail.com> Authored: Tue Jul 18 17:25:27 2017 -0500 Committer: Tal Liron <tal.li...@gmail.com> Committed: Wed Jul 26 17:39:44 2017 -0500 ---------------------------------------------------------------------- README.rst | 2 +- aria/modeling/functions.py | 4 +- aria/modeling/service_instance.py | 13 +- aria/orchestrator/context/common.py | 6 +- .../execution_plugin/ctx_proxy/server.py | 39 +- aria/storage/collection_instrumentation.py | 15 +- aria/storage/core.py | 2 +- .../clearwater/clearwater-single-static.yaml | 103 +++ 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 | 159 +++++ 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 | 675 +++++++++++++++++++ examples/clearwater/types/ims.yaml | 431 ++++++++++++ examples/clearwater/types/smtp.yaml | 18 + 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 +- .../execution_plugin/test_ctx_proxy_server.py | 48 +- .../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 +- 64 files changed, 1740 insertions(+), 209 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/f7d5f0f0/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/f7d5f0f0/aria/modeling/functions.py ---------------------------------------------------------------------- diff --git a/aria/modeling/functions.py b/aria/modeling/functions.py index 6544adf..d0ec0cf 100644 --- a/aria/modeling/functions.py +++ b/aria/modeling/functions.py @@ -20,6 +20,7 @@ Mechanism for evaluating intrinsic functions. from ..parser.consumption import ConsumptionContext from ..parser.exceptions import InvalidValueError from ..utils.collections import OrderedDict +from ..utils.type import full_type_name from . import exceptions @@ -89,7 +90,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/f7d5f0f0/aria/modeling/service_instance.py ---------------------------------------------------------------------- diff --git a/aria/modeling/service_instance.py b/aria/modeling/service_instance.py index 889465c..bf7c8a5 100644 --- a/aria/modeling/service_instance.py +++ b/aria/modeling/service_instance.py @@ -591,14 +591,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/f7d5f0f0/aria/orchestrator/context/common.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/context/common.py b/aria/orchestrator/context/common.py index f400142..c71edca 100644 --- a/aria/orchestrator/context/common.py +++ b/aria/orchestrator/context/common.py @@ -40,8 +40,12 @@ class BaseContext(object): INSTRUMENTATION_FIELDS = ( modeling.models.Node.attributes, modeling.models.Node.properties, + # TODO: modeling.models.Capability.attributes, + modeling.models.Capability.properties, modeling.models.NodeTemplate.attributes, - modeling.models.NodeTemplate.properties + modeling.models.NodeTemplate.properties, + # TODO: modeling.models.CapabilityTemplate.attributes, + modeling.models.CapabilityTemplate.properties ) class PrefixedLogger(object): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/f7d5f0f0/aria/orchestrator/execution_plugin/ctx_proxy/server.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/execution_plugin/ctx_proxy/server.py b/aria/orchestrator/execution_plugin/ctx_proxy/server.py index ca910e0..d69f841 100644 --- a/aria/orchestrator/execution_plugin/ctx_proxy/server.py +++ b/aria/orchestrator/execution_plugin/ctx_proxy/server.py @@ -157,11 +157,11 @@ def _process_ctx_request(ctx, args): while index < num_args: arg = args[index] attr = _desugar_attr(current, arg) - if attr: + if attr is not None: current = getattr(current, attr) elif isinstance(current, collections.MutableMapping): key = arg - path_dict = _PathDictAccess(current) + path_dict = _PathAccess(current) if index + 1 == num_args: # read dict prop by path value = path_dict.get(key) @@ -174,6 +174,8 @@ def _process_ctx_request(ctx, args): else: raise RuntimeError('Illegal argument while accessing dict') break + elif hasattr(current, '__getitem__') and (arg in current): # *must* be after MutableMapping + current = current[arg] elif callable(current): kwargs = {} remaining_args = args[index:] @@ -183,7 +185,7 @@ def _process_ctx_request(ctx, args): current = current(*remaining_args, **kwargs) break else: - raise RuntimeError('{0} cannot be processed in {1}'.format(arg, args)) + raise RuntimeError('`{0}` cannot be processed in {1}'.format(arg, args)) index += 1 if callable(current): current = current() @@ -201,8 +203,8 @@ def _desugar_attr(obj, attr): return None -class _PathDictAccess(object): - pattern = re.compile(r"(.+)\[(\d+)\]") +class _PathAccess(object): + ARRAY_PATTERN = re.compile(r"(.+)\[(\d+)\]") def __init__(self, obj): self.obj = obj @@ -216,26 +218,35 @@ class _PathDictAccess(object): return value def _get_object_by_path(self, prop_path, fail_on_missing=True): - # when setting a nested object, make sure to also set all the + def has(name): + return (hasattr(current, '__iter__') and (name in current)) or hasattr(current, name) + + def get(name): + if hasattr(current, '__iter__') and (name in current): + return current[name] + return getattr(current, name) + + # When setting a nested object, make sure to also set all the # intermediate path objects current = self.obj for prop_segment in prop_path.split('.'): - match = self.pattern.match(prop_segment) - if match: - index = int(match.group(2)) - property_name = match.group(1) - if property_name not in current: + array_match = _PathAccess.ARRAY_PATTERN.match(prop_segment) + if array_match: + index = int(array_match.group(2)) + property_name = array_match.group(1) + if not has(property_name): self._raise_illegal(prop_path) if not isinstance(current[property_name], list): self._raise_illegal(prop_path) - current = current[property_name][index] + current = get(property_name)[index] else: - if prop_segment not in current: + if not has(prop_segment): if fail_on_missing: self._raise_illegal(prop_path) else: + # TODO: won't this change the model??? current[prop_segment] = {} - current = current[prop_segment] + current = get(prop_segment) return current def _get_parent_obj_prop_name_by_path(self, prop_path): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/f7d5f0f0/aria/storage/collection_instrumentation.py ---------------------------------------------------------------------- diff --git a/aria/storage/collection_instrumentation.py b/aria/storage/collection_instrumentation.py index c90cb18..dae884a 100644 --- a/aria/storage/collection_instrumentation.py +++ b/aria/storage/collection_instrumentation.py @@ -230,15 +230,20 @@ class _InstrumentedModel(_WrappedBase): def _apply_instrumentation(self): for field in self._instrumentation: + if field.parent.class_ != type(self._wrapped): + # Only apply fields of our class + continue + field_name = field.key field_cls = field.mapper.class_ + field = getattr(self._wrapped, field_name) # Preserve the original value. e.g. original attributes would be located under # _attributes setattr(self, '_{0}'.format(field_name), field) - # set instrumented value + # Set instrumented value if isinstance(field, dict): instrumentation_cls = _InstrumentedDict elif isinstance(field, list): @@ -247,7 +252,7 @@ class _InstrumentedModel(_WrappedBase): # TODO: raise proper error raise exceptions.StorageError( "ARIA supports instrumentation for dict and list. Field {field} of the " - "class {model} is of {type} type.".format( + "class `{model}` is of type `{type}`.".format( field=field, model=self._wrapped, type=type(field))) @@ -277,7 +282,7 @@ class _WrappedModel(_WrappedBase): return _create_instrumented_model( value, instrumentation=self._instrumentation, **self._kwargs) elif hasattr(value, 'metadata') or isinstance(value, (dict, list)): - # Basically checks that the value is indeed an sqlmodel (it should have metadata) + # Basically checks that the value is indeed a SQLAlchemy model (it should have metadata) return _create_wrapped_model( value, instrumentation=self._instrumentation, **self._kwargs) return value @@ -291,6 +296,10 @@ class _WrappedModel(_WrappedBase): def __getitem__(self, item): return self._wrap(self._wrapped[item]) + def __iter__(self): + for item in self._wrapped.__iter__(): + yield self._wrap(item) + def _create_instrumented_model(original_model, mapi, instrumentation): return type('Instrumented{0}'.format(original_model.__class__.__name__), http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/f7d5f0f0/aria/storage/core.py ---------------------------------------------------------------------- diff --git a/aria/storage/core.py b/aria/storage/core.py index 2a5745e..527272c 100644 --- a/aria/storage/core.py +++ b/aria/storage/core.py @@ -130,7 +130,7 @@ class ModelStorage(Storage): """ model_name = model_cls.__modelname__ if model_name in self.registered: - self.logger.debug('{name} in already storage {self!r}'.format(name=model_name, + self.logger.debug('{name} already in storage {self!r}'.format(name=model_name, self=self)) return self.registered[model_name] = self.api(name=model_name, http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/f7d5f0f0/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..3cdc108 --- /dev/null +++ b/examples/clearwater/clearwater-single-static.yaml @@ -0,0 +1,103 @@ +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-local + template_author: ARIA + template_version: '1.0.0' + aria_version: '0.1' + +imports: + - types/clearwater.yaml + - aria-1.0 + +topology_template: + + inputs: + hosts.ssh.user: + type: string + default: ubuntu + hosts.ssh.password: + type: string + default: ubuntu + static_host.public_address: + type: string + default: 192.168.1.170 + 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 + + 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 + capabilities: + smtp: + properties: + # TODO: not validating required :( + username: username + password: password + + policies: + configuration: + type: clearwater.Configuration + + 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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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..0f82098 --- /dev/null +++ b/examples/clearwater/scripts/host/configure.sh @@ -0,0 +1,159 @@ +#!/bin/bash +set -e + +# TODO: configure these in TOSCA -- via a policy? +SITE_NAME=aria +ZONE=example.com +GEOGRAPHICALLY_REDUNDANT=False +SECRET=secret + +# TODO: how to get these via ctx? ctx nodes smtp properties ... +SMTP_HOSTNAME=127.0.0.1 +SMTP_USERNAME=username +SMTP_PASSWORD=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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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..9ea021b --- /dev/null +++ b/examples/clearwater/types/clearwater.yaml @@ -0,0 +1,675 @@ + +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: + site_name: + type: string + default: aria + zone: + type: string + default: example.com + geographically_redundant: + type: boolean + default: false + secret: + type: string + default: 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 + node: tosca.nodes.Compute # TODO: we shouldn't need this, see comment in ARIA-174 + 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 + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + occurrences: [ 0, UNBOUNDED ] + - sip_secure_downstream: + capability: clearwater.Endpoint.SIP.Upstream.Secure + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + occurrences: [ 0, UNBOUNDED ] + - ralf: # for billable events + capability: clearwater.Endpoint.Management.Ralf + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + 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: +# - sip_upstream: # cyclical! +# capability: clearwater.Endpoint.SIP.Proxy +# node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 +# occurrences: [ 0, UNBOUNDED ] + - homer: # for subscriber profiles + capability: clearwater.Endpoint.Management.Homer + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + - ralf: # for billable events + capability: clearwater.Endpoint.Management.Ralf + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + - 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) +# requirements: # cyclical! +# - ralf: +# capability: clearwater.Endpoint.Management.Ralf +# node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + 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 + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + - homestead: # for subscriber authentication + capability: clearwater.Endpoint.Management.Homestead + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + - homestead_provisioning: + capability: clearwater.Endpoint.Management.Homestead.Provisioning + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + - ralf: # TODO: really? + capability: clearwater.Endpoint.Management.Ralf + node: tosca.nodes.Root # TODO: we shouldn't need this, see comment in ARIA-174 + 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/f7d5f0f0/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/f7d5f0f0/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..9ca116e --- /dev/null +++ b/examples/clearwater/types/smtp.yaml @@ -0,0 +1,18 @@ + +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 + capabilities: + smtp: + type: smtp.SMTP http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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/f7d5f0f0/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: