You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ariatosca.apache.org by em...@apache.org on 2017/02/03 02:34:50 UTC
incubator-ariatosca git commit: Fix parser and workflow to work with
new models
Repository: incubator-ariatosca
Updated Branches:
refs/heads/ARIA-44-Merge-parser-and-storage-models fdf3a08fc -> 283d70256
Fix parser and workflow to work with new models
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/283d7025
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/283d7025
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/283d7025
Branch: refs/heads/ARIA-44-Merge-parser-and-storage-models
Commit: 283d7025615c378d275aed60d30234a5c565d398
Parents: fdf3a08
Author: Tal Liron <ta...@gmail.com>
Authored: Thu Feb 2 20:34:18 2017 -0600
Committer: Tal Liron <ta...@gmail.com>
Committed: Thu Feb 2 20:34:18 2017 -0600
----------------------------------------------------------------------
aria/cli/args_parser.py | 4 +-
aria/cli/commands.py | 13 +-
aria/orchestrator/workflows/builtin/heal.py | 6 +-
aria/orchestrator/workflows/builtin/install.py | 18 +-
aria/orchestrator/workflows/builtin/start.py | 6 +-
aria/orchestrator/workflows/builtin/stop.py | 6 +-
.../orchestrator/workflows/builtin/uninstall.py | 18 +-
aria/orchestrator/workflows/builtin/utils.py | 51 ++---
.../orchestrator/workflows/builtin/workflows.py | 175 +++++++++++-------
aria/parser/modeling/__init__.py | 3 +-
aria/parser/modeling/storage.py | 184 +++++++++++++++++++
aria/storage/modeling/instance_elements.py | 2 +-
.../profiles/tosca-simple-1.0/groups.yaml | 2 +-
.../simple_v1_0/modeling/data_types.py | 4 +-
14 files changed, 360 insertions(+), 132 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/cli/args_parser.py
----------------------------------------------------------------------
diff --git a/aria/cli/args_parser.py b/aria/cli/args_parser.py
index e661620..50fec39 100644
--- a/aria/cli/args_parser.py
+++ b/aria/cli/args_parser.py
@@ -138,9 +138,9 @@ def add_workflow_parser(workflow):
default='install',
help='The workflow name')
workflow.add_argument(
- '-d', '--deployment-id',
+ '-i', '--service-instance-id',
required=False,
- help='A unique ID for the deployment')
+ help='A unique ID for the service instance')
@sub_parser_decorator(
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/cli/commands.py
----------------------------------------------------------------------
diff --git a/aria/cli/commands.py b/aria/cli/commands.py
index 45c866a..91d748f 100644
--- a/aria/cli/commands.py
+++ b/aria/cli/commands.py
@@ -42,7 +42,7 @@ from ..parser.consumption import (
Instance
)
from ..parser.loading import LiteralLocation, UriLocation
-from ..parser.modeling import initialize_storage
+from ..parser.modeling.storage import initialize_storage
from ..utils.application import StorageManager
from ..utils.caching import cachedmethod
from ..utils.console import (puts, Colored, indent)
@@ -211,10 +211,10 @@ class WorkflowCommand(BaseCommand):
def __call__(self, args_namespace, unknown_args):
super(WorkflowCommand, self).__call__(args_namespace, unknown_args)
- deployment_id = args_namespace.deployment_id or 1
+ service_instance_id = args_namespace.service_instance_id or 1
context = self._parse(args_namespace.uri)
workflow_fn, inputs = self._get_workflow(context, args_namespace.workflow)
- self._run(context, args_namespace.workflow, workflow_fn, inputs, deployment_id)
+ self._run(context, args_namespace.workflow, workflow_fn, inputs, service_instance_id)
def _parse(self, uri):
# Parse
@@ -259,13 +259,14 @@ class WorkflowCommand(BaseCommand):
return workflow_fn, inputs
- def _run(self, context, workflow_name, workflow_fn, inputs, deployment_id):
+ def _run(self, context, workflow_name, workflow_fn, inputs, service_instance_id):
# Storage
def _initialize_storage(model_storage):
- initialize_storage(context, model_storage, deployment_id)
+ initialize_storage(context, model_storage, service_instance_id)
# Create runner
- runner = Runner(workflow_name, workflow_fn, inputs, _initialize_storage, deployment_id)
+ runner = Runner(workflow_name, workflow_fn, inputs, _initialize_storage,
+ service_instance_id)
# Run
runner.run()
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/orchestrator/workflows/builtin/heal.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/heal.py b/aria/orchestrator/workflows/builtin/heal.py
index 87ac492..72f04a1 100644
--- a/aria/orchestrator/workflows/builtin/heal.py
+++ b/aria/orchestrator/workflows/builtin/heal.py
@@ -21,7 +21,7 @@ Builtin heal workflow
from aria import workflow
-from .workflows import (install_node_instance, uninstall_node_instance)
+from .workflows import (install_node, uninstall_node)
from ..api import task
@@ -78,7 +78,7 @@ def heal_uninstall(ctx, graph, failing_node_instances, targeted_node_instances):
# create install sub workflow for every node instance
for node_instance in failing_node_instances:
- node_instance_sub_workflow = task.WorkflowTask(uninstall_node_instance,
+ node_instance_sub_workflow = task.WorkflowTask(uninstall_node,
node_instance=node_instance)
node_instance_sub_workflows[node_instance.id] = node_instance_sub_workflow
graph.add_tasks(node_instance_sub_workflow)
@@ -131,7 +131,7 @@ def heal_install(ctx, graph, failing_node_instances, targeted_node_instances):
# create install sub workflow for every node instance
for node_instance in failing_node_instances:
- node_instance_sub_workflow = task.WorkflowTask(install_node_instance,
+ node_instance_sub_workflow = task.WorkflowTask(install_node,
node_instance=node_instance)
node_instance_sub_workflows[node_instance.id] = node_instance_sub_workflow
graph.add_tasks(node_instance_sub_workflow)
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/orchestrator/workflows/builtin/install.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/install.py b/aria/orchestrator/workflows/builtin/install.py
index 81d1da2..20afb64 100644
--- a/aria/orchestrator/workflows/builtin/install.py
+++ b/aria/orchestrator/workflows/builtin/install.py
@@ -17,18 +17,18 @@
Builtin install workflow
"""
-from .workflows import install_node_instance
-from .utils import create_node_instance_task_dependencies
+from .workflows import install_node
+from .utils import create_node_task_dependencies
from ..api.task import WorkflowTask
from ... import workflow
@workflow
def install(ctx, graph):
- tasks_and_node_instances = []
- for node_instance in ctx.model.node_instance.iter():
- tasks_and_node_instances.append((
- WorkflowTask(install_node_instance, node_instance=node_instance),
- node_instance))
- graph.add_tasks([task for task, _ in tasks_and_node_instances])
- create_node_instance_task_dependencies(graph, tasks_and_node_instances)
+ tasks_and_nodes = []
+ for node in ctx.model.node.iter():
+ tasks_and_nodes.append((
+ WorkflowTask(install_node, node=node),
+ node))
+ graph.add_tasks([task for task, _ in tasks_and_nodes])
+ create_node_task_dependencies(graph, tasks_and_nodes)
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/orchestrator/workflows/builtin/start.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/start.py b/aria/orchestrator/workflows/builtin/start.py
index a044d73..ad67554 100644
--- a/aria/orchestrator/workflows/builtin/start.py
+++ b/aria/orchestrator/workflows/builtin/start.py
@@ -17,12 +17,12 @@
Builtin start workflow
"""
-from .workflows import start_node_instance
+from .workflows import start_node
from ..api.task import WorkflowTask
from ... import workflow
@workflow
def start(ctx, graph):
- for node_instance in ctx.model.node_instance.iter():
- graph.add_tasks(WorkflowTask(start_node_instance, node_instance=node_instance))
+ for node in ctx.model.node.iter():
+ graph.add_tasks(WorkflowTask(start_node, node=node))
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/orchestrator/workflows/builtin/stop.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/stop.py b/aria/orchestrator/workflows/builtin/stop.py
index 584c0d3..23ac366 100644
--- a/aria/orchestrator/workflows/builtin/stop.py
+++ b/aria/orchestrator/workflows/builtin/stop.py
@@ -17,12 +17,12 @@
Builtin stop workflow
"""
-from .workflows import stop_node_instance
+from .workflows import stop_node
from ..api.task import WorkflowTask
from ... import workflow
@workflow
def stop(ctx, graph):
- for node_instance in ctx.model.node_instance.iter():
- graph.add_tasks(WorkflowTask(stop_node_instance, node_instance=node_instance))
+ for node in ctx.model.node.iter():
+ graph.add_tasks(WorkflowTask(stop_node, node=node))
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/orchestrator/workflows/builtin/uninstall.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/uninstall.py b/aria/orchestrator/workflows/builtin/uninstall.py
index bfcc9ec..7948f3e 100644
--- a/aria/orchestrator/workflows/builtin/uninstall.py
+++ b/aria/orchestrator/workflows/builtin/uninstall.py
@@ -17,18 +17,18 @@
Builtin uninstall workflow
"""
-from .workflows import uninstall_node_instance
-from .utils import create_node_instance_task_dependencies
+from .workflows import uninstall_node
+from .utils import create_node_task_dependencies
from ..api.task import WorkflowTask
from ... import workflow
@workflow
def uninstall(ctx, graph):
- tasks_and_node_instances = []
- for node_instance in ctx.model.node_instance.iter():
- tasks_and_node_instances.append((
- WorkflowTask(uninstall_node_instance, node_instance=node_instance),
- node_instance))
- graph.add_tasks([task for task, _ in tasks_and_node_instances])
- create_node_instance_task_dependencies(graph, tasks_and_node_instances, reverse=True)
+ tasks_and_nodes = []
+ for node in ctx.model.node.iter():
+ tasks_and_nodes.append((
+ WorkflowTask(uninstall_node, node=node),
+ node))
+ graph.add_tasks([task for task, _ in tasks_and_nodes])
+ create_node_task_dependencies(graph, tasks_and_nodes, reverse=True)
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/orchestrator/workflows/builtin/utils.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/utils.py b/aria/orchestrator/workflows/builtin/utils.py
index 8b7a8bc..6300796 100644
--- a/aria/orchestrator/workflows/builtin/utils.py
+++ b/aria/orchestrator/workflows/builtin/utils.py
@@ -16,50 +16,49 @@
from ..api.task import OperationTask
-def create_node_instance_task(operation_name, node_instance):
+def create_node_task(operation_name, node):
"""
- Returns a new operation task if the operation exists in the node instance, otherwise returns
- None.
+ Returns a new operation task if the operation exists in the node, otherwise returns None.
"""
- if operation_name in node_instance.node.operations:
- return OperationTask.node_instance(instance=node_instance,
+ if _has_operation(node.interfaces, operation_name):
+ return OperationTask.node_instance(instance=node,
name=operation_name)
return None
-def create_relationship_instance_tasks(operation_name, operations_attr, node_instance):
+def create_relationship_tasks(operation_name, edge, node):
"""
- Returns a list of operation tasks for each outbound relationship of the node instance if
- the operation exists there.
+ Returns a list of operation tasks for each outbound relationship of the node if the operation
+ exists there.
"""
+
+ edge = 'source' # TODO: support target?
sequence = []
- for relationship_instance in node_instance.outbound_relationship_instances:
- if operation_name in getattr(relationship_instance.relationship, operations_attr):
+ for relationship in node.outbound_relationships:
+ if _has_operation(getattr(relationship, edge + '_interfaces'), operation_name):
sequence.append(
- OperationTask.relationship_instance(instance=relationship_instance,
- name=operation_name,
- operation_end=operations_attr))
+ OperationTask.relationship_instance(instance=relationship,
+ name=operation_name + '_' + edge))
return sequence
-def create_node_instance_task_dependencies(graph, tasks_and_node_instances, reverse=False):
+def create_node_task_dependencies(graph, tasks_and_nodes, reverse=False):
"""
- Creates dependencies between tasks if there is an outbound relationship between their node
- instances.
+ Creates dependencies between tasks if there is a relationship (outbound) between their nodes.
"""
- def get_task(node_instance_id):
- for task, node_instance in tasks_and_node_instances:
- if node_instance.id == node_instance_id:
+ def get_task(node_id):
+ for task, node in tasks_and_nodes:
+ if node.id == node_id:
return task
return None
- for task, node_instance in tasks_and_node_instances:
+ for task, node in tasks_and_nodes:
dependencies = []
- for relationship_instance in node_instance.outbound_relationship_instances:
- dependency = get_task(relationship_instance.target_node_instance.id)
+ for relationship in node.outbound_relationships:
+ dependency = get_task(relationship.target_node.id)
if dependency:
dependencies.append(dependency)
if dependencies:
@@ -68,3 +67,11 @@ def create_node_instance_task_dependencies(graph, tasks_and_node_instances, reve
graph.add_dependency(dependency, task)
else:
graph.add_dependency(task, dependencies)
+
+
+def _has_operation(interfaces, operation_name):
+ for interface in interfaces:
+ for operation in interface.operations:
+ if operation.name == operation_name:
+ return True
+ return False
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/orchestrator/workflows/builtin/workflows.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/workflows.py b/aria/orchestrator/workflows/builtin/workflows.py
index c2fbded..180b4e9 100644
--- a/aria/orchestrator/workflows/builtin/workflows.py
+++ b/aria/orchestrator/workflows/builtin/workflows.py
@@ -17,122 +17,157 @@
A set of builtin workflows.
"""
-from .utils import (create_node_instance_task, create_relationship_instance_tasks)
+from .utils import (create_node_task, create_relationship_tasks)
from ... import workflow
+NORMATIVE_STANDARD_INTERFACE = 'Standard' # 'tosca.interfaces.node.lifecycle.Standard'
+NORMATIVE_CONFIGURE_INTERFACE = 'Configure' # 'tosca.interfaces.relationship.Configure'
+
+NORMATIVE_CREATE = NORMATIVE_STANDARD_INTERFACE + '.create'
+NORMATIVE_START = NORMATIVE_STANDARD_INTERFACE + '.start'
+NORMATIVE_STOP = NORMATIVE_STANDARD_INTERFACE + '.stop'
+NORMATIVE_DELETE = NORMATIVE_STANDARD_INTERFACE + '.delete'
+
+NORMATIVE_CONFIGURE = NORMATIVE_STANDARD_INTERFACE + '.configure'
+NORMATIVE_PRE_CONFIGURE_SOURCE = NORMATIVE_CONFIGURE_INTERFACE + '.pre_configure_source'
+NORMATIVE_PRE_CONFIGURE_TARGET = NORMATIVE_CONFIGURE_INTERFACE + '.pre_configure_target'
+NORMATIVE_POST_CONFIGURE_SOURCE = NORMATIVE_CONFIGURE_INTERFACE + '.post_configure_source'
+NORMATIVE_POST_CONFIGURE_TARGET = NORMATIVE_CONFIGURE_INTERFACE + '.post_configure_target'
+
+NORMATIVE_ADD_SOURCE = NORMATIVE_CONFIGURE_INTERFACE + '.add_source'
+NORMATIVE_ADD_TARGET = NORMATIVE_CONFIGURE_INTERFACE + '.add_target'
+NORMATIVE_REMOVE_TARGET = NORMATIVE_CONFIGURE_INTERFACE + '.remove_target'
+NORMATIVE_TARGET_CHANGED = NORMATIVE_CONFIGURE_INTERFACE + '.target_changed'
+
+
__all__ = (
- 'install_node_instance',
- 'uninstall_node_instance',
- 'start_node_instance',
- 'stop_node_instance',
+ 'NORMATIVE_STANDARD_INTERFACE',
+ 'NORMATIVE_CONFIGURE_INTERFACE',
+ 'NORMATIVE_CREATE',
+ 'NORMATIVE_START',
+ 'NORMATIVE_STOP',
+ 'NORMATIVE_DELETE',
+ 'NORMATIVE_CONFIGURE',
+ 'NORMATIVE_PRE_CONFIGURE_SOURCE',
+ 'NORMATIVE_PRE_CONFIGURE_TARGET',
+ 'NORMATIVE_POST_CONFIGURE_SOURCE',
+ 'NORMATIVE_POST_CONFIGURE_TARGET',
+ 'NORMATIVE_ADD_SOURCE',
+ 'NORMATIVE_ADD_TARGET',
+ 'NORMATIVE_REMOVE_TARGET',
+ 'NORMATIVE_TARGET_CHANGED',
+ 'install_node',
+ 'uninstall_node',
+ 'start_node',
+ 'stop_node',
)
-@workflow(suffix_template='{node_instance.id}')
-def install_node_instance(graph, node_instance, **kwargs):
+@workflow(suffix_template='{node.id}')
+def install_node(graph, node, **kwargs):
sequence = []
# Create
sequence.append(
- create_node_instance_task(
- 'tosca.interfaces.node.lifecycle.Standard.create',
- node_instance))
+ create_node_task(
+ NORMATIVE_CREATE,
+ node))
# Configure
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.pre_configure_source',
- 'source_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_PRE_CONFIGURE_SOURCE,
+ 'source',
+ node)
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.pre_configure_target',
- 'target_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_PRE_CONFIGURE_TARGET,
+ 'target',
+ node)
sequence.append(
- create_node_instance_task(
- 'tosca.interfaces.node.lifecycle.Standard.configure',
- node_instance))
+ create_node_task(
+ NORMATIVE_CONFIGURE,
+ node))
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.post_configure_source',
- 'source_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_POST_CONFIGURE_SOURCE,
+ 'source',
+ node)
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.post_configure_target',
- 'target_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_POST_CONFIGURE_TARGET,
+ 'target',
+ node)
# Start
- sequence += _create_start_tasks(node_instance)
+ sequence += _create_start_tasks(node)
graph.sequence(*sequence)
-@workflow(suffix_template='{node_instance.id}')
-def uninstall_node_instance(graph, node_instance, **kwargs):
+@workflow(suffix_template='{node.id}')
+def uninstall_node(graph, node, **kwargs):
# Stop
- sequence = _create_stop_tasks(node_instance)
+ sequence = _create_stop_tasks(node)
# Delete
sequence.append(
- create_node_instance_task(
- 'tosca.interfaces.node.lifecycle.Standard.delete',
- node_instance))
+ create_node_task(
+ NORMATIVE_DELETE,
+ node))
graph.sequence(*sequence)
-@workflow(suffix_template='{node_instance.id}')
-def start_node_instance(graph, node_instance, **kwargs):
- graph.sequence(*_create_start_tasks(node_instance))
+@workflow(suffix_template='{node.id}')
+def start_node(graph, node, **kwargs):
+ graph.sequence(*_create_start_tasks(node))
-@workflow(suffix_template='{node_instance.id}')
-def stop_node_instance(graph, node_instance, **kwargs):
- graph.sequence(*_create_stop_tasks(node_instance))
+@workflow(suffix_template='{node.id}')
+def stop_node(graph, node, **kwargs):
+ graph.sequence(*_create_stop_tasks(node))
-def _create_start_tasks(node_instance):
+def _create_start_tasks(node):
sequence = []
sequence.append(
- create_node_instance_task(
- 'tosca.interfaces.node.lifecycle.Standard.start',
- node_instance))
+ create_node_task(
+ NORMATIVE_START,
+ node))
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.add_source',
- 'source_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_ADD_SOURCE,
+ 'source',
+ node)
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.add_target',
- 'target_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_ADD_TARGET,
+ 'target',
+ node)
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.target_changed',
- 'target_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_TARGET_CHANGED,
+ 'target',
+ node)
return sequence
-def _create_stop_tasks(node_instance):
+def _create_stop_tasks(node):
sequence = []
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.remove_target',
- 'target_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_REMOVE_TARGET,
+ 'target',
+ node)
sequence += \
- create_relationship_instance_tasks(
- 'tosca.interfaces.relationship.Configure.target_changed',
- 'target_operations',
- node_instance)
+ create_relationship_tasks(
+ NORMATIVE_TARGET_CHANGED,
+ 'target',
+ node)
sequence.append(
- create_node_instance_task(
- 'tosca.interfaces.node.lifecycle.Standard.stop',
- node_instance))
+ create_node_task(
+ NORMATIVE_STOP,
+ node))
return sequence
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/parser/modeling/__init__.py
----------------------------------------------------------------------
diff --git a/aria/parser/modeling/__init__.py b/aria/parser/modeling/__init__.py
index d507a26..cad25ca 100644
--- a/aria/parser/modeling/__init__.py
+++ b/aria/parser/modeling/__init__.py
@@ -25,6 +25,7 @@ from .model_elements import (ServiceModel, NodeTemplate, RequirementTemplate, Ca
from .types import TypeHierarchy, Type, RelationshipType, PolicyType, PolicyTriggerType
from .exceptions import CannotEvaluateFunctionException
+
__all__ = (
'IdType',
'ModelingContext',
@@ -65,5 +66,5 @@ __all__ = (
'RelationshipType',
'PolicyType',
'PolicyTriggerType',
- 'CannotEvaluateFunctionException'
+ 'CannotEvaluateFunctionException',
)
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/parser/modeling/storage.py
----------------------------------------------------------------------
diff --git a/aria/parser/modeling/storage.py b/aria/parser/modeling/storage.py
new file mode 100644
index 0000000..dd58ab5
--- /dev/null
+++ b/aria/parser/modeling/storage.py
@@ -0,0 +1,184 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+This solution is temporary, as we plan to combine aria.parser.modeling and aria.storage.modeling
+into one package (aria.modeling?).
+"""
+
+from datetime import datetime
+from threading import RLock
+
+from ...storage.modeling import model
+from ...orchestrator.decorators import operation
+from ...utils.console import puts, Colored
+from ...utils.formatting import safe_repr
+
+
+def initialize_storage(context, model_storage, service_instance_id):
+ s_service_template = create_service_template(context)
+ model_storage.service_template.put(s_service_template)
+
+ s_service_instance = create_service_instance(context, s_service_template, service_instance_id)
+ model_storage.service_instance.put(s_service_instance)
+
+ # Create nodes templates and nodes
+ for node_template in context.modeling.model.node_templates.itervalues():
+ s_node_template = create_node_template(context, s_service_template, node_template)
+ model_storage.node_template.put(s_node_template)
+
+ for node in context.modeling.instance.find_nodes(node_template.name):
+ s_node = create_node(s_service_instance, s_node_template, node)
+ model_storage.node.put(s_node)
+ create_interfaces(context, model_storage, node.interfaces, s_node, 'node', '_dry_node')
+
+ # Create relationships between nodes
+ for source_node in context.modeling.instance.nodes.itervalues():
+ for relationship in source_node.relationships:
+ s_source_node = model_storage.node.get_by_name(source_node.id)
+ s_target_node = model_storage.node.get_by_name(relationship.target_node_id)
+ s_relationship = create_relationship(s_source_node, s_target_node, relationship)
+ model_storage.relationship.put(s_relationship)
+ create_interfaces(context, model_storage, relationship.source_interfaces,
+ s_relationship, 'relationship', '_dry_relationship')
+
+
+def create_service_template(context):
+ now = datetime.utcnow()
+ main_file_name = unicode(context.presentation.location)
+ try:
+ name = context.modeling.model.metadata.values.get('template_name')
+ except AttributeError:
+ name = None
+ return model.ServiceTemplate(
+ name=name or main_file_name,
+ description=context.modeling.model.description or '',
+ created_at=now,
+ updated_at=now,
+ main_file_name=main_file_name)
+
+
+def create_service_instance(context, service_template, service_instance_id):
+ now = datetime.utcnow()
+ return model.ServiceInstance(
+ name='%s_%s' % (service_template.name, service_instance_id),
+ service_template=service_template,
+ description=context.modeling.instance.description or '',
+ created_at=now,
+ updated_at=now)
+
+
+def create_node_template(context, service_template, node_template):
+ return model.NodeTemplate(
+ name=node_template.name,
+ type_name=node_template.type_name,
+ default_instances=node_template.default_instances,
+ min_instances=node_template.min_instances,
+ max_instances=node_template.max_instances or 100,
+ service_template=service_template)
+
+
+def create_node(service_instance, node_template, node):
+ return model.Node(
+ name=node.id,
+ state='',
+ node_template=node_template,
+ service_instance=service_instance)
+
+
+def create_relationship(source_node, target_node, relationship):
+ return model.Relationship(
+ source_node=source_node,
+ target_node=target_node)
+
+
+def create_interfaces(context, model_storage, interfaces, obj, attr_name, fn_name):
+ for interface_name, interface in interfaces.iteritems():
+ s_interface = model.Interface(name=interface_name,
+ type_name=interface.type_name)
+ setattr(s_interface, attr_name, obj)
+ try:
+ obj.source_interfaces.append(s_interface)
+ except AttributeError:
+ # is a node
+ pass
+ model_storage.interface.put(s_interface)
+ for operation_name, operation in interface.operations.iteritems():
+ operation_name = '{0}.{1}'.format(interface_name, operation_name)
+ s_operation = model.Operation(name=operation_name,
+ implementation='{0}.{1}'.format(__name__, fn_name),
+ interface=s_interface)
+ plugin, implementation = _parse_implementation(context, operation.implementation)
+ s_operation.inputs.append(model.Parameter(name='_plugin',
+ value=plugin,
+ type='str'))
+ s_operation.inputs.append(model.Parameter(name='_implementation',
+ value=implementation,
+ type='str'))
+ model_storage.operation.put(s_operation)
+
+
+def _parse_implementation(context, implementation):
+ if not implementation:
+ return '', ''
+
+ index = implementation.find('>')
+ if index == -1:
+ return 'execution', implementation
+ plugin = implementation[:index].strip()
+
+ # TODO: validation should happen in parser
+ if (plugin != 'execution') and (_get_plugin(context, plugin) is None):
+ raise ValueError('unknown plugin: "%s"' % plugin)
+
+ implementation = implementation[index+1:].strip()
+ return plugin, implementation
+
+
+def _get_plugin(context, plugin_name):
+ def is_plugin(type_name):
+ return context.modeling.policy_types.get_role(type_name) == 'plugin'
+
+ for policy in context.modeling.instance.policies.itervalues():
+ if (policy.name == plugin_name) and is_plugin(policy.type_name):
+ return policy
+
+ return None
+
+
+_TERMINAL_LOCK = RLock()
+
+
+@operation
+def _dry_node(ctx, _plugin, _implementation, **kwargs):
+ with _TERMINAL_LOCK:
+ print '> node instance: %s' % Colored.red(ctx.node.name)
+ _dump_implementation(_plugin, _implementation)
+
+
+@operation
+def _dry_relationship(ctx, _plugin, _implementation, **kwargs):
+ with _TERMINAL_LOCK:
+ puts('> relationship instance: %s -> %s' % (
+ Colored.red(ctx.relationship.source_node.name),
+ Colored.red(ctx.relationship.target_node.name)))
+ _dump_implementation(_plugin, _implementation)
+
+
+def _dump_implementation(plugin, implementation):
+ if plugin:
+ print ' plugin: %s' % Colored.magenta(plugin)
+ if implementation:
+ print ' implementation: %s' % Colored.yellow(safe_repr(implementation))
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/aria/storage/modeling/instance_elements.py
----------------------------------------------------------------------
diff --git a/aria/storage/modeling/instance_elements.py b/aria/storage/modeling/instance_elements.py
index e3dedc8..4d73a79 100644
--- a/aria/storage/modeling/instance_elements.py
+++ b/aria/storage/modeling/instance_elements.py
@@ -193,7 +193,7 @@ class OperationBase(structure.ModelMixin):
return cls.many_to_one_relationship('service_instance')
@declared_attr
- def interfaces(cls):
+ def interface(cls):
return cls.many_to_one_relationship('interface')
# region many-to-many relationships
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml
----------------------------------------------------------------------
diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml
index 08da2f3..a252a7c 100644
--- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml
+++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml
@@ -24,5 +24,5 @@ group_types:
description: >-
This is the default (root) TOSCA Group Type definition that all other TOSCA base Group Types derive from.
interfaces:
- standard:
+ Standard:
type: tosca.interfaces.node.lifecycle.Standard
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/283d7025/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py
----------------------------------------------------------------------
diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py
index ea692e3..99dcfea 100644
--- a/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py
+++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py
@@ -397,8 +397,8 @@ def coerce_value(context, presentation, the_type, entry_schema, constraints, val
if hasattr(the_type, '_coerce_value'):
# Delegate to '_coerce_value' (likely a DataType instance)
- return the_type._cast_value(context, presentation, entry_schema, constraints, value,
- aspect)
+ return the_type._coerce_value(context, presentation, entry_schema, constraints, value,
+ aspect)
# Coerce to primitive type
return coerce_to_primitive(context, presentation, the_type, constraints, value, aspect)