def register(context): context.register_function( lambda json, mappings: _transform_json(json(), mappings()), 'bind') context.register_function(_format, 'format') context.register_function(_replace_str, 'replace') context.register_function(_replace_dict, 'replace') context.register_function(_len, 'len') context.register_function(_coalesce, 'coalesce') context.register_function(_base64decode, 'base64decode') context.register_function(_base64encode, 'base64encode') context.register_function(_config, 'config') context.register_function(_config_default, 'config') context.register_function(_lower, 'toLower') context.register_function(_upper, 'toUpper') context.register_function(_join, 'join') context.register_function(_split, 'split') context.register_function(_pselect, 'pselect') context.register_function(_startswith, 'startsWith') context.register_function(_endswith, 'endsWith') context.register_function(_trim, 'trim') context.register_function(_mathces, 'matches') context.register_function(_substr2, 'substr') context.register_function(_substr3, 'substr') context.register_function(_str, 'str') context.register_function(_int, 'int') context.register_function(_patch, 'patch') context.register_function(_random_name, 'randomName') # Temporary workaround, these functions should be moved to YAQL context.register_function(_keys, 'keys') context.register_function(_values, 'values') context.register_function(_flatten, 'flatten')
def register(context): context.register_function(_resolve, '#resolve') context.register_function(_cast, 'cast') context.register_function(_new, 'new') context.register_function(_id, 'id') context.register_function(_super2, 'super') context.register_function(_psuper2, 'psuper') context.register_function(_super, 'super') context.register_function(_require, 'require') context.register_function(_get_container, 'find') context.register_function(_sleep, 'sleep') context.register_function(_type, 'type')
def _create_context(self, root_context, murano_class): def _get_value(src, key): if isinstance(src, types.DictionaryType): return src.get(key) elif isinstance(src, types.ListType) and isinstance( key, types.IntType): return src[key] elif isinstance(src, murano_object.MuranoObject) and isinstance( key, types.StringTypes): self._current_obj = src self._current_obj_name = key return src.get_property(key, murano_class) else: raise TypeError() def _set_value(src, key, value): if isinstance(src, types.DictionaryType): old_value = src.get(key, type_scheme.NoValue) src[key] = value if self._current_obj is not None: try: p_value = self._current_obj.get_property( self._current_obj_name, murano_class) self._current_obj.set_property( self._current_obj_name, p_value, murano_class) except Exception as e: if old_value is not type_scheme.NoValue: src[key] = old_value else: src.pop(key, None) raise e elif isinstance(src, types.ListType) and isinstance( key, types.IntType): old_value = src[key] src[key] = value if self._current_obj is not None: try: p_value = self._current_obj.get_property( self._current_obj_name, murano_class) self._current_obj.set_property( self._current_obj_name, p_value, murano_class) except Exception as e: src[key] = old_value raise e elif isinstance(src, murano_object.MuranoObject) and isinstance( key, types.StringTypes): src.set_property(key, value, murano_class) else: raise TypeError() def get_context_data(path): path = path() def set_data(value): if not path or path == '$' or path == '$this': raise ValueError() root_context.set_data(value, path) return LhsExpression.Property( lambda: root_context.get_data(path), set_data) @yaql.context.EvalArg('this', arg_type=LhsExpression.Property) def attribution(this, arg_name): arg_name = arg_name() return LhsExpression.Property( lambda: _get_value(this.get(), arg_name), lambda value: _set_value(this.get(), arg_name, value)) @yaql.context.EvalArg("this", LhsExpression.Property) def indexation(this, index): return LhsExpression.Property( lambda: _get_value(this.get(), index()), lambda value: _set_value(this.get(), index(), value)) context = yaql.context.Context() context.register_function(get_context_data, '#get_context_data') context.register_function(attribution, '#operator_.') context.register_function(indexation, "where") return context
def register(context): context.register_function(_repeat, 'repeat') context.register_function(_generate_hostname, 'generateHostname') context.register_function(_name, 'name')
def prepare_context(root_context, this, object_store, namespace_resolver, default): def _int(value): value = value() if value is NoValue: value = default if value is None: return None try: return int(value) except Exception: raise TypeError() def _string(value): value = value() if value is NoValue: value = default if value is None: return None try: return unicode(value) except Exception: raise TypeError() def _bool(value): value = value() if value is NoValue: value = default if value is None: return None return True if value else False def _not_null(value): value = value() if isinstance(value, TypeScheme.ObjRef): return value if value is None: raise TypeError() return value def _error(): raise TypeError() def _check(value, predicate): value = value() if isinstance(value, TypeScheme.ObjRef) or predicate(value): return value else: raise TypeError(value) @yaql.context.EvalArg('obj', arg_type=( murano.dsl.murano_object.MuranoObject, TypeScheme.ObjRef, types.NoneType )) def _owned(obj): if isinstance(obj, TypeScheme.ObjRef): return obj if obj is None: return None elif obj.parent is this: return obj else: raise TypeError() @yaql.context.EvalArg('obj', arg_type=( murano.dsl.murano_object.MuranoObject, TypeScheme.ObjRef, types.NoneType )) def _not_owned(obj): if isinstance(obj, TypeScheme.ObjRef): return obj if obj is None: return None elif obj.parent is this: raise TypeError() else: return obj @yaql.context.EvalArg('name', arg_type=str) def _class(value, name): return _class2(value, name, None) @yaql.context.EvalArg('name', arg_type=str) @yaql.context.EvalArg('default_name', arg_type=(str, types.NoneType)) def _class2(value, name, default_name): name = namespace_resolver.resolve_name(name) if not default_name: default_name = name else: default_name = namespace_resolver.resolve_name(default_name) value = value() if value is NoValue: value = default if isinstance(default, types.DictionaryType): value = {'?': { 'id': uuid.uuid4().hex, 'type': default_name }} class_loader = murano.dsl.helpers.get_class_loader(root_context) murano_class = class_loader.get_class(name) if not murano_class: raise TypeError() if value is None: return None if isinstance(value, murano.dsl.murano_object.MuranoObject): obj = value elif isinstance(value, types.DictionaryType): obj = object_store.load(value, this, root_context, defaults=default) elif isinstance(value, types.StringTypes): obj = object_store.get(value) if obj is None: if not object_store.initializing: raise TypeError('Object %s not found' % value) else: return TypeScheme.ObjRef(value) else: raise TypeError() if not murano_class.is_compatible(obj): raise TypeError() return obj @yaql.context.EvalArg('prefix', str) @yaql.context.EvalArg('name', str) def _validate(prefix, name): return namespace_resolver.resolve_name( '%s:%s' % (prefix, name)) context = yaql.context.Context(parent_context=root_context) context.register_function(_validate, '#validate') context.register_function(_int, 'int') context.register_function(_string, 'string') context.register_function(_bool, 'bool') context.register_function(_check, 'check') context.register_function(_not_null, 'notNull') context.register_function(_error, 'error') context.register_function(_class, 'class') context.register_function(_class2, 'class') context.register_function(_owned, 'owned') context.register_function(_not_owned, 'notOwned') return context
def prepare_context(root_context, this, owner, object_store, namespace_resolver, default): def _int(value): value = value() if value is NoValue: value = default if value is None: return None try: return int(value) except Exception: raise exceptions.ContractViolationException( 'Value {0} violates int() contract'.format(value)) def _string(value): value = value() if value is NoValue: value = default if value is None: return None try: return unicode(value) except Exception: raise exceptions.ContractViolationException( 'Value {0} violates string() contract'.format(value)) def _bool(value): value = value() if value is NoValue: value = default if value is None: return None return True if value else False def _not_null(value): value = value() if isinstance(value, TypeScheme.ObjRef): return value if value is None: raise exceptions.ContractViolationException( 'null value violates notNull() contract') return value def _error(): raise exceptions.ContractViolationException('error() contract') def _check(value, predicate): value = value() if isinstance(value, TypeScheme.ObjRef) or predicate(value): return value else: raise exceptions.ContractViolationException( "Value {0} doesn't match predicate".format(value)) @yaql.context.EvalArg('obj', arg_type=( murano.dsl.murano_object.MuranoObject, TypeScheme.ObjRef, types.NoneType )) def _owned(obj): if isinstance(obj, TypeScheme.ObjRef): return obj if obj is None: return None p = obj.owner while p is not None: if p is this: return obj p = p.owner raise exceptions.ContractViolationException( 'Object {0} violates owned() contract'.format( obj.object_id)) @yaql.context.EvalArg('obj', arg_type=( murano.dsl.murano_object.MuranoObject, TypeScheme.ObjRef, types.NoneType )) def _not_owned(obj): if isinstance(obj, TypeScheme.ObjRef): return obj if obj is None: return None try: _owned(obj) except exceptions.ContractViolationException: return obj else: raise exceptions.ContractViolationException( 'Object {0} violates notOwned() contract'.format( obj.object_id)) @yaql.context.EvalArg('name', arg_type=str) def _class(value, name): return _class2(value, name, None) @yaql.context.EvalArg('name', arg_type=str) @yaql.context.EvalArg('default_name', arg_type=(str, types.NoneType)) def _class2(value, name, default_name): name = namespace_resolver.resolve_name(name) if not default_name: default_name = name else: default_name = namespace_resolver.resolve_name(default_name) value = value() class_loader = murano.dsl.helpers.get_class_loader(root_context) murano_class = class_loader.get_class(name) if not murano_class: raise exceptions.NoClassFound( 'Class {0} cannot be found'.format(name)) if value is None: return None if isinstance(value, murano.dsl.murano_object.MuranoObject): obj = value elif isinstance(value, types.DictionaryType): if '?' not in value: new_value = {'?': { 'id': uuid.uuid4().hex, 'type': default_name }} new_value.update(value) value = new_value obj = object_store.load(value, owner, root_context, defaults=default) elif isinstance(value, types.StringTypes): obj = object_store.get(value) if obj is None: if not object_store.initializing: raise exceptions.NoObjectFoundError(value) else: return TypeScheme.ObjRef(value) else: raise exceptions.ContractViolationException( 'Value {0} cannot be represented as class {1}'.format( value, name)) if not murano_class.is_compatible(obj): raise exceptions.ContractViolationException( 'Object of type {0} is not compatible with ' 'requested type {1}'.format(obj.type.name, name)) return obj @yaql.context.EvalArg('prefix', str) @yaql.context.EvalArg('name', str) def _validate(prefix, name): return namespace_resolver.resolve_name( '%s:%s' % (prefix, name)) context = yaql.context.Context(parent_context=root_context) context.register_function(_validate, '#validate') context.register_function(_int, 'int') context.register_function(_string, 'string') context.register_function(_bool, 'bool') context.register_function(_check, 'check') context.register_function(_not_null, 'notNull') context.register_function(_error, 'error') context.register_function(_class, 'class') context.register_function(_class2, 'class') context.register_function(_owned, 'owned') context.register_function(_not_owned, 'notOwned') return context
def register(context): context.register_function(_resolve, '#resolve') context.register_function(_cast, 'cast') context.register_function(_new, 'new') context.register_function(_id, 'id') context.register_function(_super2, 'super') context.register_function(_psuper2, 'psuper') context.register_function(_super, 'super') context.register_function(_require, 'require') context.register_function(_get_container, 'find') context.register_function(_sleep, 'sleep')
def register(context): context.register_function(_resolve, "#resolve") context.register_function(_cast, "cast") context.register_function(_new, "new") context.register_function(_id, "id") context.register_function(_super2, "super") context.register_function(_psuper2, "psuper") context.register_function(_super, "super") context.register_function(_require, "require") context.register_function(_get_container, "find") context.register_function(_sleep, "sleep") context.register_function(_type, "type")
def register(context): context.register_function( lambda json, mappings: _transform_json(json(), mappings()), 'bind') context.register_function(_format, 'format') context.register_function(_replace_str, 'replace') context.register_function(_replace_dict, 'replace') context.register_function(_len, 'len') context.register_function(_coalesce, 'coalesce') context.register_function(_base64decode, 'base64decode') context.register_function(_base64encode, 'base64encode') context.register_function(_config, 'config') context.register_function(_config_default, 'config') context.register_function(_lower, 'toLower') context.register_function(_upper, 'toUpper') context.register_function(_join, 'join') context.register_function(_split, 'split') context.register_function(_pselect, 'pselect') context.register_function(_startswith, 'startsWith') context.register_function(_endswith, 'endsWith') context.register_function(_trim, 'trim') context.register_function(_mathces, 'matches') context.register_function(_substr, 'substr') context.register_function(_str, 'str') context.register_function(_int, 'int') context.register_function(_patch, 'patch') # Temporary workaround as YAQL does not provide "where" function for # dictionaries, and there is no easy way to implement it there. context.register_function(yaql_builtin.dict_attribution, 'get')
def register(context): context.register_function( lambda json, mappings: _transform_json(json(), mappings()), 'bind') context.register_function(_format, 'format') context.register_function(_replace_str, 'replace') context.register_function(_replace_dict, 'replace') context.register_function(_len, 'len') context.register_function(_coalesce, 'coalesce') context.register_function(_base64decode, 'base64decode') context.register_function(_base64encode, 'base64encode') context.register_function(_config, 'config') context.register_function(_config_default, 'config') context.register_function(_lower, 'toLower') context.register_function(_upper, 'toUpper') context.register_function(_join, 'join') context.register_function(_split, 'split') context.register_function(_pselect, 'pselect') context.register_function(_startswith, 'startsWith') context.register_function(_endswith, 'endsWith') context.register_function(_trim, 'trim') context.register_function(_mathces, 'matches') context.register_function(_substr2, 'substr') context.register_function(_substr3, 'substr') context.register_function(_str, 'str') context.register_function(_int, 'int') context.register_function(_patch, 'patch') context.register_function(_random_name, 'randomName') # Temporary workaround, these functions should be moved to YAQL context.register_function(_keys, 'keys') context.register_function(_values, 'values') context.register_function(_flatten, 'flatten') context.register_function(_merge_with, 'mergeWith') context.register_function(_skip, 'skip') context.register_function(_take, 'take') context.register_function(_aggregate, 'aggregate') context.register_function(_aggregate_with_seed, 'aggregate')
def prepare_context(root_context, this, object_store, namespace_resolver, default): def _int(value): value = value() if value is NoValue: value = default if value is None: return None try: return int(value) except Exception: raise TypeError() def _string(value): value = value() if value is NoValue: value = default if value is None: return None try: return unicode(value) except Exception: raise TypeError() def _bool(value): value = value() if value is NoValue: value = default if value is None: return None return True if value else False def _not_null(value): value = value() if isinstance(value, TypeScheme.ObjRef): return value if value is None: raise TypeError() return value def _error(): raise TypeError() def _check(value, predicate): value = value() if isinstance(value, TypeScheme.ObjRef) or predicate(value): return value else: raise TypeError(value) @yaql.context.EvalArg( 'obj', arg_type=(muranoapi.dsl.murano_object.MuranoObject, TypeScheme.ObjRef, types.NoneType)) def _owned(obj): if isinstance(obj, TypeScheme.ObjRef): return obj if obj is None: return None elif obj.parent is this: return obj else: raise TypeError() @yaql.context.EvalArg( 'obj', arg_type=(muranoapi.dsl.murano_object.MuranoObject, TypeScheme.ObjRef, types.NoneType)) def _not_owned(obj): if isinstance(obj, TypeScheme.ObjRef): return obj if obj is None: return None elif obj.parent is this: raise TypeError() else: return obj @yaql.context.EvalArg('name', arg_type=str) def _class(value, name): return _class2(value, name, None) @yaql.context.EvalArg('name', arg_type=str) @yaql.context.EvalArg('default_name', arg_type=(str, types.NoneType)) def _class2(value, name, default_name): name = namespace_resolver.resolve_name(name) if not default_name: default_name = name else: default_name = namespace_resolver.resolve_name(default_name) value = value() if value is NoValue: value = default if isinstance(default, types.DictionaryType): value = { '?': { 'id': uuid.uuid4().hex, 'type': default_name } } class_loader = muranoapi.dsl.helpers.get_class_loader(root_context) murano_class = class_loader.get_class(name) if not murano_class: raise TypeError() if value is None: return None if isinstance(value, muranoapi.dsl.murano_object.MuranoObject): obj = value elif isinstance(value, types.DictionaryType): obj = object_store.load(value, this, root_context, defaults=default) elif isinstance(value, types.StringTypes): obj = object_store.get(value) if obj is None: if not object_store.initializing: raise TypeError('Object %s not found' % value) else: return TypeScheme.ObjRef(value) else: raise TypeError() if not murano_class.is_compatible(obj): raise TypeError() return obj @yaql.context.EvalArg('prefix', str) @yaql.context.EvalArg('name', str) def _validate(prefix, name): return namespace_resolver.resolve_name('%s:%s' % (prefix, name)) context = yaql.context.Context(parent_context=root_context) context.register_function(_validate, '#validate') context.register_function(_int, 'int') context.register_function(_string, 'string') context.register_function(_bool, 'bool') context.register_function(_check, 'check') context.register_function(_not_null, 'notNull') context.register_function(_error, 'error') context.register_function(_class, 'class') context.register_function(_class2, 'class') context.register_function(_owned, 'owned') context.register_function(_not_owned, 'notOwned') return context
def _create_context(self, root_context, murano_class): def _get_value(src, key): if isinstance(src, types.DictionaryType): return src.get(key) elif isinstance(src, types.ListType) and isinstance( key, types.IntType): return src[key] elif isinstance(src, murano_object.MuranoObject) and isinstance( key, types.StringTypes): self._current_obj = src self._current_obj_name = key return src.get_property(key, murano_class) else: raise TypeError() def _set_value(src, key, value): if isinstance(src, types.DictionaryType): old_value = src.get(key, type_scheme.NoValue) src[key] = value if self._current_obj is not None: try: p_value = self._current_obj.get_property( self._current_obj_name, murano_class) self._current_obj.set_property(self._current_obj_name, p_value, murano_class) except Exception as e: if old_value is not type_scheme.NoValue: src[key] = old_value else: src.pop(key, None) raise e elif isinstance(src, types.ListType) and isinstance( key, types.IntType): old_value = src[key] src[key] = value if self._current_obj is not None: try: p_value = self._current_obj.get_property( self._current_obj_name, murano_class) self._current_obj.set_property(self._current_obj_name, p_value, murano_class) except Exception as e: src[key] = old_value raise e elif isinstance(src, murano_object.MuranoObject) and isinstance( key, types.StringTypes): self._current_spec = src.type.find_property(key) src.set_property(key, value, murano_class) else: raise TypeError() def get_context_data(path): path = path() def set_data(value): if not path or path == '$' or path == '$this': raise ValueError() root_context.set_data(value, path) return LhsExpression.Property(lambda: root_context.get_data(path), set_data) @yaql.context.EvalArg('this', arg_type=LhsExpression.Property) def attribution(this, arg_name): arg_name = arg_name() return LhsExpression.Property( lambda: _get_value(this.get(), arg_name), lambda value: _set_value(this.get(), arg_name, value)) @yaql.context.EvalArg("this", LhsExpression.Property) def indexation(this, index): return LhsExpression.Property( lambda: _get_value(this.get(), index()), lambda value: _set_value(this.get(), index(), value)) context = yaql.context.Context() context.register_function(get_context_data, '#get_context_data') context.register_function(attribution, '#operator_.') context.register_function(indexation, "where") return context
def prepare_context(root_context, this, owner, object_store, namespace_resolver, default): def _int(value): value = value() if value is NoValue: value = default if value is None: return None try: return int(value) except Exception: raise exceptions.ContractViolationException( 'Value {0} violates int() contract'.format(value)) def _string(value): value = value() if value is NoValue: value = default if value is None: return None try: return unicode(value) except Exception: raise exceptions.ContractViolationException( 'Value {0} violates string() contract'.format(value)) def _bool(value): value = value() if value is NoValue: value = default if value is None: return None return True if value else False def _not_null(value): value = value() if isinstance(value, TypeScheme.ObjRef): return value if value is None: raise exceptions.ContractViolationException( 'null value violates notNull() contract') return value def _error(): raise exceptions.ContractViolationException('error() contract') def _check(value, predicate): value = value() if isinstance(value, TypeScheme.ObjRef) or predicate(value): return value else: raise exceptions.ContractViolationException( "Value {0} doesn't match predicate".format(value)) @yaql.context.EvalArg('obj', arg_type=(murano.dsl.murano_object.MuranoObject, TypeScheme.ObjRef, types.NoneType)) def _owned(obj): if isinstance(obj, TypeScheme.ObjRef): return obj if obj is None: return None p = obj.owner while p is not None: if p is this: return obj p = p.owner raise exceptions.ContractViolationException( 'Object {0} violates owned() contract'.format(obj.object_id)) @yaql.context.EvalArg('obj', arg_type=(murano.dsl.murano_object.MuranoObject, TypeScheme.ObjRef, types.NoneType)) def _not_owned(obj): if isinstance(obj, TypeScheme.ObjRef): return obj if obj is None: return None try: _owned(obj) except exceptions.ContractViolationException: return obj else: raise exceptions.ContractViolationException( 'Object {0} violates notOwned() contract'.format( obj.object_id)) @yaql.context.EvalArg('name', arg_type=str) def _class(value, name): return _class2(value, name, None) @yaql.context.EvalArg('name', arg_type=str) @yaql.context.EvalArg('default_name', arg_type=(str, types.NoneType)) def _class2(value, name, default_name): name = namespace_resolver.resolve_name(name) if not default_name: default_name = name else: default_name = namespace_resolver.resolve_name(default_name) value = value() class_loader = murano.dsl.helpers.get_class_loader(root_context) murano_class = class_loader.get_class(name) if not murano_class: raise exceptions.NoClassFound( 'Class {0} cannot be found'.format(name)) if value is None: return None if isinstance(value, murano.dsl.murano_object.MuranoObject): obj = value elif isinstance(value, types.DictionaryType): if '?' not in value: new_value = { '?': { 'id': uuid.uuid4().hex, 'type': default_name } } new_value.update(value) value = new_value obj = object_store.load(value, owner, root_context, defaults=default) elif isinstance(value, types.StringTypes): obj = object_store.get(value) if obj is None: if not object_store.initializing: raise exceptions.NoObjectFoundError(value) else: return TypeScheme.ObjRef(value) else: raise exceptions.ContractViolationException( 'Value {0} cannot be represented as class {1}'.format( value, name)) if not murano_class.is_compatible(obj): raise exceptions.ContractViolationException( 'Object of type {0} is not compatible with ' 'requested type {1}'.format(obj.type.name, name)) return obj @yaql.context.EvalArg('prefix', str) @yaql.context.EvalArg('name', str) def _validate(prefix, name): return namespace_resolver.resolve_name('%s:%s' % (prefix, name)) context = yaql.context.Context(parent_context=root_context) context.register_function(_validate, '#validate') context.register_function(_int, 'int') context.register_function(_string, 'string') context.register_function(_bool, 'bool') context.register_function(_check, 'check') context.register_function(_not_null, 'notNull') context.register_function(_error, 'error') context.register_function(_class, 'class') context.register_function(_class2, 'class') context.register_function(_owned, 'owned') context.register_function(_not_owned, 'notOwned') return context