Пример #1
0
 def _canonize_parameters(arguments_scheme, args, kwargs):
     arg_names = list(arguments_scheme.keys())
     parameter_values = utils.filter_parameters_dict(kwargs)
     for i, arg in enumerate(args):
         name = arg_names[i]
         parameter_values[name] = arg
     return tuple(), parameter_values
Пример #2
0
 def _canonize_parameters(arguments_scheme, args, kwargs):
     arg_names = list(arguments_scheme.keys())
     parameter_values = utils.filter_parameters_dict(kwargs)
     for i, arg in enumerate(args):
         name = arg_names[i]
         parameter_values[name] = arg
     return tuple(), parameter_values
Пример #3
0
def instantiate(data, owner, object_store, context, scope_type,
                default_type=None):
    if data is None:
        data = {}
    if not isinstance(data, yaqlutils.MappingType):
        raise ValueError('Incorrect object initialization format')
    default_type = resolve_type(default_type, scope_type)
    if len(data) == 1:
        key = next(iter(data.keys()))
        ns_resolver = scope_type.namespace_resolver
        if ns_resolver.is_typename(key, False) or isinstance(
                key, (dsl_types.MuranoTypeReference, dsl_types.MuranoType)):
            type_obj = resolve_type(key, scope_type)
            props = yaqlutils.filter_parameters_dict(data[key] or {})
            props = evaluate(props, context, freeze=False)
            return type_obj.new(
                owner, object_store, object_store.executor)(
                context, **props)

    data = evaluate(data, context, freeze=False)
    if '?' not in data:
        if not default_type:
            raise ValueError('Type information is missing')
        data.update({'?': {
            'type': default_type.name,
            'classVersion': str(default_type.version)
        }})
    if 'id' not in data['?']:
        data['?']['id'] = uuid.uuid4().hex

    return object_store.load(data, owner, context)
Пример #4
0
def instantiate(data, owner, object_store, context, scope_type,
                default_type=None):
    if data is None:
        data = {}
    if not isinstance(data, yaqlutils.MappingType):
        raise ValueError('Incorrect object initialization format')
    default_type = resolve_type(default_type, scope_type)
    if len(data) == 1:
        key = next(iter(data.keys()))
        ns_resolver = scope_type.namespace_resolver
        if ns_resolver.is_typename(key, False) or isinstance(
                key, (dsl_types.MuranoTypeReference, dsl_types.MuranoType)):
            type_obj = resolve_type(key, scope_type)
            props = yaqlutils.filter_parameters_dict(data[key] or {})
            props = evaluate(props, context, freeze=False)
            return type_obj.new(
                owner, object_store, object_store.executor)(
                context, **props)

    data = evaluate(data, context, freeze=False)
    if '?' not in data:
        if not default_type:
            raise ValueError('Type information is missing')
        data.update({'?': {
            'type': default_type.name,
            'classVersion': str(default_type.version)
        }})
    if 'id' not in data['?']:
        data['?']['id'] = uuid.uuid4().hex

    return object_store.load(data, owner, context)
Пример #5
0
def new_from_dict(type_name,
                  context,
                  parameters,
                  owner=None,
                  object_name=None,
                  extra=None):
    return new(context, type_name, owner, object_name, extra,
               **utils.filter_parameters_dict(parameters))
Пример #6
0
def parse_object_definition(spec, scope_type, context):
    if not isinstance(spec, yaqlutils.MappingType):
        return None

    if context:
        spec = evaluate(spec, context, freeze=False)
    else:
        spec = spec.copy()
    system_data = None
    type_obj = None
    props = {}
    ns_resolver = scope_type.namespace_resolver if scope_type else None
    for key in spec:
        if (ns_resolver and ns_resolver.is_typename(key, False) or isinstance(
                key, (dsl_types.MuranoTypeReference, dsl_types.MuranoType))):
            type_obj = resolve_type(key, scope_type)
            props = spec.pop(key) or {}
            system_data = spec
            break
    if system_data is None:
        props = spec
        if '?' in spec:
            system_data = spec.pop('?')
            obj_type = system_data.get('type')
            if isinstance(obj_type, dsl_types.MuranoTypeReference):
                type_obj = obj_type.type
            elif isinstance(obj_type, dsl_types.MuranoType):
                type_obj = obj_type
            elif obj_type:
                type_str, version_str, package_str = parse_type_string(
                    obj_type, system_data.get('classVersion'),
                    system_data.get('package'))
                version_spec = parse_version_spec(version_str)
                package_loader = get_package_loader()
                if package_str:
                    package = package_loader.load_package(
                        package_str, version_spec)
                else:
                    package = package_loader.load_class_package(
                        type_str, version_spec)
                type_obj = package.find_class(type_str, False)
        else:
            system_data = {}

    return {
        'type': type_obj,
        'properties': yaqlutils.filter_parameters_dict(props),
        'id': system_data.get('id'),
        'name': system_data.get('name'),
        'metadata': system_data.get('metadata'),
        'destroyed': system_data.get('destroyed', False),
        'dependencies': system_data.get('dependencies', {}),
        'extra': {
            key: value
            for key, value in system_data.items() if key.startswith('_')
        }
    }
Пример #7
0
    def _invoke_method(self, method, this, context, args, kwargs,
                       skip_stub=False):
        if isinstance(this, dsl.MuranoObjectInterface):
            this = this.object
        kwargs = utils.filter_parameters_dict(kwargs)
        runtime_version = method.murano_class.package.runtime_version
        yaql_engine = yaql_integration.choose_yaql_engine(runtime_version)
        if context is None or not skip_stub:
            actions_only = context is None and not method.name.startswith('.')
            method_context = self.create_method_context(
                self.create_object_context(this, context), method)
            method_context[constants.CTX_SKIP_FRAME] = True
            method_context[constants.CTX_ACTIONS_ONLY] = actions_only
            return method.yaql_function_definition(
                yaql_engine, method_context, this.real_this)(*args, **kwargs)

        if (context[constants.CTX_ACTIONS_ONLY] and method.usage !=
                murano_method.MethodUsages.Action):
            raise Exception('{0} is not an action'.format(method.name))

        context = self.create_method_context(
            self.create_object_context(this, context), method)

        if isinstance(this, dsl_types.MuranoObject):
            this = this.real_this

        if method.arguments_scheme is not None:
            args, kwargs = self._canonize_parameters(
                method.arguments_scheme, args, kwargs)

        with self._acquire_method_lock(method, this):
            for i, arg in enumerate(args, 2):
                context[str(i)] = arg
            for key, value in six.iteritems(kwargs):
                context[key] = value

            def call():
                if isinstance(method.body, specs.FunctionDefinition):
                    native_this = this.cast(
                        method.murano_class).extension
                    return method.body(
                        yaql_engine, context, native_this)(*args, **kwargs)
                else:
                    return (None if method.body is None
                            else method.body.execute(context))

            if (not isinstance(method.body, specs.FunctionDefinition) or
                    not method.body.meta.get(constants.META_NO_TRACE)):
                with self._log_method(context, args, kwargs) as log:
                    result = call()
                    log(result)
                    return result
            else:
                return call()
Пример #8
0
def parse_object_definition(spec, scope_type, context):
    if not isinstance(spec, yaqlutils.MappingType):
        return None

    if context:
        spec = evaluate(spec, context, freeze=False)
    else:
        spec = spec.copy()
    system_data = None
    type_obj = None
    props = {}
    ns_resolver = scope_type.namespace_resolver if scope_type else None
    for key in spec:
        if (ns_resolver and ns_resolver.is_typename(key, False) or
                isinstance(key, (dsl_types.MuranoTypeReference,
                                 dsl_types.MuranoType))):
            type_obj = resolve_type(key, scope_type)
            props = spec.pop(key) or {}
            system_data = spec
            break
    if system_data is None:
        props = spec
        if '?' in spec:
            system_data = spec.pop('?')
            obj_type = system_data.get('type')
            if isinstance(obj_type, dsl_types.MuranoTypeReference):
                type_obj = obj_type.type
            elif isinstance(obj_type, dsl_types.MuranoType):
                type_obj = obj_type
            elif obj_type:
                version_spec = parse_version_spec(
                    system_data.get('classVersion'))
                package_loader = get_package_loader()
                if 'package' in system_data:
                    package = package_loader.load_package(
                        system_data['package'], version_spec)
                else:
                    package = package_loader.load_class_package(
                        obj_type, version_spec)
                type_obj = package.find_class(obj_type, False)
        else:
            system_data = {}

    return {
        'type': type_obj,
        'properties': yaqlutils.filter_parameters_dict(props),
        'id': system_data.get('id'),
        'name': system_data.get('name'),
        'extra': {
            key: value for key, value in six.iteritems(system_data)
            if key.startswith('_')
        }
    }
Пример #9
0
def call_func(context, op_dot, base, name, args, kwargs,
              receiver=utils.NO_VALUE):
    if isinstance(receiver, (dsl_types.MuranoObject,
                             dsl_types.MuranoTypeReference)):
        kwargs = utils.filter_parameters_dict(kwargs)
        args += tuple(
            expressions.MappingRuleExpression(expressions.KeywordConstant(key),
                                              value)
            for key, value in six.iteritems(kwargs))
        function = expressions.Function(name, *args)
        return op_dot(context, receiver, function)
    else:
        return base(context, name, args, kwargs, receiver)
Пример #10
0
def call_func(context,
              op_dot,
              base,
              name,
              args,
              kwargs,
              receiver=utils.NO_VALUE):
    if isinstance(receiver,
                  (dsl_types.MuranoObject, dsl_types.MuranoTypeReference)):
        kwargs = utils.filter_parameters_dict(kwargs)
        args += tuple(
            expressions.MappingRuleExpression(expressions.KeywordConstant(
                key), value) for key, value in kwargs.items())
        function = expressions.Function(name, *args)
        return op_dot(context, receiver, function)
    else:
        return base(context, name, args, kwargs, receiver)
Пример #11
0
def call_func(context, engine, name, args, kwargs, receiver=utils.NO_VALUE):
    """:yaql:call

    Evaluates function name with specified args and kwargs and returns the
    result.

    :signature: call(name, args, kwargs)
    :arg name: name of callable
    :argType name: string
    :arg args: sequence of items to be used for calling
    :argType args: sequence
    :arg kwargs: dictionary with kwargs to be used for calling
    :argType kwargs: mapping
    :returnType: any (callable return type)

    .. code::

        yaql> call(let, [1, 2], {a => 3, b => 4}) -> $1 + $a + $2 + $b
        10
    """
    return context(name, engine,
                   receiver)(*args, **utils.filter_parameters_dict(kwargs))
Пример #12
0
    def _canonize_parameters(arguments_scheme, args, kwargs,
                             method_name, receiver):
        arg_names = list(arguments_scheme.keys())
        parameter_values = {}
        varargs_arg = None
        vararg_values = []
        kwargs_arg = None
        kwarg_values = {}
        for name, definition in six.iteritems(arguments_scheme):
            if definition.usage == dsl_types.MethodArgumentUsages.VarArgs:
                varargs_arg = name
                parameter_values[name] = vararg_values
            elif definition.usage == dsl_types.MethodArgumentUsages.KwArgs:
                kwargs_arg = name
                parameter_values[name] = kwarg_values

        for i, arg in enumerate(args):
            name = None if i >= len(arg_names) else arg_names[i]
            if name is None or name in (varargs_arg, kwargs_arg):
                if varargs_arg:
                    vararg_values.append(arg)
                else:
                    raise yaql_exceptions.NoMatchingMethodException(
                        method_name, receiver)
            else:
                parameter_values[name] = arg

        for name, value in six.iteritems(utils.filter_parameters_dict(kwargs)):
            if name in arguments_scheme and name not in (
                    varargs_arg, kwargs_arg):
                parameter_values[name] = value
            elif kwargs_arg:
                kwarg_values[name] = value
            else:
                raise yaql_exceptions.NoMatchingMethodException(
                    method_name, receiver)
        return tuple(), parameter_values
Пример #13
0
    def _canonize_parameters(arguments_scheme, args, kwargs,
                             method_name, receiver):
        arg_names = list(arguments_scheme.keys())
        parameter_values = {}
        varargs_arg = None
        vararg_values = []
        kwargs_arg = None
        kwarg_values = {}
        for name, definition in arguments_scheme.items():
            if definition.usage == dsl_types.MethodArgumentUsages.VarArgs:
                varargs_arg = name
                parameter_values[name] = vararg_values
            elif definition.usage == dsl_types.MethodArgumentUsages.KwArgs:
                kwargs_arg = name
                parameter_values[name] = kwarg_values

        for i, arg in enumerate(args):
            name = None if i >= len(arg_names) else arg_names[i]
            if name is None or name in (varargs_arg, kwargs_arg):
                if varargs_arg:
                    vararg_values.append(arg)
                else:
                    raise yaql_exceptions.NoMatchingMethodException(
                        method_name, receiver)
            else:
                parameter_values[name] = arg

        for name, value in utils.filter_parameters_dict(kwargs).items():
            if name in arguments_scheme and name not in (
                    varargs_arg, kwargs_arg):
                parameter_values[name] = value
            elif kwargs_arg:
                kwarg_values[name] = value
            else:
                raise yaql_exceptions.NoMatchingMethodException(
                    method_name, receiver)
        return tuple(), parameter_values
Пример #14
0
def new_from_dict(type_name, context, parameters, owner=None, object_name=None, extra=None):
    return new(context, type_name, owner, object_name, extra, **utils.filter_parameters_dict(parameters))
Пример #15
0
    def invoke_method(self, method, this, context, args, kwargs,
                      skip_stub=False):
        if isinstance(this, dsl.MuranoObjectInterface):
            this = this.object
        kwargs = utils.filter_parameters_dict(kwargs)
        runtime_version = method.declaring_type.package.runtime_version
        yaql_engine = yaql_integration.choose_yaql_engine(runtime_version)
        if context is None or not skip_stub:
            actions_only = context is None and not method.name.startswith('.')
            method_context = self.create_method_context(
                self.create_object_context(this, context), method)
            method_context[constants.CTX_SKIP_FRAME] = True
            method_context[constants.CTX_ACTIONS_ONLY] = actions_only

            stub = method.static_stub if isinstance(
                this, dsl_types.MuranoType) else method.instance_stub
            if stub is None:
                raise ValueError(
                    'Method {0} cannot be called on receiver {1}'.format(
                        method, this))

            real_this = this.real_this if isinstance(
                this, dsl_types.MuranoObject) else this.get_reference()
            return stub(yaql_engine, method_context, real_this)(
                *args, **kwargs)

        if context[constants.CTX_ACTIONS_ONLY] and not method.is_action:
            raise dsl_exceptions.MethodNotExposed(
                '{0} is not an action'.format(method.name))

        if method.is_static:
            obj_context = self.create_object_context(
                method.declaring_type, context)
        else:
            obj_context = self.create_object_context(this, context)
        context = self.create_method_context(obj_context, method)

        if isinstance(this, dsl_types.MuranoObject):
            this = this.real_this

        if method.arguments_scheme is not None:
            args, kwargs = self._canonize_parameters(
                method.arguments_scheme, args, kwargs, method.name, this)

        this_lock = this
        arg_values_for_lock = {}
        method_meta = [m for m in method.get_meta(context)
                       if m.type.name == ('io.murano.metadata.'
                                          'engine.Synchronize')]
        if method_meta:
            method_meta = method_meta[0]

        if method_meta:
            if not method_meta.get_property('onThis', context):
                this_lock = None
            for arg_name in method_meta.get_property('onArgs', context):
                arg_val = kwargs.get(arg_name)
                if arg_val is not None:
                    arg_values_for_lock[arg_name] = arg_val

        arg_values_for_lock = utils.filter_parameters_dict(arg_values_for_lock)

        with self._acquire_method_lock(method, this_lock, arg_values_for_lock):
            for i, arg in enumerate(args, 2):
                context[str(i)] = arg
            for key, value in six.iteritems(kwargs):
                context[key] = value

            def call():
                if isinstance(method.body, specs.FunctionDefinition):
                    if isinstance(this, dsl_types.MuranoType):
                        native_this = this.get_reference()
                    else:
                        native_this = dsl.MuranoObjectInterface(this.cast(
                            method.declaring_type))
                    return method.body(
                        yaql_engine, context, native_this)(*args, **kwargs)
                else:
                    context[constants.CTX_NAMES_SCOPE] = \
                        method.declaring_type
                    return (None if method.body is None
                            else method.body.execute(context))

            if (not isinstance(method.body, specs.FunctionDefinition) or
                    not method.body.meta.get(constants.META_NO_TRACE)):
                with self._log_method(context, args, kwargs) as log:
                    result = call()
                    log(result)
                    return result
            else:
                return call()
Пример #16
0
def call_func(context, engine, name, args, kwargs, receiver=utils.NO_VALUE):
    return context(name, engine, receiver)(
        *args, **utils.filter_parameters_dict(kwargs))
Пример #17
0
    def _invoke_method(self,
                       method,
                       this,
                       context,
                       args,
                       kwargs,
                       skip_stub=False):
        if isinstance(this, dsl.MuranoObjectInterface):
            this = this.object
        kwargs = utils.filter_parameters_dict(kwargs)
        runtime_version = method.declaring_type.package.runtime_version
        yaql_engine = yaql_integration.choose_yaql_engine(runtime_version)
        if context is None or not skip_stub:
            actions_only = context is None and not method.name.startswith('.')
            method_context = self.create_method_context(
                self.create_object_context(this, context), method)
            method_context[constants.CTX_SKIP_FRAME] = True
            method_context[constants.CTX_ACTIONS_ONLY] = actions_only

            stub = method.static_stub if isinstance(
                this, dsl_types.MuranoType) else method.instance_stub
            if stub is None:
                raise ValueError(
                    'Method {0} cannot be called on receiver {1}'.format(
                        method, this))

            return stub(yaql_engine, method_context, this.real_this)(*args,
                                                                     **kwargs)

        if (context[constants.CTX_ACTIONS_ONLY]
                and method.usage != dsl_types.MethodUsages.Action):
            raise Exception('{0} is not an action'.format(method.name))

        if method.is_static:
            obj_context = self.create_object_context(method.declaring_type,
                                                     context)
        else:
            obj_context = self.create_object_context(this, context)
        context = self.create_method_context(obj_context, method)

        if isinstance(this, dsl_types.MuranoObject):
            this = this.real_this

        if method.arguments_scheme is not None:
            args, kwargs = self._canonize_parameters(method.arguments_scheme,
                                                     args, kwargs)

        with self._acquire_method_lock(method, this):
            for i, arg in enumerate(args, 2):
                context[str(i)] = arg
            for key, value in six.iteritems(kwargs):
                context[key] = value

            def call():
                if isinstance(method.body, specs.FunctionDefinition):
                    if isinstance(this, dsl_types.MuranoType):
                        native_this = this.get_reference()
                    else:
                        native_this = dsl.MuranoObjectInterface(
                            this.cast(method.declaring_type), self)
                    return method.body(yaql_engine, context,
                                       native_this)(*args, **kwargs)
                else:
                    context[constants.CTX_NAMES_SCOPE] = \
                        method.declaring_type
                    return (None if method.body is None else
                            method.body.execute(context))

            if (not isinstance(method.body, specs.FunctionDefinition)
                    or not method.body.meta.get(constants.META_NO_TRACE)):
                with self._log_method(context, args, kwargs) as log:
                    result = call()
                    log(result)
                    return result
            else:
                return call()
Пример #18
0
    def invoke_method(self, method, this, context, args, kwargs,
                      skip_stub=False, invoke_action=True):
        if isinstance(this, dsl.MuranoObjectInterface):
            this = this.object
        kwargs = utils.filter_parameters_dict(kwargs)
        runtime_version = method.declaring_type.package.runtime_version
        yaql_engine = yaql_integration.choose_yaql_engine(runtime_version)
        if context is None or not skip_stub:
            actions_only = (context is None and not method.name.startswith('.')
                            and invoke_action)
            method_context = self.create_method_context(
                self.create_object_context(this, context), method)
            method_context[constants.CTX_SKIP_FRAME] = True
            method_context[constants.CTX_ACTIONS_ONLY] = actions_only

            stub = method.static_stub if isinstance(
                this, dsl_types.MuranoType) else method.instance_stub
            if stub is None:
                raise ValueError(
                    'Method {0} cannot be called on receiver {1}'.format(
                        method, this))

            real_this = this.real_this if isinstance(
                this, dsl_types.MuranoObject) else this.get_reference()
            return stub(yaql_engine, method_context, real_this)(
                *args, **kwargs)

        if context[constants.CTX_ACTIONS_ONLY] and not method.is_action:
            raise dsl_exceptions.MethodNotExposed(
                '{0} is not an action'.format(method.name))

        if method.is_static:
            obj_context = self.create_object_context(
                method.declaring_type, context)
        else:
            obj_context = self.create_object_context(this, context)
        context = self.create_method_context(obj_context, method)

        if isinstance(this, dsl_types.MuranoObject):
            if this.destroyed:
                raise dsl_exceptions.ObjectDestroyedError(this)
            this = this.real_this

        if method.arguments_scheme is not None:
            args, kwargs = self._canonize_parameters(
                method.arguments_scheme, args, kwargs, method.name, this)

        this_lock = this
        arg_values_for_lock = {}
        method_meta = [m for m in method.get_meta(context)
                       if m.type.name == ('io.murano.metadata.'
                                          'engine.Synchronize')]
        if method_meta:
            method_meta = method_meta[0]

        if method_meta:
            if not method_meta.get_property('onThis', context):
                this_lock = None
            for arg_name in method_meta.get_property('onArgs', context):
                arg_val = kwargs.get(arg_name)
                if arg_val is not None:
                    arg_values_for_lock[arg_name] = arg_val

        arg_values_for_lock = utils.filter_parameters_dict(arg_values_for_lock)

        with self._acquire_method_lock(method, this_lock, arg_values_for_lock):
            for i, arg in enumerate(args, 2):
                context[str(i)] = arg
            for key, value in kwargs.items():
                context[key] = value

            def call():
                if isinstance(method.body, specs.FunctionDefinition):
                    if isinstance(this, dsl_types.MuranoType):
                        native_this = this.get_reference()
                    else:
                        native_this = dsl.MuranoObjectInterface(this.cast(
                            method.declaring_type))
                    return method.body(
                        yaql_engine, context, native_this)(*args, **kwargs)
                else:
                    context[constants.CTX_NAMES_SCOPE] = \
                        method.declaring_type
                    return (None if method.body is None
                            else method.body.execute(context))

            if (not isinstance(method.body, specs.FunctionDefinition) or
                    not method.body.meta.get(constants.META_NO_TRACE)):
                with self._log_method(context, args, kwargs) as log:
                    result = call()
                    log(result)
                    return result
            else:
                return call()