Ejemplo n.º 1
0
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')
Ejemplo n.º 2
0
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')
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
def register(context):
    context.register_function(_repeat, 'repeat')
    context.register_function(_generate_hostname, 'generateHostname')
    context.register_function(_name, 'name')
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
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')
Ejemplo n.º 8
0
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")
Ejemplo n.º 9
0
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')
Ejemplo n.º 10
0
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')
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
    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