예제 #1
0
        public void GetCustomAttributes_WithReadWriteTypes_AppliesReadWriteAccess(Type parameterType, FileAccess metadataAccess, FileAccess expectedAccess)
        {
            var metadata = new BlobBindingMetadata()
            {
                Path = "my/blob"
            };
            var binding = new BlobBinding(new ScriptHostConfiguration(), metadata, metadataAccess);

            Collection <CustomAttributeBuilder> attributeBuilders = binding.GetCustomAttributes(parameterType);

            // Get blob attribute
            var builder = attributeBuilders.FirstOrDefault(b =>
                                                           string.CompareOrdinal(GetCustomAttributeBuilderFieldValue <ConstructorInfo>("m_con", b).DeclaringType.FullName,
                                                                                 "Microsoft.Azure.WebJobs.BlobAttribute") == 0);

            Assert.NotNull(builder);

            var attributeParameters = GetCustomAttributeBuilderFieldValue <object[]>("m_constructorArgs", builder);

            Assert.Equal(2, attributeParameters.Length);
            Assert.IsType(typeof(FileAccess), attributeParameters[1]);

            FileAccess access = (FileAccess)attributeParameters[1];

            Assert.Equal(expectedAccess, access);
        }
예제 #2
0
        public BlobBinding(ScriptHostConfiguration config, BlobBindingMetadata metadata, FileAccess access) : base(config, metadata, access)
        {
            if (string.IsNullOrEmpty(metadata.Path))
            {
                throw new ArgumentException("The blob path cannot be null or empty.");
            }

            Path = metadata.Path;
            _pathBindingTemplate = BindingTemplate.FromString(Path);
        }
예제 #3
0
        public void GenerateBlobTriggerFunction()
        {
            BlobBindingMetadata trigger = new BlobBindingMetadata
            {
                Type = BindingType.BlobTrigger,
                Path = "foo/bar"
            };
            MethodInfo method = GenerateMethod(trigger);

            VerifyCommonProperties(method);

            // verify trigger parameter
            ParameterInfo parameter = method.GetParameters()[0];

            Assert.Equal("input", parameter.Name);
            Assert.Equal(typeof(Stream), parameter.ParameterType);
            BlobTriggerAttribute attribute = parameter.GetCustomAttribute <BlobTriggerAttribute>();

            Assert.Equal("foo/bar", attribute.BlobPath);
        }
예제 #4
0
        internal static Collection <FunctionBinding> GetBindings(ScriptHostConfiguration config, IEnumerable <BindingMetadata> bindingMetadatas, FileAccess fileAccess)
        {
            Collection <FunctionBinding> bindings = new Collection <FunctionBinding>();

            if (bindings != null)
            {
                foreach (var bindingMetadata in bindingMetadatas)
                {
                    BindingType type = bindingMetadata.Type;
                    string      name = bindingMetadata.Name;

                    switch (type)
                    {
                    case BindingType.Blob:
                    case BindingType.BlobTrigger:
                        BlobBindingMetadata blobBindingMetadata = (BlobBindingMetadata)bindingMetadata;
                        bindings.Add(new BlobBinding(config, name, blobBindingMetadata.Path, fileAccess, bindingMetadata.IsTrigger));
                        break;

                    case BindingType.Queue:
                    case BindingType.QueueTrigger:
                        QueueBindingMetadata queueBindingMetadata = (QueueBindingMetadata)bindingMetadata;
                        if (!queueBindingMetadata.IsTrigger &&
                            fileAccess != FileAccess.Write)
                        {
                            throw new InvalidOperationException("Queue binding can only be used for output.");
                        }
                        bindings.Add(new QueueBinding(config, name, queueBindingMetadata.QueueName, fileAccess, bindingMetadata.IsTrigger));
                        break;

                    case BindingType.ServiceBus:
                    case BindingType.ServiceBusTrigger:
                        ServiceBusBindingMetadata serviceBusBindingMetadata = (ServiceBusBindingMetadata)bindingMetadata;
                        if (!serviceBusBindingMetadata.IsTrigger &&
                            fileAccess != FileAccess.Write)
                        {
                            throw new InvalidOperationException("ServiceBus binding can only be used for output.");
                        }
                        string queueOrTopicName = serviceBusBindingMetadata.QueueName ?? serviceBusBindingMetadata.TopicName;
                        bindings.Add(new ServiceBusBinding(config, name, queueOrTopicName, fileAccess, bindingMetadata.IsTrigger));
                        break;

                    case BindingType.Table:
                        TableBindingMetadata tableBindingMetadata = (TableBindingMetadata)bindingMetadata;
                        TableQuery           tableQuery           = new TableQuery
                        {
                            TakeCount    = tableBindingMetadata.Take,
                            FilterString = tableBindingMetadata.Filter
                        };
                        bindings.Add(new TableBinding(config, name, tableBindingMetadata.TableName, tableBindingMetadata.PartitionKey, tableBindingMetadata.RowKey, fileAccess, tableQuery));
                        break;

                    case BindingType.Http:
                        HttpBindingMetadata httpBindingMetadata = (HttpBindingMetadata)bindingMetadata;
                        if (fileAccess != FileAccess.Write)
                        {
                            throw new InvalidOperationException("Http binding can only be used for output.");
                        }
                        name = name ?? "res";
                        bindings.Add(new HttpBinding(config, name, FileAccess.Write, bindingMetadata.IsTrigger));
                        break;
                    }
                }
            }

            return(bindings);
        }
예제 #5
0
        internal static Collection <FunctionBinding> GetBindings(ScriptHostConfiguration config, IEnumerable <BindingMetadata> bindingMetadatas, FileAccess fileAccess)
        {
            Collection <FunctionBinding> bindings = new Collection <FunctionBinding>();

            if (bindings != null)
            {
                foreach (var bindingMetadata in bindingMetadatas)
                {
                    switch (bindingMetadata.Type)
                    {
                    case BindingType.Blob:
                    case BindingType.BlobTrigger:
                        BlobBindingMetadata blobBindingMetadata = (BlobBindingMetadata)bindingMetadata;
                        bindings.Add(new BlobBinding(config, blobBindingMetadata, fileAccess));
                        break;

                    case BindingType.EventHub:
                    case BindingType.EventHubTrigger:
                        EventHubBindingMetadata eventHubBindingMetadata = (EventHubBindingMetadata)bindingMetadata;
                        if (!eventHubBindingMetadata.IsTrigger &&
                            fileAccess != FileAccess.Write)
                        {
                            throw new InvalidOperationException("EventHub binding can only be used for output.");
                        }
                        bindings.Add(new EventHubBinding(config, eventHubBindingMetadata, fileAccess));
                        break;

                    case BindingType.Queue:
                    case BindingType.QueueTrigger:
                        QueueBindingMetadata queueBindingMetadata = (QueueBindingMetadata)bindingMetadata;
                        if (!queueBindingMetadata.IsTrigger &&
                            fileAccess != FileAccess.Write)
                        {
                            throw new InvalidOperationException("Queue binding can only be used for output.");
                        }
                        bindings.Add(new QueueBinding(config, queueBindingMetadata, fileAccess));
                        break;

                    case BindingType.ServiceBus:
                    case BindingType.ServiceBusTrigger:
                        ServiceBusBindingMetadata serviceBusBindingMetadata = (ServiceBusBindingMetadata)bindingMetadata;
                        if (!serviceBusBindingMetadata.IsTrigger &&
                            fileAccess != FileAccess.Write)
                        {
                            throw new InvalidOperationException("ServiceBus binding can only be used for output.");
                        }
                        bindings.Add(new ServiceBusBinding(config, serviceBusBindingMetadata, fileAccess));
                        break;

                    case BindingType.Table:
                        TableBindingMetadata tableBindingMetadata = (TableBindingMetadata)bindingMetadata;
                        bindings.Add(new TableBinding(config, tableBindingMetadata, fileAccess));
                        break;

                    case BindingType.Http:
                        if (fileAccess != FileAccess.Write)
                        {
                            throw new InvalidOperationException("Http binding can only be used for output.");
                        }
                        if (string.IsNullOrEmpty(bindingMetadata.Name))
                        {
                            // TODO: Why is this here?
                            bindingMetadata.Name = "res";
                        }
                        bindings.Add(new HttpBinding(config, bindingMetadata, FileAccess.Write));
                        break;

                    case BindingType.HttpTrigger:
                        bindings.Add(new HttpBinding(config, bindingMetadata, FileAccess.Read));
                        break;

                    case BindingType.EasyTable:
                        EasyTableBindingMetadata easyTableMetadata = (EasyTableBindingMetadata)bindingMetadata;
                        bindings.Add(new EasyTableBinding(config, easyTableMetadata, fileAccess));
                        break;

                    case BindingType.DocumentDB:
                        DocumentDBBindingMetadata docDBMetadata = (DocumentDBBindingMetadata)bindingMetadata;
                        bindings.Add(new DocumentDBBinding(config, docDBMetadata, fileAccess));
                        break;

                    case BindingType.NotificationHub:
                        NotificationHubBindingMetadata notificationHubMetadata = (NotificationHubBindingMetadata)bindingMetadata;
                        bindings.Add(new NotificationHubBinding(config, notificationHubMetadata, fileAccess));
                        break;

                    case BindingType.ApiHub:
                    case BindingType.ApiHubTrigger:
                        ApiHubBindingMetadata apiHubBindingMetadata = (ApiHubBindingMetadata)bindingMetadata;
                        apiHubBindingMetadata.Key = Guid.NewGuid().ToString();
                        bindings.Add(new ApiHubBinding(config, apiHubBindingMetadata, fileAccess));
                        break;
                    }
                }
            }

            return(bindings);
        }