public Task<IBinding> TryCreateAsync(BindingProviderContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            ParameterInfo parameter = context.Parameter;
            ServiceBusAttribute attribute = parameter.GetCustomAttribute<ServiceBusAttribute>(inherit: false);

            if (attribute == null)
            {
                return Task.FromResult<IBinding>(null);
            }

            string queueOrTopicName = Resolve(attribute.QueueOrTopicName);
            IBindableServiceBusPath path = BindableServiceBusPath.Create(queueOrTopicName);
            ValidateContractCompatibility(path, context.BindingDataContract);

            IArgumentBinding<ServiceBusEntity> argumentBinding = InnerProvider.TryCreate(parameter);
            if (argumentBinding == null)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Can't bind ServiceBus to type '{0}'.", parameter.ParameterType));
            }

            string connectionName = ServiceBusAccount.GetAccountOverrideOrNull(context.Parameter);
            ServiceBusAccount account = new ServiceBusAccount
            {
                MessagingFactory = _config.MessagingProvider.CreateMessagingFactory(queueOrTopicName, connectionName),
                NamespaceManager = _config.MessagingProvider.CreateNamespaceManager(connectionName)
            };

            IBinding binding = new ServiceBusBinding(parameter.Name, argumentBinding, account, path, attribute.Access);
            return Task.FromResult<IBinding>(binding);
        }
 public ServiceBusQueueListenerFactory(ServiceBusAccount account, string queueName, ITriggeredFunctionExecutor executor, AccessRights accessRights)
 {
     _namespaceManager = account.NamespaceManager;
     _messagingFactory = account.MessagingFactory;
     _queueName = queueName;
     _executor = executor;
     _accessRights = accessRights;
 }
        public async Task CreateAsync_AccessRightsNotManage_DoesNotCreateTopicOrSubscription(AccessRights accessRights)
        {
            ServiceBusAccount account = new ServiceBusAccount();
            Mock<ITriggeredFunctionExecutor> mockExecutor = new Mock<ITriggeredFunctionExecutor>(MockBehavior.Strict);
            ServiceBusSubscriptionListenerFactory factory = new ServiceBusSubscriptionListenerFactory(account, "testtopic", "testsubscription", mockExecutor.Object, accessRights, new ServiceBusConfiguration());

            IListener listener = await factory.CreateAsync(CancellationToken.None);
            Assert.NotNull(listener);
        }
 public ServiceBusSubscriptionListenerFactory(ServiceBusAccount account, string topicName, string subscriptionName, ITriggeredFunctionExecutor executor, AccessRights accessRights)
 {
     _namespaceManager = account.NamespaceManager;
     _messagingFactory = account.MessagingFactory;
     _topicName = topicName;
     _subscriptionName = subscriptionName;
     _executor = executor;
     _accessRights = accessRights;
 }
        public async Task<ITriggerBinding> TryCreateAsync(TriggerBindingProviderContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            ParameterInfo parameter = context.Parameter;
            ServiceBusTriggerAttribute attribute = parameter.GetCustomAttribute<ServiceBusTriggerAttribute>(inherit: false);

            if (attribute == null)
            {
                return null;
            }

            string queueName = null;
            string topicName = null;
            string subscriptionName = null;
            string entityPath = null;

            if (attribute.QueueName != null)
            {
                queueName = Resolve(attribute.QueueName);
                entityPath = queueName;
            }
            else
            {
                topicName = Resolve(attribute.TopicName);
                subscriptionName = Resolve(attribute.SubscriptionName);
                entityPath = SubscriptionClient.FormatSubscriptionPath(topicName, subscriptionName);
            }

            ITriggerDataArgumentBinding<BrokeredMessage> argumentBinding = InnerProvider.TryCreate(parameter);
            if (argumentBinding == null)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Can't bind ServiceBusTrigger to type '{0}'.", parameter.ParameterType));
            }

            string connectionName = ServiceBusAccount.GetAccountOverrideOrNull(context.Parameter);
            ServiceBusAccount account = new ServiceBusAccount
            {
                MessagingFactory = await _config.MessagingProvider.CreateMessagingFactoryAsync(entityPath, connectionName),
                NamespaceManager = _config.MessagingProvider.CreateNamespaceManager(connectionName)
            };

            ITriggerBinding binding;
            if (queueName != null)
            {
                binding = new ServiceBusTriggerBinding(parameter.Name, parameter.ParameterType, argumentBinding, account, queueName, attribute.Access, _config);
            }
            else
            {
                binding = new ServiceBusTriggerBinding(parameter.Name, argumentBinding, account, topicName, subscriptionName, attribute.Access, _config);
            }

            return binding;
        }
        public async Task CreateAsync_AccessRightsNotManage_DoesNotCreateQueue(AccessRights accessRights)
        {
            ServiceBusAccount account = new ServiceBusAccount();
            Mock<ITriggeredFunctionExecutor> mockExecutor = new Mock<ITriggeredFunctionExecutor>(MockBehavior.Strict);
            ServiceBusQueueListenerFactory factory = new ServiceBusQueueListenerFactory(account, "testqueue", mockExecutor.Object, accessRights);

            IListener listener = await factory.CreateAsync(CancellationToken.None);
            Assert.NotNull(listener);
        }
 public ServiceBusBinding(string parameterName, IArgumentBinding<ServiceBusEntity> argumentBinding, ServiceBusAccount account, IBindableServiceBusPath path, AccessRights accessRights)
 {
     _parameterName = parameterName;
     _argumentBinding = argumentBinding;
     _account = account;
     _namespaceName = ServiceBusClient.GetNamespaceName(account);
     _path = path;
     _accessRights = accessRights;
     _converter = CreateConverter(account, path, accessRights);
 }
 public ServiceBusTriggerBinding(string parameterName, ITriggerDataArgumentBinding<BrokeredMessage> argumentBinding,
     ServiceBusAccount account, string topicName, string subscriptionName, AccessRights accessRights)
 {
     _parameterName = parameterName;
     _argumentBinding = argumentBinding;
     _account = account;
     _namespaceName = ServiceBusClient.GetNamespaceName(account);
     _topicName = topicName;
     _subscriptionName = subscriptionName;
     _entityPath = SubscriptionClient.FormatSubscriptionPath(topicName, subscriptionName);
     _accessRights = accessRights;
 }
 public ServiceBusTriggerBinding(string parameterName, Type parameterType, 
     ITriggerDataArgumentBinding<BrokeredMessage> argumentBinding, ServiceBusAccount account, string queueName, AccessRights accessRights)
 {
     _parameterName = parameterName;
     _converter = CreateConverter(parameterType);
     _argumentBinding = argumentBinding;
     _account = account;
     _namespaceName = ServiceBusClient.GetNamespaceName(account);
     _queueName = queueName;
     _entityPath = queueName;
     _accessRights = accessRights;
 }
Example #10
0
 public ServiceBusTriggerBinding(string parameterName, Type parameterType, ITriggerDataArgumentBinding <Message> argumentBinding, ServiceBusAccount account,
                                 ServiceBusOptions options, MessagingProvider messagingProvider, EntityType entityType, string entityPath, bool isSessionsEnabled, ILoggerFactory loggerFactory)
 {
     _parameterName       = parameterName;
     _converter           = CreateConverter(parameterType);
     _argumentBinding     = argumentBinding;
     _bindingDataContract = CreateBindingDataContract(argumentBinding.BindingDataContract);
     _account             = account;
     _options             = options;
     _messagingProvider   = messagingProvider;
     _entityType          = entityType;
     _entityPath          = entityPath;
     _isSessionsEnabled   = isSessionsEnabled;
     _loggerFactory       = loggerFactory;
 }
        public Task <ITriggerBinding> TryCreateAsync(TriggerBindingProviderContext context)
        {
            ParameterInfo parameter = context.Parameter;
            ServiceBusTriggerAttribute serviceBusTrigger = parameter.GetCustomAttribute <ServiceBusTriggerAttribute>(inherit: false);

            if (serviceBusTrigger == null)
            {
                return(Task.FromResult <ITriggerBinding>(null));
            }

            string queueName        = null;
            string topicName        = null;
            string subscriptionName = null;

            if (serviceBusTrigger.QueueName != null)
            {
                queueName = Resolve(serviceBusTrigger.QueueName);
            }
            else
            {
                topicName        = Resolve(serviceBusTrigger.TopicName);
                subscriptionName = Resolve(serviceBusTrigger.SubscriptionName);
            }

            ITriggerDataArgumentBinding <BrokeredMessage> argumentBinding = _innerProvider.TryCreate(parameter);

            if (argumentBinding == null)
            {
                throw new InvalidOperationException("Can't bind ServiceBusTrigger to type '" + parameter.ParameterType + "'.");
            }

            string            connectionString = _accountProvider.ConnectionString;
            ServiceBusAccount account          = ServiceBusAccount.CreateFromConnectionString(connectionString);
            ITriggerBinding   binding;

            if (queueName != null)
            {
                binding = new ServiceBusTriggerBinding(parameter.Name, parameter.ParameterType, argumentBinding,
                                                       account, queueName);
            }
            else
            {
                binding = new ServiceBusTriggerBinding(parameter.Name, argumentBinding, account, topicName,
                                                       subscriptionName);
            }

            return(Task.FromResult(binding));
        }
        public Task <ITriggerBinding> TryCreateAsync(TriggerBindingProviderContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            ParameterInfo parameter = context.Parameter;
            var           attribute = TypeUtility.GetResolvedAttribute <ServiceBusTriggerAttribute>(parameter);

            if (attribute == null)
            {
                return(Task.FromResult <ITriggerBinding>(null));
            }

            string queueName        = null;
            string topicName        = null;
            string subscriptionName = null;
            string entityPath       = null;

            if (attribute.QueueName != null)
            {
                queueName  = Resolve(attribute.QueueName);
                entityPath = queueName;
            }
            else
            {
                topicName        = Resolve(attribute.TopicName);
                subscriptionName = Resolve(attribute.SubscriptionName);
                entityPath       = EntityNameHelper.FormatSubscriptionPath(topicName, subscriptionName);
            }

            ITriggerDataArgumentBinding <Message> argumentBinding = InnerProvider.TryCreate(parameter);

            if (argumentBinding == null)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Can't bind ServiceBusTrigger to type '{0}'.", parameter.ParameterType));
            }

            attribute.Connection = Resolve(attribute.Connection);
            ServiceBusAccount account = new ServiceBusAccount(_options, _configuration, attribute);

            ITriggerBinding binding = new ServiceBusTriggerBinding(parameter.Name, parameter.ParameterType, argumentBinding, account, _options, _messagingProvider, entityPath, attribute.IsSessionsEnabled);

            return(Task.FromResult <ITriggerBinding>(binding));
        }
        public ServiceBusListener(string entityPath, bool isSessionsEnabled, ServiceBusTriggerExecutor triggerExecutor, ServiceBusOptions config, ServiceBusAccount serviceBusAccount, MessagingProvider messagingProvider)
        {
            _entityPath              = entityPath;
            _isSessionsEnabled       = isSessionsEnabled;
            _triggerExecutor         = triggerExecutor;
            _cancellationTokenSource = new CancellationTokenSource();
            _messagingProvider       = messagingProvider;
            _serviceBusAccount       = serviceBusAccount;

            if (_isSessionsEnabled)
            {
                _sessionMessageProcessor = _messagingProvider.CreateSessionMessageProcessor(entityPath, _serviceBusAccount.ConnectionString);
            }
            else
            {
                _messageProcessor = _messagingProvider.CreateMessageProcessor(entityPath, _serviceBusAccount.ConnectionString);
            }
            _serviceBusOptions = config;
        }
Example #14
0
        public void StorageAccountOverrides()
        {
            // param level
            MethodInfo    method         = typeof(AccountOverrides).GetMethod("ParamOverride", BindingFlags.NonPublic | BindingFlags.Instance);
            ParameterInfo parameter      = method.GetParameters().Single(p => p.Name == "s");
            string        connectionName = ServiceBusAccount.GetAccountOverrideOrNull(parameter);

            Assert.Equal("param", connectionName);

            // method level
            method         = typeof(AccountOverrides).GetMethod("MethodOverride", BindingFlags.NonPublic | BindingFlags.Instance);
            parameter      = method.GetParameters().Single(p => p.Name == "s");
            connectionName = ServiceBusAccount.GetAccountOverrideOrNull(parameter);
            Assert.Equal("method", connectionName);

            method         = typeof(AccountOverrides).GetMethod("ClassOverride", BindingFlags.NonPublic | BindingFlags.Instance);
            parameter      = method.GetParameters().Single(p => p.Name == "s");
            connectionName = ServiceBusAccount.GetAccountOverrideOrNull(parameter);
            Assert.Equal("class", connectionName);
        }
Example #15
0
        public async Task CreateAsync_Success()
        {
            var configuration = new ConfigurationBuilder()
                                .AddEnvironmentVariables()
                                .Build();
            var config = new ServiceBusOptions
            {
                ConnectionString = configuration.GetWebJobsConnectionString("ServiceBus")
            };

            var messagingProvider = new MessagingProvider(new OptionsWrapper <ServiceBusOptions>(config));

            var account = new ServiceBusAccount(config, configuration);
            Mock <ITriggeredFunctionExecutor> mockExecutor = new Mock <ITriggeredFunctionExecutor>(MockBehavior.Strict);
            ServiceBusQueueListenerFactory    factory      = new ServiceBusQueueListenerFactory(account, "testqueue", mockExecutor.Object, config, messagingProvider);

            IListener listener = await factory.CreateAsync(CancellationToken.None);

            Assert.NotNull(listener);
        }
Example #16
0
        public Task <IBinding> TryCreateAsync(BindingProviderContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            ParameterInfo       parameter = context.Parameter;
            ServiceBusAttribute attribute = parameter.GetCustomAttribute <ServiceBusAttribute>(inherit: false);

            if (attribute == null)
            {
                return(Task.FromResult <IBinding>(null));
            }

            string queueOrTopicName      = Resolve(attribute.QueueOrTopicName);
            IBindableServiceBusPath path = BindableServiceBusPath.Create(queueOrTopicName);

            ValidateContractCompatibility(path, context.BindingDataContract);

            IArgumentBinding <ServiceBusEntity> argumentBinding = InnerProvider.TryCreate(parameter);

            if (argumentBinding == null)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Can't bind ServiceBus to type '{0}'.", parameter.ParameterType));
            }

            string            connectionName = ServiceBusAccount.GetAccountOverrideOrNull(context.Parameter);
            ServiceBusAccount account        = new ServiceBusAccount
            {
                MessagingFactory = _config.MessagingProvider.CreateMessagingFactory(queueOrTopicName, connectionName),
                NamespaceManager = _config.MessagingProvider.CreateNamespaceManager(connectionName)
            };

            IBinding binding = new ServiceBusBinding(parameter.Name, argumentBinding, account, path, attribute.Access);

            return(Task.FromResult <IBinding>(binding));
        }
        public void GetConnectionString_ThrowsIfConnectionStringNullOrEmpty()
        {
            var config    = new ServiceBusOptions();
            var attribute = new ServiceBusTriggerAttribute("testqueue");

            attribute.Connection = "MissingConnection";

            var ex = Assert.Throws <InvalidOperationException>(() =>
            {
                var account = new ServiceBusAccount(config, _configuration, attribute);
                var cs      = account.ConnectionString;
            });

            Assert.AreEqual("Microsoft Azure WebJobs SDK ServiceBus connection string 'MissingConnection' is missing or empty.", ex.Message);

            attribute.Connection    = null;
            config.ConnectionString = null;
            ex = Assert.Throws <InvalidOperationException>(() =>
            {
                var account = new ServiceBusAccount(config, _configuration, attribute);
                var cs      = account.ConnectionString;
            });
            Assert.AreEqual("Microsoft Azure WebJobs SDK ServiceBus connection string 'AzureWebJobsServiceBus' is missing or empty.", ex.Message);
        }
Example #18
0
 public ServiceBusTriggerBinding(string parameterName, Type parameterType, ITriggerDataArgumentBinding <Message> argumentBinding, ServiceBusAccount account,
                                 ServiceBusConfiguration config, string queueName)
     : this(parameterName, parameterType, argumentBinding, account, config)
 {
     _queueName  = queueName;
     _entityPath = queueName;
 }
Example #19
0
 public StringToServiceBusEntityConverter(ServiceBusAccount account, IBindableServiceBusPath defaultPath)
 {
     _account     = account;
     _defaultPath = defaultPath;
 }
Example #20
0
 public ServiceBusTriggerBinding(string parameterName,
                                 ITriggerDataArgumentBinding <BrokeredMessage> argumentBinding, ServiceBusAccount account, string topicName,
                                 string subscriptionName)
 {
     _parameterName    = parameterName;
     _argumentBinding  = argumentBinding;
     _account          = account;
     _namespaceName    = ServiceBusClient.GetNamespaceName(account);
     _topicName        = topicName;
     _subscriptionName = subscriptionName;
     _entityPath       = SubscriptionClient.FormatSubscriptionPath(topicName, subscriptionName);
 }
Example #21
0
 public ServiceBusTriggerBinding(string parameterName, Type parameterType,
                                 ITriggerDataArgumentBinding <BrokeredMessage> argumentBinding, ServiceBusAccount account, string queueName)
 {
     _parameterName   = parameterName;
     _converter       = CreateConverter(parameterType);
     _argumentBinding = argumentBinding;
     _account         = account;
     _namespaceName   = ServiceBusClient.GetNamespaceName(account);
     _queueName       = queueName;
     _entityPath      = queueName;
 }
Example #22
0
 public StringToServiceBusEntityConverter(ServiceBusAccount account, IBindableServiceBusPath defaultPath, AccessRights accessRights)
 {
     _account      = account;
     _defaultPath  = defaultPath;
     _accessRights = accessRights;
 }
 private static IAsyncObjectToTypeConverter<ServiceBusEntity> CreateConverter(ServiceBusAccount account, IBindableServiceBusPath queueOrTopicName, AccessRights accessRights)
 {
     return new OutputConverter<string>(new StringToServiceBusEntityConverter(account, queueOrTopicName, accessRights));
 }
 public ServiceBusBinding(string parameterName, IArgumentBinding <ServiceBusEntity> argumentBinding, ServiceBusAccount account, IBindableServiceBusPath path, ServiceBusAttribute attr)
 {
     _parameterName   = parameterName;
     _argumentBinding = argumentBinding;
     _account         = account;
     _namespaceName   = ServiceBusClient.GetNamespaceName(account);
     _path            = path;
     _accessRights    = attr.Access;
     _entityType      = attr.EntityType;
     _converter       = new OutputConverter <string>(
         new StringToServiceBusEntityConverter(account, _path, _accessRights, _entityType));
 }
 public ServiceBusTriggerBinding(string parameterName, Type parameterType, ITriggerDataArgumentBinding <Message> argumentBinding, ServiceBusAccount account,
                                 ServiceBusOptions options, MessagingProvider messagingProvider, string topicName, string subscriptionName)
     : this(parameterName, parameterType, argumentBinding, account, options, messagingProvider)
 {
     _topicName        = topicName;
     _subscriptionName = subscriptionName;
     _entityPath       = EntityNameHelper.FormatSubscriptionPath(topicName, subscriptionName);
 }
 public ServiceBusTriggerBinding(string parameterName, Type parameterType, ITriggerDataArgumentBinding <Message> argumentBinding, ServiceBusAccount account,
                                 ServiceBusOptions options, MessagingProvider messagingProvider, string queueName)
     : this(parameterName, parameterType, argumentBinding, account, options, messagingProvider)
 {
     _queueName  = queueName;
     _entityPath = queueName;
 }
 public ServiceBusTriggerBinding(string parameterName, Type parameterType, ITriggerDataArgumentBinding <BrokeredMessage> argumentBinding, ServiceBusAccount account,
                                 AccessRights accessRights, ServiceBusConfiguration config, string topicName, string subscriptionName)
     : this(parameterName, parameterType, argumentBinding, account, accessRights, config)
 {
     _topicName        = topicName;
     _subscriptionName = subscriptionName;
     _entityPath       = SubscriptionClient.FormatSubscriptionPath(topicName, subscriptionName);
 }
 public ServiceBusSessionsListener(string entityPath, ServiceBusTriggerExecutor triggerExecutor, ServiceBusOptions config, ServiceBusAccount serviceBusAccount, SessionProvider sessionProvider)
 {
     _entityPath              = entityPath;
     _triggerExecutor         = triggerExecutor;
     _cancellationTokenSource = new CancellationTokenSource();
     _sessionProvider         = sessionProvider;
     _serviceBusAccount       = serviceBusAccount;
     _sessionProcessor        = sessionProvider.CreateSessionProcessor(entityPath, _serviceBusAccount.ConnectionString);
 }
Example #29
0
 private static IAsyncObjectToTypeConverter <ServiceBusEntity> CreateConverter(ServiceBusAccount account, IBindableServiceBusPath queueOrTopicName, AccessRights accessRights)
 {
     return(new OutputConverter <string>(new StringToServiceBusEntityConverter(account, queueOrTopicName, accessRights)));
 }
Example #30
0
 public ServiceBusBinding(string parameterName, IArgumentBinding <ServiceBusEntity> argumentBinding, ServiceBusAccount account, IBindableServiceBusPath path, AccessRights accessRights)
 {
     _parameterName   = parameterName;
     _argumentBinding = argumentBinding;
     _account         = account;
     _namespaceName   = ServiceBusClient.GetNamespaceName(account);
     _path            = path;
     _accessRights    = accessRights;
     _converter       = CreateConverter(account, path, accessRights);
 }
Example #31
0
 public ServiceBusTriggerBinding(string parameterName, Type parameterType, ITriggerDataArgumentBinding <Message> argumentBinding, ServiceBusAccount account,
                                 ServiceBusConfiguration config, string topicName, string subscriptionName)
     : this(parameterName, parameterType, argumentBinding, account, config)
 {
     _topicName        = topicName;
     _subscriptionName = subscriptionName;
     _entityPath       = EntityNameHelper.FormatSubscriptionPath(topicName, subscriptionName);
 }
 public StringToServiceBusEntityConverter(ServiceBusAccount account, IBindableServiceBusPath defaultPath, EntityType entityType)
 {
     _account     = account;
     _defaultPath = defaultPath;
     _entityType  = entityType;
 }
 public ServiceBusBinding(string parameterName, IArgumentBinding <ServiceBusEntity> argumentBinding, ServiceBusAccount account, IBindableServiceBusPath path, ServiceBusAttribute attr, MessagingProvider messagingProvider)
 {
     _parameterName     = parameterName;
     _argumentBinding   = argumentBinding;
     _account           = account;
     _path              = path;
     _entityType        = attr.EntityType;
     _messagingProvider = messagingProvider;
     _converter         = new OutputConverter <string>(new StringToServiceBusEntityConverter(account, _path, _entityType, _messagingProvider));
 }
 public ServiceBusListener(string entityPath, ServiceBusTriggerExecutor triggerExecutor, ServiceBusConfiguration config, ServiceBusAccount serviceBusAccount)
 {
     _entityPath              = entityPath;
     _triggerExecutor         = triggerExecutor;
     _cancellationTokenSource = new CancellationTokenSource();
     _messagingProvider       = config.MessagingProvider;
     _serviceBusAccount       = serviceBusAccount;
     _messageProcessor        = config.MessagingProvider.CreateMessageProcessor(entityPath, _serviceBusAccount.ConnectionString);
 }