Exemplo n.º 1
0
        public virtual bool TryCreate(FunctionMetadata functionMetadata, out FunctionDescriptor functionDescriptor)
        {
            if (functionMetadata == null)
            {
                throw new InvalidOperationException("functionMetadata");
            }

            functionDescriptor = null;

            // Default the trigger binding name if a name hasn't
            // been specified
            // TODO: Remove this logic and always require it to be explicitly
            // specified?
            foreach (var binding in functionMetadata.Bindings.Where(p => p.IsTrigger))
            {
                if (string.IsNullOrEmpty(binding.Name))
                {
                    if (binding.Type == BindingType.HttpTrigger)
                    {
                        binding.Name = DefaultHttpInputParameterName;
                    }
                    else
                    {
                        binding.Name = DefaultInputParameterName;
                    }
                }
            }

            // parse the bindings
            Collection <FunctionBinding> inputBindings  = FunctionBinding.GetBindings(Config, functionMetadata.InputBindings, FileAccess.Read);
            Collection <FunctionBinding> outputBindings = FunctionBinding.GetBindings(Config, functionMetadata.OutputBindings, FileAccess.Write);

            BindingMetadata triggerMetadata = functionMetadata.InputBindings.FirstOrDefault(p => p.IsTrigger);

            string scriptFilePath = Path.Combine(Config.RootScriptPath, functionMetadata.ScriptFile);

            IFunctionInvoker invoker = null;

            try
            {
                invoker = CreateFunctionInvoker(scriptFilePath, triggerMetadata, functionMetadata, inputBindings, outputBindings);

                Collection <CustomAttributeBuilder> methodAttributes = new Collection <CustomAttributeBuilder>();
                Collection <ParameterDescriptor>    parameters       = GetFunctionParameters(invoker, functionMetadata, triggerMetadata, methodAttributes, inputBindings, outputBindings);

                functionDescriptor = new FunctionDescriptor(functionMetadata.Name, invoker, functionMetadata, parameters, methodAttributes);

                return(true);
            }
            catch (Exception)
            {
                IDisposable disposableInvoker = invoker as IDisposable;
                if (disposableInvoker != null)
                {
                    disposableInvoker.Dispose();
                }

                throw;
            }
        }
        public virtual bool TryCreate(FunctionMetadata functionMetadata, out FunctionDescriptor functionDescriptor)
        {
            if (functionMetadata == null)
            {
                throw new InvalidOperationException("functionMetadata");
            }

            ValidateFunction(functionMetadata);

            // parse the bindings
            Collection <FunctionBinding> inputBindings  = FunctionBinding.GetBindings(Config, BindingProviders, functionMetadata.InputBindings, FileAccess.Read);
            Collection <FunctionBinding> outputBindings = FunctionBinding.GetBindings(Config, BindingProviders, functionMetadata.OutputBindings, FileAccess.Write);

            VerifyResolvedBindings(functionMetadata, inputBindings, outputBindings);

            BindingMetadata triggerMetadata = functionMetadata.InputBindings.FirstOrDefault(p => p.IsTrigger);
            string          scriptFilePath  = Path.Combine(Config.RootScriptPath, functionMetadata.ScriptFile ?? string.Empty);

            functionDescriptor = null;
            IFunctionInvoker invoker = null;

            try
            {
                invoker = CreateFunctionInvoker(scriptFilePath, triggerMetadata, functionMetadata, inputBindings, outputBindings);

                Collection <CustomAttributeBuilder> methodAttributes = new Collection <CustomAttributeBuilder>();
                Collection <ParameterDescriptor>    parameters       = GetFunctionParameters(invoker, functionMetadata, triggerMetadata, methodAttributes, inputBindings, outputBindings);

                functionDescriptor = new FunctionDescriptor(functionMetadata.Name, invoker, functionMetadata, parameters, methodAttributes, inputBindings, outputBindings);

                return(true);
            }
            catch (Exception ex)
            {
                Host.Logger.LogTrace(ex, $"Creating function descriptor for function {functionMetadata.Name} failed");
                IDisposable disposableInvoker = invoker as IDisposable;
                if (disposableInvoker != null)
                {
                    disposableInvoker.Dispose();
                }

                throw;
            }
        }
Exemplo n.º 3
0
        public virtual bool TryCreate(FunctionMetadata functionMetadata, out FunctionDescriptor functionDescriptor)
        {
            functionDescriptor = null;

            if (functionMetadata.IsDisabled)
            {
                return(false);
            }

            // parse the bindings
            Collection <FunctionBinding> inputBindings  = FunctionBinding.GetBindings(Config, functionMetadata.InputBindings, FileAccess.Read);
            Collection <FunctionBinding> outputBindings = FunctionBinding.GetBindings(Config, functionMetadata.OutputBindings, FileAccess.Write);

            BindingMetadata triggerMetadata      = functionMetadata.InputBindings.FirstOrDefault(p => p.IsTrigger);
            BindingType     triggerType          = triggerMetadata.Type;
            string          triggerParameterName = triggerMetadata.Name;
            bool            triggerNameSpecified = true;

            if (string.IsNullOrEmpty(triggerParameterName))
            {
                // default the name to simply 'input'
                triggerMetadata.Name = triggerParameterName = "input";
                triggerNameSpecified = false;
            }

            Collection <CustomAttributeBuilder> methodAttributes = new Collection <CustomAttributeBuilder>();
            ParameterDescriptor triggerParameter = null;
            bool omitInputParameter = false;

            switch (triggerType)
            {
            case BindingType.QueueTrigger:
                triggerParameter = ParseQueueTrigger((QueueBindingMetadata)triggerMetadata);
                break;

            case BindingType.BlobTrigger:
                triggerParameter = ParseBlobTrigger((BlobBindingMetadata)triggerMetadata);
                break;

            case BindingType.ServiceBusTrigger:
                triggerParameter = ParseServiceBusTrigger((ServiceBusBindingMetadata)triggerMetadata);
                break;

            case BindingType.TimerTrigger:
                omitInputParameter = true;
                triggerParameter   = ParseTimerTrigger((TimerBindingMetadata)triggerMetadata, typeof(TimerInfo));
                break;

            case BindingType.HttpTrigger:
                if (!triggerNameSpecified)
                {
                    triggerMetadata.Name = triggerParameterName = "req";
                }
                triggerParameter = ParseHttpTrigger((HttpBindingMetadata)triggerMetadata, methodAttributes, typeof(HttpRequestMessage));
                break;

            case BindingType.ManualTrigger:
                triggerParameter = ParseManualTrigger(triggerMetadata, methodAttributes);
                break;
            }

            Collection <ParameterDescriptor> parameters = new Collection <ParameterDescriptor>();

            triggerParameter.IsTrigger = true;
            parameters.Add(triggerParameter);

            // Add a TraceWriter for logging
            parameters.Add(new ParameterDescriptor("log", typeof(TraceWriter)));

            // Add an IBinder to support the binding programming model
            parameters.Add(new ParameterDescriptor("binder", typeof(IBinder)));

            // Add ExecutionContext to provide access to InvocationId, etc.
            parameters.Add(new ParameterDescriptor("context", typeof(ExecutionContext)));

            string           scriptFilePath = Path.Combine(Config.RootScriptPath, functionMetadata.Source);
            IFunctionInvoker invoker        = CreateFunctionInvoker(scriptFilePath, triggerMetadata, functionMetadata, omitInputParameter, inputBindings, outputBindings);

            functionDescriptor = new FunctionDescriptor(functionMetadata.Name, invoker, functionMetadata, parameters, methodAttributes);

            return(true);
        }