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); }
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); }
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); }
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); }
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); }