summaryrefslogtreecommitdiffstats
path: root/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py
diff options
context:
space:
mode:
Diffstat (limited to 'azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py')
-rw-r--r--azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py518
1 files changed, 518 insertions, 0 deletions
diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py
new file mode 100644
index 0000000..9158776
--- /dev/null
+++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py
@@ -0,0 +1,518 @@
+# 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.
+
+from aria.utils.collections import FrozenDict
+from aria.utils.caching import cachedmethod
+from aria.parser import implements_specification
+from aria.parser.presentation import (has_fields, short_form_field, allow_unknown_fields,
+ primitive_field, primitive_list_field, object_field,
+ object_list_field, object_dict_field,
+ object_dict_unknown_fields, field_validator,
+ field_getter, type_validator, list_type_validator)
+
+from .data_types import Range
+from .misc import (Description, ConstraintClause, OperationImplementation, EntrySchema)
+from .presentation.extensible import ExtensiblePresentation
+from .presentation.field_getters import data_type_class_getter
+from .presentation.field_validators import (data_type_validator, data_value_validator,
+ entry_schema_validator)
+from .presentation.types import (convert_name_to_full_type_name, get_type_by_name)
+from .modeling.data_types import get_data_type, get_property_constraints
+from .modeling.interfaces import (get_and_override_input_definitions_from_type,
+ get_and_override_operation_definitions_from_type)
+
+
+@has_fields
+@implements_specification('3.5.8', 'tosca-simple-1.0')
+class PropertyDefinition(ExtensiblePresentation):
+ """
+ A property definition defines a named, typed value and related data that can be associated with
+ an entity defined in this specification (e.g., Node Types, Relationship Types, Capability Types,
+ etc.). Properties are used by template authors to provide input values to TOSCA entities which
+ indicate their "desired state" when they are instantiated. The value of a property can be
+ retrieved using the ``get_property`` function within TOSCA Service Templates.
+
+ See the `TOSCA Simple Profile v1.0 cos01 specification <http://docs.oasis-open.org/tosca
+ /TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html
+ #DEFN_ELEMENT_PROPERTY_DEFN>`__
+ """
+
+ @field_validator(data_type_validator())
+ @primitive_field(str, required=True)
+ def type(self):
+ """
+ The required data type for the property.
+
+ :type: :obj:`basestring`
+ """
+
+ @object_field(Description)
+ def description(self):
+ """
+ The optional description for the property.
+
+ :type: :class:`Description`
+ """
+
+ @primitive_field(bool, default=True)
+ def required(self):
+ """
+ An optional key that declares a property as required (true) or not (false).
+
+ :type: bool
+ """
+
+ @field_validator(data_value_validator)
+ @primitive_field()
+ def default(self):
+ """
+ An optional key that may provide a value to be used as a default if not provided by another
+ means.
+
+ :type: :obj:`basestring`
+ """
+
+ @primitive_field(str, default='supported', allowed=('supported', 'unsupported', 'experimental',
+ 'deprecated'))
+ @implements_specification(section='3.5.8.3', spec='tosca-simple-1.0')
+ def status(self):
+ """
+ The optional status of the property relative to the specification or implementation.
+
+ :type: :obj:`basestring`
+ """
+
+ @object_list_field(ConstraintClause)
+ def constraints(self):
+ """
+ The optional list of sequenced constraint clauses for the property.
+
+ :type: list of (str, :class:`ConstraintClause`)
+ """
+
+ @field_validator(entry_schema_validator)
+ @object_field(EntrySchema)
+ def entry_schema(self):
+ """
+ The optional key that is used to declare the name of the Datatype definition for entries of
+ set types such as the TOSCA list or map.
+
+ :type: :obj:`basestring`
+ """
+
+ @cachedmethod
+ def _get_type(self, context):
+ return get_data_type(context, self, 'type')
+
+ @cachedmethod
+ def _get_constraints(self, context):
+ return get_property_constraints(context, self)
+
+
+@has_fields
+@implements_specification('3.5.10', 'tosca-simple-1.0')
+class AttributeDefinition(ExtensiblePresentation):
+ """
+ An attribute definition defines a named, typed value that can be associated with an entity
+ defined in this specification (e.g., a Node, Relationship or Capability Type). Specifically, it
+ is used to expose the "actual state" of some property of a TOSCA entity after it has been
+ deployed and instantiated (as set by the TOSCA orchestrator). Attribute values can be retrieved
+ via the ``get_attribute`` function from the instance model and used as values to other
+ entities within TOSCA Service Templates.
+
+ See the `TOSCA Simple Profile v1.0 cos01 specification <http://docs.oasis-open.org/tosca
+ /TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html
+ #DEFN_ELEMENT_ATTRIBUTE_DEFN>`__
+ """
+
+ @field_validator(data_type_validator())
+ @primitive_field(str, required=True)
+ def type(self):
+ """
+ The required data type for the attribute.
+
+ :type: :obj:`basestring`
+ """
+
+ @object_field(Description)
+ def description(self):
+ """
+ The optional description for the attribute.
+
+ :type: :class:`Description`
+ """
+
+ @field_validator(data_value_validator)
+ @primitive_field()
+ def default(self):
+ """
+ An optional key that may provide a value to be used as a default if not provided by another
+ means.
+
+ This value SHALL be type compatible with the type declared by the property definition's type
+ keyname.
+
+ :type: :obj:`basestring`
+ """
+
+ @primitive_field(str, default='supported', allowed=('supported', 'unsupported', 'experimental',
+ 'deprecated'))
+ def status(self):
+ """
+ The optional status of the attribute relative to the specification or implementation.
+
+ :type: :obj:`basestring`
+ """
+
+ @field_validator(entry_schema_validator)
+ @object_field(EntrySchema)
+ def entry_schema(self):
+ """
+ The optional key that is used to declare the name of the Datatype definition for entries of
+ set types such as the TOSCA list or map.
+
+ :type: :obj:`basestring`
+ """
+
+ @cachedmethod
+ def _get_type(self, context):
+ return get_data_type(context, self, 'type')
+
+
+@has_fields
+@implements_specification('3.5.12', 'tosca-simple-1.0')
+class ParameterDefinition(PropertyDefinition):
+ """
+ A parameter definition is essentially a TOSCA property definition; however, it also allows a
+ value to be assigned to it (as for a TOSCA property assignment). In addition, in the case of
+ output parameters, it can optionally inherit the data type of the value assigned to it rather
+ than have an explicit data type defined for it.
+
+ See the `TOSCA Simple Profile v1.0 cos01 specification <http://docs.oasis-open.org/tosca
+ /TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html
+ #DEFN_ELEMENT_PARAMETER_DEF>`__
+ """
+
+ @field_validator(data_type_validator())
+ @primitive_field(str)
+ def type(self):
+ """
+ The required data type for the parameter.
+
+ Note: This keyname is required for a TOSCA Property definition, but is not for a TOSCA
+ Parameter definition.
+
+ :type: :obj:`basestring`
+ """
+
+ @field_validator(data_value_validator)
+ @primitive_field()
+ def value(self):
+ """
+ The type-compatible value to assign to the named parameter. Parameter values may be provided
+ as the result from the evaluation of an expression or a function.
+ """
+
+
+@short_form_field('implementation')
+@has_fields
+@implements_specification('3.5.13-1', 'tosca-simple-1.0')
+class OperationDefinition(ExtensiblePresentation):
+ """
+ An operation definition defines a named function or procedure that can be bound to an
+ implementation artifact (e.g., a script).
+
+ See the `TOSCA Simple Profile v1.0 cos01 specification <http://docs.oasis-open.org/tosca
+ /TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html
+ #DEFN_ELEMENT_OPERATION_DEF>`__
+ """
+
+ @object_field(Description)
+ def description(self):
+ """
+ The optional description string for the associated named operation.
+
+ :type: :class:`Description`
+ """
+
+ @object_field(OperationImplementation)
+ def implementation(self):
+ """
+ The optional implementation artifact name (e.g., a script file name within a TOSCA CSAR
+ file).
+
+ :type: :class:`OperationImplementation`
+ """
+
+ @object_dict_field(PropertyDefinition)
+ def inputs(self):
+ """
+ The optional list of input property definitions available to all defined operations for
+ interface definitions that are within TOSCA Node or Relationship Type definitions. This
+ includes when interface definitions are included as part of a Requirement definition in a
+ Node Type.
+
+ :type: {:obj:`basestring`: :class:`PropertyDefinition`}
+ """
+
+
+@allow_unknown_fields
+@has_fields
+@implements_specification('3.5.14-1', 'tosca-simple-1.0')
+class InterfaceDefinition(ExtensiblePresentation):
+ """
+ An interface definition defines a named interface that can be associated with a Node or
+ Relationship Type.
+
+ See the `TOSCA Simple Profile v1.0 cos01 specification <http://docs.oasis-open.org/tosca
+ /TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html
+ #DEFN_ELEMENT_INTERFACE_DEF>`__
+ """
+
+ @field_validator(type_validator('interface type', convert_name_to_full_type_name,
+ 'interface_types'))
+ @primitive_field(str)
+ def type(self):
+ """
+ ARIA NOTE: This field is not mentioned in the spec, but is implied.
+
+ :type: :obj:`basestring`
+ """
+
+ @object_dict_field(PropertyDefinition)
+ def inputs(self):
+ """
+ The optional list of input property definitions available to all defined operations for
+ interface definitions that are within TOSCA Node or Relationship Type definitions. This
+ includes when interface definitions are included as part of a Requirement definition in a
+ Node Type.
+
+ :type: {:obj:`basestring`: :class:`PropertyDefinition`}
+ """
+
+ @object_dict_unknown_fields(OperationDefinition)
+ def operations(self):
+ """
+ :type: {:obj:`basestring`: :class:`OperationDefinition`}
+ """
+
+ @cachedmethod
+ def _get_type(self, context):
+ return get_type_by_name(context, self.type, 'interface_types')
+
+ @cachedmethod
+ def _get_inputs(self, context):
+ return FrozenDict(get_and_override_input_definitions_from_type(context, self))
+
+ @cachedmethod
+ def _get_operations(self, context):
+ return FrozenDict(get_and_override_operation_definitions_from_type(context, self))
+
+ def _validate(self, context):
+ super(InterfaceDefinition, self)._validate(context)
+ if self.operations:
+ for operation in self.operations.itervalues(): # pylint: disable=no-member
+ operation._validate(context)
+
+
+@short_form_field('type')
+@has_fields
+class RelationshipDefinition(ExtensiblePresentation):
+ """
+ Relationship definition.
+ """
+
+ @field_validator(type_validator('relationship type', convert_name_to_full_type_name,
+ 'relationship_types'))
+ @primitive_field(str, required=True)
+ def type(self):
+ """
+ The optional reserved keyname used to provide the name of the Relationship Type for the
+ requirement definition's relationship keyname.
+
+ :type: :obj:`basestring`
+ """
+
+ @object_dict_field(InterfaceDefinition)
+ def interfaces(self):
+ """
+ The optional reserved keyname used to reference declared (named) interface definitions of
+ the corresponding Relationship Type in order to declare additional Property definitions for
+ these interfaces or operations of these interfaces.
+
+ :type: list of :class:`InterfaceDefinition`
+ """
+
+ @cachedmethod
+ def _get_type(self, context):
+ return get_type_by_name(context, self.type, 'relationship_types')
+
+
+
+@short_form_field('capability')
+@has_fields
+@implements_specification('3.6.2', 'tosca-simple-1.0')
+class RequirementDefinition(ExtensiblePresentation):
+ """
+ The Requirement definition describes a named requirement (dependencies) of a TOSCA Node Type or
+ Node template which needs to be fulfilled by a matching Capability definition declared by
+ another TOSCA modelable entity. The requirement definition may itself include the specific name
+ of the fulfilling entity (explicitly) or provide an abstract type, along with additional
+ filtering characteristics, that a TOSCA orchestrator can use to fulfill the capability at
+ runtime (implicitly).
+
+ See the `TOSCA Simple Profile v1.0 cos01 specification <http://docs.oasis-open.org/tosca
+ /TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html
+ #DEFN_ELEMENT_REQUIREMENT_DEF>`__
+ """
+
+ @field_validator(type_validator('capability type', convert_name_to_full_type_name,
+ 'capability_types'))
+ @primitive_field(str, required=True)
+ def capability(self):
+ """
+ The required reserved keyname used that can be used to provide the name of a valid
+ Capability Type that can fulfill the requirement.
+
+ :type: :obj:`basestring`
+ """
+
+ @field_validator(type_validator('node type', convert_name_to_full_type_name,
+ 'node_types'))
+ @primitive_field(str)
+ def node(self):
+ """
+ The optional reserved keyname used to provide the name of a valid Node Type that contains
+ the capability definition that can be used to fulfill the requirement.
+
+ :type: :obj:`basestring`
+ """
+
+ @object_field(RelationshipDefinition)
+ def relationship(self):
+ """
+ The optional reserved keyname used to provide the name of a valid Relationship Type to
+ construct when fulfilling the requirement.
+
+ :type: :class:`RelationshipDefinition`
+ """
+
+ @field_getter(data_type_class_getter(Range))
+ @primitive_field()
+ def occurrences(self):
+ """
+ The optional minimum and maximum occurrences for the requirement.
+
+ Note: the keyword UNBOUNDED is also supported to represent any positive integer.
+
+ :type: :class:`Range`
+ """
+
+ @cachedmethod
+ def _get_capability_type(self, context):
+ return get_type_by_name(context, self.capability, 'capability_types')
+
+ @cachedmethod
+ def _get_node_type(self, context):
+ return context.presentation.get_from_dict('service_template', 'node_types', self.node)
+
+
+@short_form_field('type')
+@has_fields
+@implements_specification('3.6.1', 'tosca-simple-1.0')
+class CapabilityDefinition(ExtensiblePresentation):
+ """
+ A capability definition defines a named, typed set of data that can be associated with Node Type
+ or Node Template to describe a transparent capability or feature of the software component the
+ node describes.
+
+ See the `TOSCA Simple Profile v1.0 cos01 specification <http://docs.oasis-open.org/tosca
+ /TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html
+ #DEFN_ELEMENT_CAPABILITY_DEFN>`__
+ """
+
+ @field_validator(type_validator('capability type', convert_name_to_full_type_name,
+ 'capability_types'))
+ @primitive_field(str, required=True)
+ def type(self):
+ """
+ The required name of the Capability Type the capability definition is based upon.
+
+ :type: :obj:`basestring`
+ """
+
+ @object_field(Description)
+ def description(self):
+ """
+ The optional description of the Capability definition.
+
+ :type: :class:`Description`
+ """
+
+ @object_dict_field(PropertyDefinition)
+ def properties(self):
+ """
+ An optional list of property definitions for the Capability definition.
+
+ :type: {:obj:`basestring`: :class:`PropertyDefinition`}
+ """
+
+ @object_dict_field(AttributeDefinition)
+ def attributes(self):
+ """
+ An optional list of attribute definitions for the Capability definition.
+
+ :type: {:obj:`basestring`: :class:`AttributeDefinition`}
+ """
+
+ @field_validator(list_type_validator('node type', convert_name_to_full_type_name,
+ 'node_types'))
+ @primitive_list_field(str)
+ def valid_source_types(self):
+ """
+ An optional list of one or more valid names of Node Types that are supported as valid
+ sources of any relationship established to the declared Capability Type.
+
+ :type: [:obj:`basestring`]
+ """
+
+ @field_getter(data_type_class_getter(Range))
+ @primitive_field()
+ def occurrences(self):
+ """
+ The optional minimum and maximum occurrences for the capability. By default, an exported
+ Capability should allow at least one relationship to be formed with it with a maximum of
+ ``UNBOUNDED`` relationships.
+
+ Note: the keyword ``UNBOUNDED`` is also supported to represent any positive integer.
+
+ ARIA NOTE: The spec seems wrong here: the implied default should be ``[0,UNBOUNDED]``, not
+ ``[1,UNBOUNDED]``, otherwise it would imply that at 1 least one relationship *must* be
+ formed.
+
+ :type: :class:`Range`
+ """
+
+ @cachedmethod
+ def _get_type(self, context):
+ return get_type_by_name(context, self.type, 'capability_types')
+
+ @cachedmethod
+ def _get_parent(self, context):
+ container_parent = self._container._get_parent(context)
+ container_parent_capabilities = container_parent._get_capabilities(context) \
+ if container_parent is not None else None
+ return container_parent_capabilities.get(self._name) \
+ if container_parent_capabilities is not None else None