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/06/16 22:27:50 UTC
[07/10] incubator-ariatosca git commit: wip
wip
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/ba4460e2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/ba4460e2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/ba4460e2
Branch: refs/heads/ARIA-254-multiple-nodes-per-template
Commit: ba4460e2cefce13536114b0b5ad6072da5281dc5
Parents: b7ec71e
Author: Tal Liron <ta...@gmail.com>
Authored: Tue Jun 13 14:50:17 2017 -0500
Committer: Tal Liron <ta...@gmail.com>
Committed: Fri Jun 16 17:27:32 2017 -0500
----------------------------------------------------------------------
aria/modeling/service_template.py | 62 +++++++++++++++-----
aria/parser/presentation/presentation.py | 12 +++-
.../profiles/aria-1.0/aria-1.0.yaml | 23 ++++++--
.../profiles/tosca-simple-1.0/capabilities.yaml | 1 +
.../simple_v1_0/modeling/capabilities.py | 15 +++--
.../node-cellar/node-cellar.yaml | 20 ++++---
6 files changed, 99 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/aria/modeling/service_template.py
----------------------------------------------------------------------
diff --git a/aria/modeling/service_template.py b/aria/modeling/service_template.py
index dfef8d6..c9c7c6c 100644
--- a/aria/modeling/service_template.py
+++ b/aria/modeling/service_template.py
@@ -305,7 +305,8 @@ class ServiceTemplateBase(TemplateModelMixin):
utils.instantiate_dict(self, service.meta_data, self.meta_data)
for node_template in self.node_templates.itervalues():
- for _ in range(node_template.default_instances):
+ print 'scaling', node_template.name, node_template.scaling['default_instances']
+ for _ in range(node_template.scaling['default_instances']):
node = node_template.instantiate(container)
service.nodes[node.name] = node
@@ -581,12 +582,6 @@ class NodeTemplateBase(TemplateModelMixin):
console.puts(context.style.meta(self.description))
with context.style.indent:
console.puts('Type: {0}'.format(context.style.type(self.type.name)))
- console.puts('Instances: {0:d} ({1:d}{2})'.format(
- self.default_instances,
- self.min_instances,
- ' to {0:d}'.format(self.max_instances)
- if self.max_instances is not None
- else ' or more'))
utils.dump_dict_values(self.properties, 'Properties')
utils.dump_dict_values(self.attributes, 'Attributes')
utils.dump_interfaces(self.interface_templates)
@@ -620,18 +615,53 @@ class NodeTemplateBase(TemplateModelMixin):
return '{name}_{index}'.format(name=self.name, index=self.next_index)
@property
- def default_instances(self):
- # TODO: currently finds the first matching policy; but we should emit a validation error
- # if more than one policy applies to the same node
+ def scaling(self):
+ scaling = {
+ 'min_instances': 0,
+ 'max_instances': 1,
+ 'default_instances': 1}
+
+ def extract_property(properties, name):
+ prop = properties.get(name)
+ if (prop is not None) and (prop.type_name == 'integer') and (prop.value is not None):
+ scaling[name] = prop.value
+
+ def extract_properties(properties):
+ extract_property(properties, 'min_instances')
+ extract_property(properties, 'max_instances')
+ extract_property(properties, 'default_instances')
+
+ # TODO: currently finds the first matches capability or policy; but we should emit a
+ # validation error if more than one applies to the same node
+
+ # From our scaling capabilities
+ for capability_template in self.capability_templates.itervalues():
+ if capability_template.type.role == 'scaling':
+ extract_properties(capability_template.properties)
+
+ # From service scaling policies (will override capabilities)
for policy_template in self.service_template.policy_templates.itervalues():
if policy_template.type.role == 'scaling':
if policy_template.is_for_node_template(self.name):
- default_instances = policy_template.properties.get('default_instances')
- if (default_instances is not None) \
- and (default_instances.type_name == 'integer'):
- return default_instances.value
- break
- return 1
+ extract_properties(policy_template.properties)
+
+ # Validate
+ if (scaling['min_instances'] < 0) or \
+ (scaling['max_instances'] < 0) or \
+ (scaling['default_instances'] < 0) or \
+ (scaling['max_instances'] < scaling['min_instances']) or \
+ (scaling['default_instances'] < scaling['min_instances']) or \
+ (scaling['default_instances'] > scaling['max_instances']):
+ context = ConsumptionContext.get_thread_local()
+ context.validation.report('invalid scaling parameters for node template "{0}": '
+ 'min={1}, max={2}, default={3}'.format(
+ self.name,
+ scaling['min_instances'],
+ scaling['max_instances'],
+ scaling['default_instances']),
+ level=validation.Issue.BETWEEN_TYPES)
+
+ return scaling
def is_target_node_template_valid(self, target_node_template):
"""
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/aria/parser/presentation/presentation.py
----------------------------------------------------------------------
diff --git a/aria/parser/presentation/presentation.py b/aria/parser/presentation/presentation.py
index 644d880..495c42c 100644
--- a/aria/parser/presentation/presentation.py
+++ b/aria/parser/presentation/presentation.py
@@ -34,6 +34,14 @@ class Value(object):
self.value = deepcopy_with_locators(value)
self.description = deepcopy_with_locators(description)
+ def _dump(self, context):
+ if self.type is not None:
+ puts(context.style.type(self.type))
+ if self.value is not None:
+ puts(context.style.literal(self.value))
+ if self.description is not None:
+ puts(context.style.meta(self.description))
+
class PresentationBase(HasCachedMethods):
"""
@@ -234,6 +242,8 @@ class AsIsPresentation(PresentationBase):
def _dump(self, context):
if hasattr(self._raw, '_dump'):
- self._raw._dump(context)
+ puts(context.style.node(self._name))
+ with context.style.indent:
+ self._raw._dump(context)
else:
super(AsIsPresentation, self)._dump(context)
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml
----------------------------------------------------------------------
diff --git a/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml b/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml
index 71d6e8e..d7b0c61 100644
--- a/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml
+++ b/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml
@@ -67,18 +67,29 @@ policy_types:
Scaling.
derived_from: tosca.policies.Scaling
properties:
- default_instances:
+ min_instances:
+ description: >-
+ This property is used to indicate the minimum number of instances that should be created
+ for the associated TOSCA Node Template by a TOSCA orchestrator.
type: integer
default: 1
constraints:
- greater_or_equal: 0
- min_instances:
+ max_instances:
+ description: >-
+ This property is used to indicate the maximum number of instances that should be created
+ for the associated TOSCA Node Template by a TOSCA orchestrator.
type: integer
- default: 0
+ default: 1
constraints:
- greater_or_equal: 0
- max_instances:
+ default_instances:
+ description: >-
+ An optional property that indicates the requested default number of instances that should
+ be the starting number of instances a TOSCA orchestrator should attempt to allocate. Note:
+ The value for this property MUST be in the range between the values set for
+ "min_instances" and "max_instances" properties.
type: integer
- default: -1
constraints:
- - greater_or_equal: -1
+ - greater_or_equal: 0
+ required: false
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml
----------------------------------------------------------------------
diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml
index 30abe10..b705d47 100644
--- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml
+++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml
@@ -132,6 +132,7 @@ capability_types:
specification: tosca-simple-1.0
specification_section: 5.4.10
specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_SCALABLE'
+ role: scaling
description: >-
This is the default TOSCA type that should be used to express a scalability capability for a node.
derived_from: tosca.capabilities.Root
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py
----------------------------------------------------------------------
diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py
index a90a9fc..18a4541 100644
--- a/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py
+++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py
@@ -71,8 +71,8 @@ def get_inherited_capability_definitions(context, presentation, for_presentation
type2 = our_capability_definition.type
if type1 != type2:
context.validation.report(
- 'capability definition changes type from "%s" to "%s" in "%s"'
- % (type1, type2, presentation._fullname),
+ 'capability definition changes type from "{0}" to "{1}" in "{2}"'
+ .format(type1, type2, presentation._fullname),
locator=our_capability_definition._locator, level=Issue.BETWEEN_TYPES)
# Already cloned?
@@ -133,12 +133,19 @@ def get_template_capabilities(context, presentation):
values = get_assigned_and_defined_parameter_values(context,
our_capability_assignment,
'property')
+
+ print presentation._name
+ print 'our', [(k, v.value) for k, v in our_capability_assignment.properties.iteritems()]
+ print 'ass', [(k, v.value.value) for k, v in capability_assignment.properties.iteritems()]
+ print 'val', [(k, v.value) for k, v in values.iteritems()]
+
if values:
capability_assignment._raw['properties'] = values
+ capability_assignment._reset_method_cache()
else:
context.validation.report(
- 'capability "%s" not declared at node type "%s" in "%s"'
- % (capability_name, presentation.type, presentation._fullname),
+ 'capability "{0}" not declared at node type "{1}" in "{2}"'
+ .format(capability_name, presentation.type, presentation._fullname),
locator=our_capability_assignment._locator, level=Issue.BETWEEN_TYPES)
return capability_assignments
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml
----------------------------------------------------------------------
diff --git a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml
index e130b13..de57d3c 100644
--- a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml
+++ b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml
@@ -201,6 +201,11 @@ topology_template:
os_users: # map of os.UserInfo
root:
password: admin123
+ capabilities:
+ scalable: # will be overriden by policy
+ properties:
+ max_instances: 5
+ default_instances: 3
interfaces:
Standard:
inputs:
@@ -273,13 +278,14 @@ topology_template:
policies:
- scaling:
- type: openstack.Scaling
- properties:
- bandwidth_threshold: 2 GB
- default_instances: 2
- targets: # node templates or groups
- - node_cellar_group
+# scaling:
+# type: openstack.Scaling
+# properties:
+# bandwidth_threshold: 2 GB
+# max_instances: 2
+# default_instances: 2
+# targets: # node templates or groups
+# - node_cellar_group
juju:
description: >-