http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/presentation/presenter.py ---------------------------------------------------------------------- diff --git a/aria/parser/presentation/presenter.py b/aria/parser/presentation/presenter.py index 9fd296f..d2f3292 100644 --- a/aria/parser/presentation/presenter.py +++ b/aria/parser/presentation/presenter.py @@ -41,10 +41,10 @@ class Presenter(Presentation): if tosca_definitions_version is not None \ and tosca_definitions_version not in self.__class__.ALLOWED_IMPORTED_DSL_VERSIONS: context.validation.report( - 'import "tosca_definitions_version" is not one of %s: %s' - % (' or '.join([safe_repr(v) - for v in self.__class__.ALLOWED_IMPORTED_DSL_VERSIONS]), - presentation.service_template.tosca_definitions_version), + u'import "tosca_definitions_version" is not one of {0}: {1}' + .format(u' or '.join([safe_repr(v) + for v in self.__class__.ALLOWED_IMPORTED_DSL_VERSIONS]), + presentation.service_template.tosca_definitions_version), locator=presentation._get_child_locator('inputs'), level=Issue.BETWEEN_TYPES) return False
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/presentation/source.py ---------------------------------------------------------------------- diff --git a/aria/parser/presentation/source.py b/aria/parser/presentation/source.py index 4bfb8e1..0bee5d1 100644 --- a/aria/parser/presentation/source.py +++ b/aria/parser/presentation/source.py @@ -26,7 +26,7 @@ class PresenterSource(object): Presenter sources provide appropriate :class:`Presenter` classes for agnostic raw data. """ - def get_presenter(self, raw): # pylint: disable=unused-argument,no-self-use + def get_presenter(self, raw): # pylint: disable=unused-argument,no-self-use raise PresenterNotFoundError('presenter not found') http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/presentation/utils.py ---------------------------------------------------------------------- diff --git a/aria/parser/presentation/utils.py b/aria/parser/presentation/utils.py index f0fd390..b805299 100644 --- a/aria/parser/presentation/utils.py +++ b/aria/parser/presentation/utils.py @@ -56,7 +56,7 @@ def validate_primitive(value, cls, coerce=False): :raises ValueError: if not a primitive type or if coercion failed. """ - if (cls is not None) and (value is not None) and (value is not NULL): + if (cls is not None) and (value is not None): if (cls is unicode) or (cls is str): # These two types are interchangeable valid = isinstance(value, basestring) elif cls is int: @@ -66,9 +66,11 @@ def validate_primitive(value, cls, coerce=False): valid = isinstance(value, cls) if not valid: if coerce: + if value is NULL: + value = None value = cls(value) else: - raise ValueError('not a "%s": %s' % (full_type_name(cls), safe_repr(value))) + raise ValueError(u'not a "{0}": {1}'.format(full_type_name(cls), safe_repr(value))) return value @@ -78,7 +80,8 @@ def validate_no_short_form(context, presentation): """ if not hasattr(presentation, 'SHORT_FORM_FIELD') and not isinstance(presentation._raw, dict): - context.validation.report('short form not allowed for field "%s"' % presentation._fullname, + context.validation.report(u'short form not allowed for field "{0}"' + .format(presentation._fullname), locator=presentation._locator, level=Issue.BETWEEN_FIELDS) @@ -94,8 +97,8 @@ def validate_no_unknown_fields(context, presentation): and hasattr(presentation, 'FIELDS'): for k in presentation._raw: if k not in presentation.FIELDS: - context.validation.report('field "%s" is not supported in "%s"' - % (k, presentation._fullname), + context.validation.report(u'field "{0}" is not supported in "{1}"' + .format(k, presentation._fullname), locator=presentation._get_child_locator(k), level=Issue.BETWEEN_FIELDS) @@ -161,27 +164,28 @@ def get_parent_presentation(context, presentation, *types_dict_names): def report_issue_for_unknown_type(context, presentation, type_name, field_name, value=None): if value is None: value = getattr(presentation, field_name) - context.validation.report('"%s" refers to an unknown %s in "%s": %s' - % (field_name, type_name, presentation._fullname, safe_repr(value)), + context.validation.report(u'"{0}" refers to an unknown {1} in "{2}": {3}' + .format(field_name, type_name, presentation._fullname, + safe_repr(value)), locator=presentation._get_child_locator(field_name), level=Issue.BETWEEN_TYPES) def report_issue_for_parent_is_self(context, presentation, field_name): - context.validation.report('parent type of "%s" is self' % presentation._fullname, + context.validation.report(u'parent type of "{0}" is self'.format(presentation._fullname), locator=presentation._get_child_locator(field_name), level=Issue.BETWEEN_TYPES) def report_issue_for_unknown_parent_type(context, presentation, field_name): - context.validation.report('unknown parent type "%s" in "%s"' - % (getattr(presentation, field_name), presentation._fullname), + context.validation.report(u'unknown parent type "{0}" in "{1}"' + .format(getattr(presentation, field_name), presentation._fullname), locator=presentation._get_child_locator(field_name), level=Issue.BETWEEN_TYPES) def report_issue_for_circular_type_hierarchy(context, presentation, field_name): - context.validation.report('"%s" of "%s" creates a circular type hierarchy' - % (getattr(presentation, field_name), presentation._fullname), + context.validation.report(u'"{0}" of "{1}" creates a circular type hierarchy' + .format(getattr(presentation, field_name), presentation._fullname), locator=presentation._get_child_locator(field_name), level=Issue.BETWEEN_TYPES) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/__init__.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/__init__.py b/aria/parser/reading/__init__.py index c110585..ddd9a3b 100644 --- a/aria/parser/reading/__init__.py +++ b/aria/parser/reading/__init__.py @@ -20,7 +20,6 @@ Reading package. ReaderException ReaderNotFoundError ReaderSyntaxError - AlreadyReadException JinjaReader JsonReader Locator @@ -41,14 +40,12 @@ from .context import ReadingContext from .source import ReaderSource, DefaultReaderSource from .exceptions import (ReaderException, ReaderNotFoundError, - ReaderSyntaxError, - AlreadyReadException) + ReaderSyntaxError) __all__ = ( 'ReaderException', 'ReaderNotFoundError', 'ReaderSyntaxError', - 'AlreadyReadException', 'Reader', 'ReaderSource', 'DefaultReaderSource', http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/context.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/context.py b/aria/parser/reading/context.py index 233e407..1eb05a4 100644 --- a/aria/parser/reading/context.py +++ b/aria/parser/reading/context.py @@ -10,7 +10,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from ...utils.threading import LockedList from .source import DefaultReaderSource @@ -27,5 +26,3 @@ class ReadingContext(object): def __init__(self): self.reader_source = DefaultReaderSource() self.reader = None - - self._locations = LockedList() # for keeping track of locations already read http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/exceptions.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/exceptions.py b/aria/parser/reading/exceptions.py index 3699729..13bec92 100644 --- a/aria/parser/reading/exceptions.py +++ b/aria/parser/reading/exceptions.py @@ -36,9 +36,3 @@ class ReaderSyntaxError(ReaderException): super(ReaderSyntaxError, self).__init__(message, cause, cause_tb) self.issue = Issue(message, location=location, line=line, column=column, locator=locator, snippet=snippet, level=level) - - -class AlreadyReadException(ReaderException): - """ - ARIA reader exception: already read. - """ http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/jinja.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/jinja.py b/aria/parser/reading/jinja.py index 687317a..623103a 100644 --- a/aria/parser/reading/jinja.py +++ b/aria/parser/reading/jinja.py @@ -36,7 +36,7 @@ class JinjaReader(Reader): def read(self): data = self.load() try: - data = str(data) + data = unicode(data) template = Template(data) literal = template.render(CONTEXT) # TODO: might be useful to write the literal result to a file for debugging @@ -52,4 +52,4 @@ class JinjaReader(Reader): self.context, LiteralLocation(literal), LiteralLoader(literal)) return next_reader.read() except Exception as e: - raise ReaderSyntaxError('Jinja: %s' % e, cause=e) + raise ReaderSyntaxError(u'Jinja: {0}'.format(e), cause=e) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/json.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/json.py b/aria/parser/reading/json.py index d144f80..d02aeee 100644 --- a/aria/parser/reading/json.py +++ b/aria/parser/reading/json.py @@ -30,4 +30,4 @@ class JsonReader(Reader): data = unicode(data) return json.loads(data, object_pairs_hook=OrderedDict) except Exception as e: - raise ReaderSyntaxError('JSON: %s' % e, cause=e) + raise ReaderSyntaxError(u'JSON: {0}'.format(e), cause=e) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/locator.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/locator.py b/aria/parser/reading/locator.py index 57b4d50..63f4735 100644 --- a/aria/parser/reading/locator.py +++ b/aria/parser/reading/locator.py @@ -73,23 +73,23 @@ class Locator(object): wrapped, raw_element = wrap(raw_element) if wrapped: raw[i] = raw_element - child_path = '%s.%d' % (path, i) if path else str(i) + child_path = u'{0}.{1:d}'.format(path, i) if path else unicode(i) try: self.children[i].link(raw_element, child_path) except KeyError: - raise ValueError('location map does not match agnostic raw data: %s' % - child_path) + raise ValueError('location map does not match agnostic raw data: {0}' + .format(child_path)) elif isinstance(raw, dict): for k, raw_element in raw.iteritems(): wrapped, raw_element = wrap(raw_element) if wrapped: raw[k] = raw_element - child_path = '%s.%s' % (path, k) if path else k + child_path = u'{0}.{1}'.format(path, k) if path else k try: self.children[k].link(raw_element, child_path) except KeyError: - raise ValueError('location map does not match agnostic raw data: %s' % - child_path) + raise ValueError('location map does not match agnostic raw data: {0}' + .format(child_path)) def merge(self, locator): if isinstance(self.children, dict) and isinstance(locator.children, dict): @@ -101,10 +101,10 @@ class Locator(object): def dump(self, key=None): if key: - puts('%s "%s":%d:%d' % - (Colored.red(key), Colored.blue(self.location), self.line, self.column)) + puts(u'{0} "{1}":{2:d}:{3:d}' + .format(Colored.red(key), Colored.blue(self.location), self.line, self.column)) else: - puts('"%s":%d:%d' % (Colored.blue(self.location), self.line, self.column)) + puts(u'"{0}":{1:d}:{2:d}'.format(Colored.blue(self.location), self.line, self.column)) if isinstance(self.children, list): with indent(2): for loc in self.children: @@ -116,4 +116,4 @@ class Locator(object): def __str__(self): # Should be in same format as Issue.locator_as_str - return '"%s":%d:%d' % (self.location, self.line, self.column) + return u'"{0}":{1:d}:{2:d}'.format(self.location, self.line, self.column) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/reader.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/reader.py b/aria/parser/reading/reader.py index 1a29f11..4cba0b5 100644 --- a/aria/parser/reading/reader.py +++ b/aria/parser/reading/reader.py @@ -11,7 +11,7 @@ # limitations under the License. from ...utils.openclose import OpenClose -from .exceptions import ReaderException, AlreadyReadException +from .exceptions import ReaderException class Reader(object): @@ -28,16 +28,9 @@ class Reader(object): def load(self): with OpenClose(self.loader) as loader: - if self.context is not None: - with self.context._locations: - for location in self.context._locations: - if location.is_equivalent(loader.location): - raise AlreadyReadException('already read: %s' % loader.location) - self.context._locations.append(loader.location) - data = loader.load() if data is None: - raise ReaderException('loader did not provide data: %s' % loader) + raise ReaderException(u'loader did not provide data: {0}'.format(loader)) return data def read(self): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/source.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/source.py b/aria/parser/reading/source.py index 6fff2f6..93260d2 100644 --- a/aria/parser/reading/source.py +++ b/aria/parser/reading/source.py @@ -31,8 +31,8 @@ class ReaderSource(object): """ @staticmethod - def get_reader(context, location, loader): # pylint: disable=unused-argument - raise ReaderNotFoundError('location: %s' % location) + def get_reader(context, location, loader): # pylint: disable=unused-argument + raise ReaderNotFoundError(u'location: {0}'.format(location)) class DefaultReaderSource(ReaderSource): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/reading/yaml.py ---------------------------------------------------------------------- diff --git a/aria/parser/reading/yaml.py b/aria/parser/reading/yaml.py index d396ade..77f8144 100644 --- a/aria/parser/reading/yaml.py +++ b/aria/parser/reading/yaml.py @@ -16,9 +16,14 @@ from ...utils.collections import OrderedDict from .reader import Reader from .locator import Locator from .exceptions import ReaderSyntaxError -from .locator import LocatableString, LocatableInt, LocatableFloat +from .locator import (LocatableString, LocatableInt, LocatableFloat) -# Add our types to ruamel.yaml + +MERGE_TAG = u'tag:yaml.org,2002:merge' +MAP_TAG = u'tag:yaml.org,2002:map' + + +# Add our types to RoundTripRepresenter yaml.representer.RoundTripRepresenter.add_representer( LocatableString, yaml.representer.RoundTripRepresenter.represent_unicode) yaml.representer.RoundTripRepresenter.add_representer( @@ -26,8 +31,15 @@ yaml.representer.RoundTripRepresenter.add_representer( yaml.representer.RoundTripRepresenter.add_representer( LocatableFloat, yaml.representer.RoundTripRepresenter.represent_float) -MERGE_TAG = u'tag:yaml.org,2002:merge' -MAP_TAG = u'tag:yaml.org,2002:map' + +def construct_yaml_map(self, node): + data = OrderedDict() + yield data + value = self.construct_mapping(node) + data.update(value) + + +yaml.constructor.SafeConstructor.add_constructor(MAP_TAG, construct_yaml_map) class YamlLocator(Locator): @@ -60,16 +72,6 @@ class YamlLocator(Locator): locator.add_children(node) -def construct_yaml_map(self, node): - data = OrderedDict() - yield data - value = self.construct_mapping(node) - data.update(value) - - -yaml.constructor.SafeConstructor.add_constructor(MAP_TAG, construct_yaml_map) - - class YamlReader(Reader): """ ARIA YAML reader. @@ -82,7 +84,11 @@ class YamlReader(Reader): # see issue here: # https://bitbucket.org/ruamel/yaml/issues/61/roundtriploader-causes-exceptions-with #yaml_loader = yaml.RoundTripLoader(data) - yaml_loader = yaml.SafeLoader(data) + try: + # Faster C-based loader, might not be available on all platforms + yaml_loader = yaml.CSafeLoader(data) + except BaseException: + yaml_loader = yaml.SafeLoader(data) try: node = yaml_loader.get_single_node() locator = YamlLocator(self.loader.location, 0, 0) @@ -102,12 +108,12 @@ class YamlReader(Reader): line = e.problem_mark.line column = e.problem_mark.column snippet = e.problem_mark.get_snippet() - raise ReaderSyntaxError('YAML %s: %s %s' % - (e.__class__.__name__, problem, context), + raise ReaderSyntaxError(u'YAML {0}: {1} {2}' + .format(e.__class__.__name__, problem, context), location=self.loader.location, line=line, column=column, snippet=snippet, cause=e) except Exception as e: - raise ReaderSyntaxError('YAML: %s' % e, cause=e) + raise ReaderSyntaxError(u'YAML: {0}'.format(e), cause=e) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/specification.py ---------------------------------------------------------------------- diff --git a/aria/parser/specification.py b/aria/parser/specification.py index 4f452b8..682cea3 100644 --- a/aria/parser/specification.py +++ b/aria/parser/specification.py @@ -21,7 +21,7 @@ import re from ..extension import parser from ..utils.collections import OrderedDict -from ..utils.specification import (DSL_SPECIFICATIONS, implements_specification) # pylint: disable=unused-import +from ..utils.specification import (DSL_SPECIFICATIONS, implements_specification) # pylint: disable=unused-import def iter_specifications(): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/parser/validation/issue.py ---------------------------------------------------------------------- diff --git a/aria/parser/validation/issue.py b/aria/parser/validation/issue.py index 42fc580..e26408e 100644 --- a/aria/parser/validation/issue.py +++ b/aria/parser/validation/issue.py @@ -66,9 +66,9 @@ class Issue(object): def __init__(self, message=None, exception=None, location=None, line=None, column=None, locator=None, snippet=None, level=0): if message is not None: - self.message = str(message) + self.message = unicode(message) elif exception is not None: - self.message = str(exception) + self.message = unicode(exception) else: self.message = 'unknown issue' @@ -102,33 +102,33 @@ class Issue(object): if self.location is not None: if self.line is not None: if self.column is not None: - return '"%s":%d:%d' % (self.location, self.line, self.column) + return u'"{0}":{1:d}:{2:d}'.format(self.location, self.line, self.column) else: - return '"%s":%d' % (self.location, self.line) + return u'"{0}":{1:d}'.format(self.location, self.line) else: - return '"%s"' % self.location + return u'"{0}"'.format(self.location) else: return None @property def heading_as_str(self): - return '%d: %s' % (self.level, self.message) + return u'{0:d}: {1}'.format(self.level, self.message) @property def details_as_str(self): - details_str = '' + details_str = u'' locator = self.locator_as_str if locator is not None: - details_str += '@%s' % locator + details_str += u'@{0}'.format(locator) if self.snippet is not None: - details_str += '\n%s' % self.snippet + details_str += u'\n{0}'.format(self.snippet) return details_str def __str__(self): heading_str = self.heading_as_str details = self.details_as_str if details: - heading_str += ', ' + details + heading_str += u', ' + details return heading_str @@ -149,7 +149,7 @@ class ReporterMixin(object): # Avoid duplicate issues with self._issues: for i in self._issues: - if str(i) == str(issue): + if unicode(i) == unicode(issue): return self._issues.append(issue) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/storage/filesystem_rapi.py ---------------------------------------------------------------------- diff --git a/aria/storage/filesystem_rapi.py b/aria/storage/filesystem_rapi.py index b425fa2..d0703e6 100644 --- a/aria/storage/filesystem_rapi.py +++ b/aria/storage/filesystem_rapi.py @@ -129,7 +129,7 @@ class FileSystemResourceAPI(api.ResourceAPI): if os.path.isfile(resource): shutil.copy2(resource, destination) else: - dir_util.copy_tree(resource, destination) # pylint: disable=no-member + dir_util.copy_tree(resource, destination) # pylint: disable=no-member def upload(self, entry_id, source, path=None, **_): """ @@ -146,7 +146,7 @@ class FileSystemResourceAPI(api.ResourceAPI): if os.path.isfile(source): shutil.copy2(source, destination) else: - dir_util.copy_tree(source, destination) # pylint: disable=no-member + dir_util.copy_tree(source, destination) # pylint: disable=no-member def delete(self, entry_id, path=None, **_): """ http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/utils/caching.py ---------------------------------------------------------------------- diff --git a/aria/utils/caching.py b/aria/utils/caching.py index 5f8cd88..350a9e8 100644 --- a/aria/utils/caching.py +++ b/aria/utils/caching.py @@ -25,7 +25,7 @@ from functools import partial from .collections import OrderedDict -class cachedmethod(object): # pylint: disable=invalid-name +class cachedmethod(object): # pylint: disable=invalid-name """ Decorator for caching method return values. http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/utils/collections.py ---------------------------------------------------------------------- diff --git a/aria/utils/collections.py b/aria/utils/collections.py index ccc37a1..cfd8fda 100644 --- a/aria/utils/collections.py +++ b/aria/utils/collections.py @@ -19,6 +19,11 @@ Additional collection classes and collection utilities. from __future__ import absolute_import # so we can import standard 'collections' +try: + import cPickle as pickle +except ImportError: + import pickle + from copy import deepcopy try: from collections import OrderedDict @@ -220,27 +225,30 @@ class StrictDict(OrderedDict): return super(StrictDict, self).__setitem__(key, value) -def merge(dict_a, dict_b, path=None, strict=False): +def merge(dict_a, dict_b, copy=True, strict=False, path=None): """ Merges dicts, recursively. """ - # TODO: a.add_yaml_merge(b), see https://bitbucket.org/ruamel/yaml/src/ - # TODO: 86622a1408e0f171a12e140d53c4ffac4b6caaa3/comments.py?fileviewer=file-view-default + # TODO: a.add_yaml_merge(b), + # see https://bitbucket.org/ruamel/yaml/src/86622a1408e0f171a12e140d53c4ffac4b6caaa3/ + # comments.py?fileviewer=file-view-default path = path or [] for key, value_b in dict_b.iteritems(): if key in dict_a: value_a = dict_a[key] if isinstance(value_a, dict) and isinstance(value_b, dict): - merge(value_a, value_b, path + [str(key)], strict) + if strict: + path = path + [str(key)] + merge(value_a, value_b, copy, strict, path) elif value_a != value_b: if strict: raise ValueError('dict merge conflict at %s' % '.'.join(path + [str(key)])) else: - dict_a[key] = value_b + dict_a[key] = deepcopy_fast(value_b) if copy else value_b else: - dict_a[key] = value_b + dict_a[key] = deepcopy_fast(value_b) if copy else value_b return dict_a @@ -269,6 +277,15 @@ def prune(value, is_removable_function=is_removable): return value +def deepcopy_fast(obj): + """ + The builtin ``deepcopy`` is very slow due to detection of loops and other errors. + + This version is surprisingly much faster. + """ + return pickle.loads(pickle.dumps(obj)) + + # TODO: Move following two methods to some place parser specific def deepcopy_with_locators(value): @@ -276,7 +293,7 @@ def deepcopy_with_locators(value): Like :func:`~copy.deepcopy`, but also copies over locators. """ - res = deepcopy(value) + res = deepcopy_fast(value) copy_locators(res, value) return res http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/utils/formatting.py ---------------------------------------------------------------------- diff --git a/aria/utils/formatting.py b/aria/utils/formatting.py index fac3221..c9e7988 100644 --- a/aria/utils/formatting.py +++ b/aria/utils/formatting.py @@ -61,7 +61,7 @@ class JsonAsRawEncoder(json.JSONEncoder): super(JsonAsRawEncoder, self).__init__(*args, **kwargs) -class YamlAsRawDumper(yaml.dumper.RoundTripDumper): # pylint: disable=too-many-ancestors +class YamlAsRawDumper(yaml.dumper.RoundTripDumper): # pylint: disable=too-many-ancestors """ A :class:`RoundTripDumper` that will use the ``as_raw`` property of objects if available. """ http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/utils/threading.py ---------------------------------------------------------------------- diff --git a/aria/utils/threading.py b/aria/utils/threading.py index f5ca302..a32136d 100644 --- a/aria/utils/threading.py +++ b/aria/utils/threading.py @@ -59,10 +59,9 @@ class DaemonThread(Thread): pass -# https://gist.github.com/tliron/81dd915166b0bfc64be08b4f8e22c835 -class FixedThreadPoolExecutor(object): +class Executor(object): """ - Executes tasks in a fixed thread pool. + Executes tasks. Makes sure to gather all returned results and thrown exceptions in one place, in order of task submission. @@ -93,7 +92,104 @@ class FixedThreadPoolExecutor(object): print executor.returns """ - _CYANIDE = object() # Special task marker used to kill worker threads. + def __init__(self, print_exceptions=False): + self.print_exceptions = print_exceptions + + def submit(self, func, *args, **kwargs): + """ + Submit a task for execution. + + The task will be called ASAP on the next available worker thread in the pool. + + :raises ExecutorException: if cannot be submitted + """ + raise NotImplementedError + + def close(self): + """ + Blocks until all current tasks finish execution and all worker threads are dead. + + You cannot submit tasks anymore after calling this. + + This is called automatically upon exit if you are using the ``with`` keyword. + """ + pass + + def drain(self): + """ + Blocks until all current tasks finish execution, but leaves the worker threads alive. + """ + pass + + @property + def returns(self): + """ + The returned values from all tasks, in order of submission. + """ + return () + + @property + def exceptions(self): + """ + The raised exceptions from all tasks, in order of submission. + """ + return () + + def raise_first(self): + """ + If exceptions were thrown by any task, then the first one will be raised. + + This is rather arbitrary: proper handling would involve iterating all the exceptions. + However, if you want to use the "raise" mechanism, you are limited to raising only one of + them. + """ + + exceptions = self.exceptions + if exceptions: + raise exceptions[0] + + def __enter__(self): + return self + + def __exit__(self, the_type, value, traceback): + pass + + +class BlockingExecutor(Executor): + """ + Executes tasks in the current thread. + """ + + def __init__(self, print_exceptions=False): + super(BlockingExecutor, self).__init__(print_exceptions=print_exceptions) + self._returns = [] + self._exceptions = [] + + def submit(self, func, *args, **kwargs): + try: + result = func(*args, **kwargs) + self._returns.append(result) + except Exception as e: + self._exceptions.append(e) + if self.print_exceptions: + print_exception(e) + + @property + def returns(self): + return self._returns + + @property + def exceptions(self): + return self._exceptions + + +# https://gist.github.com/tliron/81dd915166b0bfc64be08b4f8e22c835 +class FixedThreadPoolExecutor(Executor): + """ + Executes tasks in a fixed thread pool. + """ + + _CYANIDE = object() # special task marker used to kill worker threads def __init__(self, size=None, @@ -105,6 +201,8 @@ class FixedThreadPoolExecutor(object): :param timeout: timeout in seconds for all blocking operations (``None`` means no timeout) :param print_exceptions: set to ``True`` in order to print exceptions from tasks """ + super(FixedThreadPoolExecutor, self).__init__(print_exceptions=print_exceptions) + if not size: try: size = multiprocessing.cpu_count() * 2 + 1 @@ -113,7 +211,6 @@ class FixedThreadPoolExecutor(object): self.size = size self.timeout = timeout - self.print_exceptions = print_exceptions self._tasks = Queue() self._returns = {} @@ -124,34 +221,18 @@ class FixedThreadPoolExecutor(object): self._workers = [] for index in range(size): worker = DaemonThread( - name='%s%d' % (self.__class__.__name__, index), + name='{0}{1:d}'.format(self.__class__.__name__, index), target=self._thread_worker) worker.start() self._workers.append(worker) def submit(self, func, *args, **kwargs): - """ - Submit a task for execution. - - The task will be called ASAP on the next available worker thread in the pool. - - :raises ExecutorException: if cannot be submitted - """ - try: self._tasks.put((self._id_creator.next(), func, args, kwargs), timeout=self.timeout) except Full: raise ExecutorException('cannot submit task: queue is full') def close(self): - """ - Blocks until all current tasks finish execution and all worker threads are dead. - - You cannot submit tasks anymore after calling this. - - This is called automatically upon exit if you are using the ``with`` keyword. - """ - self.drain() while self.is_alive: try: @@ -161,11 +242,7 @@ class FixedThreadPoolExecutor(object): self._workers = None def drain(self): - """ - Blocks until all current tasks finish execution, but leaves the worker threads alive. - """ - - self._tasks.join() # oddly, the API does not support a timeout parameter + self._tasks.join() # oddly, the API does not support a timeout parameter @property def is_alive(self): @@ -180,33 +257,12 @@ class FixedThreadPoolExecutor(object): @property def returns(self): - """ - The returned values from all tasks, in order of submission. - """ - return [self._returns[k] for k in sorted(self._returns)] @property def exceptions(self): - """ - The raised exceptions from all tasks, in order of submission. - """ - return [self._exceptions[k] for k in sorted(self._exceptions)] - def raise_first(self): - """ - If exceptions were thrown by any task, then the first one will be raised. - - This is rather arbitrary: proper handling would involve iterating all the exceptions. - However, if you want to use the "raise" mechanism, you are limited to raising only one of - them. - """ - - exceptions = self.exceptions - if exceptions: - raise exceptions[0] - def _thread_worker(self): while True: if not self._execute_next_task(): @@ -240,7 +296,6 @@ class FixedThreadPoolExecutor(object): def __exit__(self, the_type, value, traceback): self.close() - return False class LockedList(list): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/utils/uris.py ---------------------------------------------------------------------- diff --git a/aria/utils/uris.py b/aria/utils/uris.py index 49881f2..bb5b6ce 100644 --- a/aria/utils/uris.py +++ b/aria/utils/uris.py @@ -43,6 +43,6 @@ def as_file(uri): path = url.path if _IS_WINDOWS: path = path.replace('/', '\\') - return os.path.normpath(path) + return os.path.realpath(path) return None http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/aria/utils/versions.py ---------------------------------------------------------------------- diff --git a/aria/utils/versions.py b/aria/utils/versions.py index 521004c..83f37d1 100644 --- a/aria/utils/versions.py +++ b/aria/utils/versions.py @@ -24,7 +24,7 @@ _INF = float('inf') _NULL = (), _INF -_DIGITS_RE = re.compile(r'^\d+$') +_DIGITS_RE = re.compile(r'^\d+$', flags=re.UNICODE) _PREFIXES = { 'dev': 0.0001, @@ -81,7 +81,7 @@ class VersionString(unicode): return self.key.__hash__() -def parse_version_string(version): # pylint: disable=too-many-branches +def parse_version_string(version): # pylint: disable=too-many-branches """ Parses a version string. http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/examples/clearwater/clearwater-single-existing.yaml ---------------------------------------------------------------------- diff --git a/examples/clearwater/clearwater-single-existing.yaml b/examples/clearwater/clearwater-single-existing.yaml index 72b882a..4be3c6f 100644 --- a/examples/clearwater/clearwater-single-existing.yaml +++ b/examples/clearwater/clearwater-single-existing.yaml @@ -139,9 +139,9 @@ topology_template: 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 ] + 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/89b9f130/examples/hello-world/hello-world.yaml ---------------------------------------------------------------------- diff --git a/examples/hello-world/hello-world.yaml b/examples/hello-world/hello-world.yaml index 86e2ad0..3d36049 100644 --- a/examples/hello-world/hello-world.yaml +++ b/examples/hello-world/hello-world.yaml @@ -2,30 +2,24 @@ tosca_definitions_version: tosca_simple_yaml_1_0 node_types: - WebServer: - derived_from: tosca:Root - capabilities: - host: - type: tosca:Container - - WebApp: + HelloWorld: derived_from: tosca:WebApplication - properties: - port: - type: integer + requirements: + - host: + # Override to allow for 0 occurrences + capability: tosca:Container + occurrences: [ 0, UNBOUNDED ] topology_template: node_templates: - web_server: - type: WebServer - - web_app: - type: WebApp - properties: - port: 9090 - requirements: - - host: web_server + hello_world: + type: HelloWorld + capabilities: + app_endpoint: + properties: + protocol: http + port: 9090 interfaces: Standard: configure: scripts/configure.sh @@ -35,4 +29,4 @@ topology_template: outputs: port: type: integer - value: { get_property: [ web_app, port ] } + value: { get_property: [ hello_world, app_endpoint, port ] } http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/examples/hello-world/scripts/start.sh ---------------------------------------------------------------------- diff --git a/examples/hello-world/scripts/start.sh b/examples/hello-world/scripts/start.sh index 1525f30..8a1f2fc 100755 --- a/examples/hello-world/scripts/start.sh +++ b/examples/hello-world/scripts/start.sh @@ -19,7 +19,7 @@ set -e TEMP_DIR=/tmp PYTHON_FILE_SERVER_ROOT="$TEMP_DIR/python-simple-http-webserver" PID_FILE=server.pid -PORT=$(ctx node properties port) +PORT=$(ctx node capabilities app_endpoint properties port) URL="http://localhost:$PORT" ctx logger info [ "Starting web server at: $PYTHON_FILE_SERVER_ROOT." ] http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/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 da89dcb..29a61f1 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 @@ -161,9 +161,11 @@ node_types: default: https://github.com/mmm/testnode.git interfaces: Standard: + type: tosca.interfaces.node.lifecycle.Standard # ARIA NOTE: missing in spec inputs: github_url: type: string + required: false # ARIA NOTE: missing in spec tosca.nodes.Container.Application.Docker: _extensions: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/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 e421150..82c456b 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 @@ -17,6 +17,7 @@ policy_types: aria.Plugin: _extensions: + normative: true shorthand_name: Plugin type_qualified_name: aria:Plugin role: plugin @@ -40,6 +41,7 @@ policy_types: aria.Workflow: _extensions: + normative: true shorthand_name: Workflow type_qualified_name: aria:Workflow role: workflow @@ -61,6 +63,7 @@ policy_types: aria.Scaling: _extensions: + normative: true type_qualified_name: aria:Scaling role: scaling description: >- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml index 945622f..963361f 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml @@ -17,6 +17,7 @@ artifact_types: tosca.artifacts.Root: _extensions: + normative: true shorthand_name: Root # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Root specification: tosca-simple-1.0 @@ -27,6 +28,7 @@ artifact_types: tosca.artifacts.File: _extensions: + normative: true shorthand_name: File type_qualified_name: tosca:File specification: tosca-simple-1.0 @@ -41,6 +43,7 @@ artifact_types: tosca.artifacts.Deployment: _extensions: + normative: true shorthand_name: Deployment # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Deployment specification: tosca-simple-1.0 @@ -54,6 +57,7 @@ artifact_types: tosca.artifacts.Deployment.Image: _extensions: + normative: true shorthand_name: Deployment.Image type_qualified_name: tosca:Deployment.Image specification: tosca-simple-1.0 @@ -67,6 +71,7 @@ artifact_types: tosca.artifacts.Deployment.Image.VM: _extensions: + normative: true shorthand_name: Deployment.VM # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Deployment.VM specification: tosca-simple-1.0 @@ -85,6 +90,7 @@ artifact_types: tosca.artifacts.Implementation: _extensions: + normative: true shorthand_name: Implementation # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Implementation specification: tosca-simple-1.0 @@ -97,6 +103,7 @@ artifact_types: tosca.artifacts.Implementation.Bash: _extensions: + normative: true shorthand_name: Implementation.Bash # ARIA NOTE: mistake in spec? shouldn't we have "Implementation." as prefix? type_qualified_name: tosca:Implementation.Bash specification: tosca-simple-1.0 @@ -109,6 +116,7 @@ artifact_types: tosca.artifacts.Implementation.Python: _extensions: + normative: true shorthand_name: Implementation.Python # ARIA NOTE: mistake in spec? shouldn't we have "Implementation." as prefix? type_qualified_name: tosca:Implementation.Python specification: tosca-simple-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/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 66a4046..784279b 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 @@ -17,6 +17,7 @@ capability_types: tosca.capabilities.Root: _extensions: + normative: true shorthand_name: Root # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Root specification: tosca-simple-1.0 @@ -27,6 +28,7 @@ capability_types: tosca.capabilities.Node: _extensions: + normative: true shorthand_name: Node type_qualified_name: tosca:Node specification: tosca-simple-1.0 @@ -39,6 +41,7 @@ capability_types: tosca.capabilities.Container: _extensions: + normative: true shorthand_name: Container type_qualified_name: tosca:Container specification: tosca-simple-1.0 @@ -82,6 +85,7 @@ capability_types: tosca.capabilities.Attachment: _extensions: + normative: true shorthand_name: Attachment type_qualified_name: tosca:Attachment specification: tosca-simple-1.0 @@ -94,6 +98,7 @@ capability_types: tosca.capabilities.OperatingSystem: _extensions: + normative: true shorthand_name: OperatingSystem type_qualified_name: tosca:OperatingSystem specification: tosca-simple-1.0 @@ -127,6 +132,7 @@ capability_types: tosca.capabilities.Scalable: _extensions: + normative: true shorthand_name: Scalable type_qualified_name: tosca:Scalable specification: tosca-simple-1.0 @@ -163,6 +169,7 @@ capability_types: tosca.capabilities.Endpoint: _extensions: + normative: true shorthand_name: Endpoint type_qualified_name: tosca:Endpoint specification: tosca-simple-1.0 @@ -232,6 +239,7 @@ capability_types: tosca.capabilities.Endpoint.Public: _extensions: + normative: true shorthand_name: Endpoint.Public type_qualified_name: tosca:Endpoint.Public specification: tosca-simple-1.0 @@ -265,6 +273,7 @@ capability_types: tosca.capabilities.Endpoint.Admin: _extensions: + normative: true shorthand_name: Endpoint.Admin type_qualified_name: tosca:Endpoint.Admin specification: tosca-simple-1.0 @@ -284,6 +293,7 @@ capability_types: tosca.capabilities.Endpoint.Database: _extensions: + normative: true shorthand_name: Endpoint.Database type_qualified_name: tosca:Endpoint.Database specification: tosca-simple-1.0 @@ -299,6 +309,7 @@ capability_types: tosca.capabilities.network.Bindable: _extensions: + normative: true shorthand_name: Bindable # ARIA NOTE: mistake in spec? has "network." as a prefix type_qualified_name: tosca:Bindable specification: tosca-simple-1.0 @@ -311,6 +322,7 @@ capability_types: tosca.capabilities.network.Linkable: _extensions: + normative: true shorthand_name: Linkable type_qualified_name: tosca:Linkable specification: tosca-simple-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml index 61d4186..7a65cbd 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml @@ -21,10 +21,12 @@ data_types: timestamp: _extensions: + normative: true coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_timestamp version: _extensions: + normative: true coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_version type_qualified_name: tosca:version specification: tosca-simple-1.0 @@ -33,6 +35,7 @@ data_types: range: _extensions: + normative: true coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_range type_qualified_name: tosca:range specification: tosca-simple-1.0 @@ -45,6 +48,7 @@ data_types: list: _extensions: + normative: true use_entry_schema: true coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_list type_qualified_name: tosca:list @@ -54,6 +58,7 @@ data_types: map: _extensions: + normative: true use_entry_schema: true coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_map_value type_qualified_name: tosca:map @@ -67,6 +72,7 @@ data_types: scalar-unit.size: _extensions: + normative: true coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_scalar_unit_size type_qualified_name: tosca:scalar-unit.size specification: tosca-simple-1.0 @@ -75,6 +81,7 @@ data_types: scalar-unit.time: _extensions: + normative: true coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_scalar_unit_time type_qualified_name: tosca:scalar-unit.time specification: tosca-simple-1.0 @@ -83,6 +90,7 @@ data_types: scalar-unit.frequency: _extensions: + normative: true coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_scalar_unit_frequency type_qualified_name: tosca:scalar-unit.frequency specification: tosca-simple-1.0 @@ -95,6 +103,7 @@ data_types: tosca.datatypes.Root: _extensions: + normative: true shorthand_name: Root # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Root specification: tosca-simple-1.0 @@ -105,6 +114,7 @@ data_types: tosca.datatypes.Credential: _extensions: + normative: true shorthand_name: Credential type_qualified_name: tosca:Credential specification: tosca-simple-1.0 @@ -145,6 +155,7 @@ data_types: tosca.datatypes.network.NetworkInfo: _extensions: + normative: true shorthand_name: NetworkInfo type_qualified_name: tosca:NetworkInfo specification: tosca-simple-1.0 @@ -174,6 +185,7 @@ data_types: tosca.datatypes.network.PortInfo: _extensions: + normative: true shorthand_name: PortInfo type_qualified_name: tosca:PortInfo specification: tosca-simple-1.0 @@ -213,6 +225,7 @@ data_types: tosca.datatypes.network.PortDef: _extensions: + normative: true shorthand_name: PortDef type_qualified_name: tosca:PortDef specification: tosca-simple-1.0 @@ -226,6 +239,7 @@ data_types: tosca.datatypes.network.PortSpec: _extensions: + normative: true shorthand_name: PortSpec type_qualified_name: tosca:PortSpec specification: tosca-simple-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/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 66cc25f..9b9aa23 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 @@ -17,6 +17,7 @@ group_types: tosca.groups.Root: _extensions: + normative: true shorthand_name: Root # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Root specification: tosca-simple-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml index 29cc8dd..25e8993 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml @@ -17,6 +17,7 @@ interface_types: tosca.interfaces.Root: _extensions: + normative: true shorthand_name: Root # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Root specification: tosca-simple-1.0 @@ -27,6 +28,7 @@ interface_types: tosca.interfaces.node.lifecycle.Standard: _extensions: + normative: true shorthand_name: Standard type_qualified_name: tosca:Standard specification: tosca-simple-1.0 @@ -52,6 +54,7 @@ interface_types: tosca.interfaces.relationship.Configure: _extensions: + normative: true shorthand_name: Configure type_qualified_name: tosca:Configure specification: tosca-simple-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml index 05963b7..576b41b 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml @@ -17,6 +17,7 @@ node_types: tosca.nodes.Root: _extensions: + normative: true shorthand_name: Root type_qualified_name: tosca:Root specification: tosca-simple-1.0 @@ -55,6 +56,7 @@ node_types: tosca.nodes.Compute: _extensions: + normative: true shorthand_name: Compute type_qualified_name: tosca:Compute specification: tosca-simple-1.0 @@ -106,6 +108,7 @@ node_types: tosca.nodes.LoadBalancer: _extensions: + normative: true shorthand_name: LoadBalancer type_qualified_name: tosca:LoadBalancer specification: tosca-simple-1.0 @@ -140,6 +143,7 @@ node_types: tosca.nodes.SoftwareComponent: _extensions: + normative: true shorthand_name: SoftwareComponent type_qualified_name: tosca:SoftwareComponent specification: tosca-simple-1.0 @@ -168,6 +172,7 @@ node_types: tosca.nodes.WebServer: _extensions: + normative: true shorthand_name: WebServer type_qualified_name: tosca:WebServer specification: tosca-simple-1.0 @@ -188,6 +193,7 @@ node_types: tosca.nodes.WebApplication: _extensions: + normative: true shorthand_name: WebApplication type_qualified_name: tosca:WebApplication specification: tosca-simple-1.0 @@ -214,6 +220,7 @@ node_types: tosca.nodes.DBMS: _extensions: + normative: true shorthand_name: DBMS # ARIA NOTE: omitted in the spec type_qualified_name: tosca:DBMS specification: tosca-simple-1.0 @@ -240,6 +247,7 @@ node_types: tosca.nodes.Database: _extensions: + normative: true shorthand_name: Database type_qualified_name: tosca:Database specification: tosca-simple-1.0 @@ -283,6 +291,7 @@ node_types: tosca.nodes.Container.Runtime: _extensions: + normative: true shorthand_name: Container.Runtime type_qualified_name: tosca:Container.Runtime specification: tosca-simple-1.0 @@ -300,6 +309,7 @@ node_types: tosca.nodes.Container.Application: _extensions: + normative: true shorthand_name: Container.Application type_qualified_name: tosca:Container.Application specification: tosca-simple-1.0 @@ -321,6 +331,7 @@ node_types: tosca.nodes.ObjectStorage: _extensions: + normative: true shorthand_name: ObjectStorage type_qualified_name: tosca:ObjectStorage specification: tosca-simple-1.0 @@ -354,6 +365,7 @@ node_types: tosca.nodes.BlockStorage: _extensions: + normative: true shorthand_name: BlockStorage type_qualified_name: tosca:BlockStorage specification: tosca-simple-1.0 @@ -388,6 +400,7 @@ node_types: tosca.nodes.network.Network: _extensions: + normative: true shorthand_name: Network type_qualified_name: tosca:Network specification: tosca-simple-1.0 @@ -466,6 +479,7 @@ node_types: tosca.nodes.network.Port: _extensions: + normative: true shorthand_name: Port type_qualified_name: tosca:Port specification: tosca-simple-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml index 7b35bb9..2ff672e 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml @@ -17,6 +17,7 @@ policy_types: tosca.policies.Root: _extensions: + normative: true shorthand_name: Root # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Root specification: tosca-simple-1.0 @@ -27,6 +28,7 @@ policy_types: tosca.policies.Placement: _extensions: + normative: true shorthand_name: Placement # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Placement specification: tosca-simple-1.0 @@ -38,6 +40,7 @@ policy_types: tosca.policies.Scaling: _extensions: + normative: true shorthand_name: Scaling # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Scaling specification: tosca-simple-1.0 @@ -49,6 +52,7 @@ policy_types: tosca.policies.Update: _extensions: + normative: true shorthand_name: Update # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Update specification: tosca-simple-1.0 @@ -60,6 +64,7 @@ policy_types: tosca.policies.Performance: _extensions: + normative: true shorthand_name: Performance # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Performance specification: tosca-simple-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml index 9f2c32c..b45da96 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml @@ -17,6 +17,7 @@ relationship_types: tosca.relationships.Root: _extensions: + normative: true shorthand_name: Root # ARIA NOTE: omitted in the spec type_qualified_name: tosca:Root specification: tosca-simple-1.0 @@ -46,6 +47,7 @@ relationship_types: tosca.relationships.DependsOn: _extensions: + normative: true shorthand_name: DependsOn type_qualified_name: tosca:DependsOn specification: tosca-simple-1.0 @@ -58,6 +60,7 @@ relationship_types: tosca.relationships.HostedOn: _extensions: + normative: true shorthand_name: HostedOn type_qualified_name: tosca:HostedOn specification: tosca-simple-1.0 @@ -70,6 +73,7 @@ relationship_types: tosca.relationships.ConnectsTo: _extensions: + normative: true shorthand_name: ConnectsTo type_qualified_name: tosca:ConnectsTo specification: tosca-simple-1.0 @@ -86,6 +90,7 @@ relationship_types: tosca.relationships.AttachesTo: _extensions: + normative: true shorthand_name: AttachesTo type_qualified_name: tosca:AttachesTo specification: tosca-simple-1.0 @@ -119,6 +124,7 @@ relationship_types: tosca.relationships.RoutesTo: _extensions: + normative: true shorthand_name: RoutesTo type_qualified_name: tosca:RoutesTo specification: tosca-simple-1.0 @@ -135,6 +141,7 @@ relationship_types: tosca.relationships.network.LinksTo: _extensions: + normative: true shorthand_name: LinksTo type_qualified_name: tosca:LinksTo specification: tosca-simple-1.0 @@ -147,6 +154,7 @@ relationship_types: tosca.relationships.network.BindsTo: _extensions: + normative: true shorthand_name: BindsTo # ARIA NOTE: the spec says "network.BindsTo" which seems wrong type_qualified_name: tosca:BindsTo specification: tosca-simple-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml index 2427d9f..4a8e3c6 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml @@ -17,6 +17,7 @@ artifact_types: tosca.artifacts.nfv.SwImage: _extensions: + normative: true shorthand_name: SwImage type_qualified_name: tosca:SwImage specification: tosca-simple-nfv-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml index 7b6363f..0e71a3b 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml @@ -17,6 +17,7 @@ capability_types: tosca.capabilities.nfv.VirtualBindable: _extensions: + normative: true shorthand_name: VirtualBindable type_qualified_name: tosca:VirtualBindable specification: tosca-simple-nfv-1.0 @@ -29,6 +30,7 @@ capability_types: tosca.capabilities.nfv.Metric: _extensions: + normative: true shorthand_name: Metric type_qualified_name: tosca:Metric specification: tosca-simple-nfv-1.0 @@ -41,6 +43,7 @@ capability_types: tosca.capabilities.nfv.VirtualCompute: _extensions: + normative: true shorthand_name: VirtualCompute type_qualified_name: tosca:VirtualCompute specification: tosca-simple-nfv-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml index 889dcf7..09f173d 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml @@ -18,6 +18,7 @@ data_types: tosca.datatypes.nfv.L2AddressData: # TBD _extensions: + normative: true shorthand_name: L2AddressData type_qualified_name: tosca:L2AddressData specification: tosca-simple-nfv-1.0 @@ -26,6 +27,7 @@ data_types: tosca.datatypes.nfv.L3AddressData: _extensions: + normative: true shorthand_name: L3AddressData type_qualified_name: tosca:L3AddressData specification: tosca-simple-nfv-1.0 @@ -65,6 +67,7 @@ data_types: tosca.datatypes.nfv.AddressData: _extensions: + normative: true shorthand_name: AddressData type_qualified_name: tosca:AddressData specification: tosca-simple-nfv-1.0 @@ -102,6 +105,7 @@ data_types: tosca.datatypes.nfv.VirtualNetworkInterfaceRequirements: _extensions: + normative: true shorthand_name: VirtualNetworkInterfaceRequirements type_qualified_name: tosca:VirtualNetworkInterfaceRequirements specification: tosca-simple-nfv-1.0 @@ -139,6 +143,7 @@ data_types: tosca.datatypes.nfv.ConnectivityType: _extensions: + normative: true shorthand_name: ConnectivityType type_qualified_name: tosca:ConnectivityType specification: tosca-simple-nfv-1.0 @@ -165,6 +170,7 @@ data_types: tosca.datatypes.nfv.RequestedAdditionalCapability: _extensions: + normative: true shorthand_name: RequestedAdditionalCapability type_qualified_name: tosca:RequestedAdditionalCapability specification: tosca-simple-nfv-1.0 @@ -205,6 +211,7 @@ data_types: tosca.datatypes.nfv.VirtualMemory: _extensions: + normative: true shorthand_name: VirtualMemory type_qualified_name: tosca:VirtualMemory specification: tosca-simple-nfv-1.0 @@ -235,6 +242,7 @@ data_types: tosca.datatypes.nfv.VirtualCpu: _extensions: + normative: true shorthand_name: VirtualCpu type_qualified_name: tosca:VirtualCpu specification: tosca-simple-nfv-1.0 @@ -272,6 +280,7 @@ data_types: tosca.datatypes.nfv.VirtualCpuPinning: _extensions: + normative: true shorthand_name: VirtualCpuPinning type_qualified_name: tosca:VirtualCpuPinning specification: tosca-simple-nfv-1.0 @@ -299,6 +308,7 @@ data_types: tosca.datatypes.nfv.VnfcConfigurableProperties: _extensions: + normative: true shorthand_name: VnfcconfigurableProperties type_qualified_name: tosca:VnfcconfigurableProperties specification: tosca-simple-nfv-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml index 8d1f0a2..4d7f337 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml @@ -17,6 +17,7 @@ node_types: tosca.nodes.nfv.VDU.Compute: _extensions: + normative: true shorthand_name: VDU.Compute type_qualified_name: tosca:VDU.Compute specification: tosca-simple-nfv-1.0 @@ -115,6 +116,7 @@ node_types: tosca.nodes.nfv.VDU.VirtualStorage: _extensions: + normative: true shorthand_name: VirtualStorage # ARIA NOTE: seems wrong in spec type_qualified_name: tosca:VirtualStorage # ARIA NOTE: seems wrong in spec specification: tosca-simple-nfv-1.0 @@ -151,6 +153,7 @@ node_types: tosca.nodes.nfv.Cpd: _extensions: + normative: true shorthand_name: Cpd type_qualified_name: tosca:Cpd specification: tosca-simple-nfv-1.0 @@ -194,11 +197,12 @@ node_types: tosca.nodes.nfv.VduCpd: _extensions: - shorthand_name: VduCpd - type_qualified_name: tosca:VduCpd - specification: tosca-simple-nfv-1.0 - specification_section: 5.9.5 - specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896082' + normative: true + shorthand_name: VduCpd + type_qualified_name: tosca:VduCpd + specification: tosca-simple-nfv-1.0 + specification_section: 5.9.5 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896082' description: >- The TOSCA nfv.VduCpd node type represents a type of TOSCA Cpd node and describes network connectivity between a VNFC instance (based on this VDU) and an internal VL as defined by @@ -232,11 +236,12 @@ node_types: tosca.nodes.nfv.VnfVirtualLinkDesc: _extensions: - shorthand_name: VnfVirtualLinkDesc - type_qualified_name: tosca:VnfVirtualLinkDesc - specification: tosca-simple-nfv-1.0 - specification_section: 5.9.6 - specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896083' + normative: true + shorthand_name: VnfVirtualLinkDesc + type_qualified_name: tosca:VnfVirtualLinkDesc + specification: tosca-simple-nfv-1.0 + specification_section: 5.9.6 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896083' description: >- The TOSCA nfv.VnfVirtualLinkDesc node type represents a logical internal virtual link as defined by [ETSI GS NFV-IFA 011]. http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml index 4cf99a2..84c6a87 100644 --- a/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml +++ b/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml @@ -17,6 +17,7 @@ relationship_types: tosca.relationships.nfv.VirtualBindsTo: _extensions: + normative: true shorthand_name: VirtualBindsTo type_qualified_name: tosca:VirtualBindsTo specification: tosca-simple-nfv-1.0 @@ -31,6 +32,7 @@ relationship_types: # valid_target_types), so we are using the definition in csd03 section 8.4.2. tosca.relationships.nfv.Monitor: _extensions: + normative: true shorthand_name: Monitor type_qualified_name: tosca:Monitor specification: tosca-simple-nfv-1.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py b/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py index 64178aa..386a659 100644 --- a/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py +++ b/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py @@ -19,7 +19,7 @@ from aria.utils.caching import cachedmethod from ..simple_v1_0 import ToscaSimplePresenter1_0 -class ToscaSimpleNfvPresenter1_0(ToscaSimplePresenter1_0): # pylint: disable=invalid-name,abstract-method +class ToscaSimpleNfvPresenter1_0(ToscaSimplePresenter1_0): # pylint: disable=invalid-name,abstract-method """ ARIA presenter for the `TOSCA Simple Profile for NFV v1.0 csd04 <http://docs.oasis-open.org /tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html>`__. @@ -38,6 +38,6 @@ class ToscaSimpleNfvPresenter1_0(ToscaSimplePresenter1_0): # pylint: disable=inv @cachedmethod def _get_import_locations(self, context): import_locations = super(ToscaSimpleNfvPresenter1_0, self)._get_import_locations(context) - if context.presentation.import_profile: + if context.presentation.configuration.get('tosca.import_profile', True): return FrozenList([self.SIMPLE_PROFILE_FOR_NFV_LOCATION] + import_locations) return import_locations http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/simple_v1_0/__init__.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/__init__.py b/extensions/aria_extension_tosca/simple_v1_0/__init__.py index 61995db..da323ea 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/__init__.py +++ b/extensions/aria_extension_tosca/simple_v1_0/__init__.py @@ -45,7 +45,8 @@ Definitions aria_extension_tosca.simple_v1_0.PropertyDefinition aria_extension_tosca.simple_v1_0.AttributeDefinition - aria_extension_tosca.simple_v1_0.ParameterDefinition + aria_extension_tosca.simple_v1_0.InputDefinition + aria_extension_tosca.simple_v1_0.OutputDefinition aria_extension_tosca.simple_v1_0.OperationDefinition aria_extension_tosca.simple_v1_0.InterfaceDefinition aria_extension_tosca.simple_v1_0.RelationshipDefinition @@ -126,9 +127,9 @@ from .presenter import ToscaSimplePresenter1_0 from .assignments import (PropertyAssignment, OperationAssignment, InterfaceAssignment, RelationshipAssignment, RequirementAssignment, AttributeAssignment, CapabilityAssignment, ArtifactAssignment) -from .definitions import (PropertyDefinition, AttributeDefinition, ParameterDefinition, - OperationDefinition, InterfaceDefinition, RelationshipDefinition, - RequirementDefinition, CapabilityDefinition) +from .definitions import (PropertyDefinition, AttributeDefinition, InputDefinition, + OutputDefinition, OperationDefinition, InterfaceDefinition, + RelationshipDefinition, RequirementDefinition, CapabilityDefinition) from .filters import CapabilityFilter, NodeFilter from .misc import (Description, MetaData, Repository, Import, ConstraintClause, EntrySchema, OperationImplementation, SubstitutionMappingsRequirement, @@ -157,7 +158,8 @@ __all__ = ( 'ArtifactAssignment', 'PropertyDefinition', 'AttributeDefinition', - 'ParameterDefinition', + 'InputDefinition', + 'OutputDefinition', 'OperationDefinition', 'InterfaceDefinition', 'RelationshipDefinition', http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/89b9f130/extensions/aria_extension_tosca/simple_v1_0/assignments.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/assignments.py b/extensions/aria_extension_tosca/simple_v1_0/assignments.py index 7b48ed0..55b7e8d 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/assignments.py +++ b/extensions/aria_extension_tosca/simple_v1_0/assignments.py @@ -144,6 +144,17 @@ class InterfaceAssignment(ExtensiblePresentation): # In RelationshipAssignment the_type = the_type[0] # This could be a RelationshipTemplate + if isinstance(self._container._container, RequirementAssignment): + # In RequirementAssignment + requirement_definition = self._container._container._get_definition(context) + if requirement_definition is not None: + relationship_definition = requirement_definition.relationship + if relationship_definition is not None: + interface_definitions = relationship_definition.interfaces + if interface_definitions is not None: + if self._name in interface_definitions: + return interface_definitions[self._name]._get_type(context) + interface_definitions = the_type._get_interfaces(context) \ if the_type is not None else None interface_definition = interface_definitions.get(self._name) \ @@ -154,7 +165,7 @@ class InterfaceAssignment(ExtensiblePresentation): def _validate(self, context): super(InterfaceAssignment, self)._validate(context) if self.operations: - for operation in self.operations.itervalues(): # pylint: disable=no-member + for operation in self.operations.itervalues(): # pylint: disable=no-member operation._validate(context) @@ -172,6 +183,8 @@ class RelationshipAssignment(ExtensiblePresentation): The optional reserved keyname used to provide the name of the Relationship Type for the requirement assignment's relationship keyname. + ARIA NOTE: this can also be a relationship template name. + :type: :obj:`basestring` """ @@ -290,6 +303,15 @@ class RequirementAssignment(ExtensiblePresentation): return None, None @cachedmethod + def _get_definition(self, context): + node_type = self._container._get_type(context) + if (node_type is not None) and (node_type.requirements is not None): + for name, requirement in node_type.requirements: + if name == self._name: + return requirement + return None + + @cachedmethod def _get_capability(self, context): capability = self.capability @@ -369,6 +391,9 @@ class ArtifactAssignmentForType(ExtensiblePresentation): Template and used by orchestration engine to facilitate deployment and implementation of interface operations. + ARIA NOTE: section 3.5.6.2.1 in the spec refers to a short notation for "file", but that + notation would be impossible because the "type" field is required. + 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_ENTITY_ARTIFACT_DEF>`__