private IListener CreateQueueMessageToTriggerExecutionListener(
            ISharedContextProvider sharedContextProvider,
            SharedQueueWatcher sharedQueueWatcher,
            IStorageQueueClient queueClient,
            IStorageQueue hostBlobTriggerQueue,
            IStorageBlobClient blobClient,
            IBlobWrittenWatcher blobWrittenWatcher)
        {
            SharedBlobQueueListener sharedListener = sharedContextProvider.GetOrCreate <SharedBlobQueueListener>(
                new SharedBlobQueueListenerFactory(sharedQueueWatcher, queueClient, hostBlobTriggerQueue,
                                                   blobClient, _queueConfiguration, _backgroundExceptionDispatcher, _log, blobWrittenWatcher));

            sharedListener.Register(_functionId, _executor);

            return(new BlobListener(sharedListener));
        }
        public static async Task<WatchableCloudBlobStream> BindStreamAsync(IStorageBlob blob,
            ValueBindingContext context, IBlobWrittenWatcher blobWrittenWatcher)
        {
            IStorageBlockBlob blockBlob = blob as IStorageBlockBlob;

            if (blockBlob == null)
            {
                throw new InvalidOperationException("Cannot bind a page blob using an out string.");
            }

            BlobCausalityManager.SetWriter(blob.Metadata, context.FunctionInstanceId);

            CloudBlobStream rawStream = await blockBlob.OpenWriteAsync(context.CancellationToken);
            IBlobCommitedAction committedAction = new BlobCommittedAction(blob, blobWrittenWatcher);
            return new WatchableCloudBlobStream(rawStream, committedAction);
        }
 public SharedBlobQueueListenerFactory(
     IStorageAccount hostAccount,
     SharedQueueWatcher sharedQueueWatcher,
     IStorageQueue hostBlobTriggerQueue,
     IQueueConfiguration queueConfiguration,
     IWebJobsExceptionHandler exceptionHandler,
     ILoggerFactory loggerFactory,
     IBlobWrittenWatcher blobWrittenWatcher)
 {
     _hostAccount          = hostAccount ?? throw new ArgumentNullException(nameof(hostAccount));
     _sharedQueueWatcher   = sharedQueueWatcher ?? throw new ArgumentNullException(nameof(sharedQueueWatcher));
     _hostBlobTriggerQueue = hostBlobTriggerQueue ?? throw new ArgumentNullException(nameof(hostBlobTriggerQueue));
     _queueConfiguration   = queueConfiguration ?? throw new ArgumentNullException(nameof(queueConfiguration));
     _exceptionHandler     = exceptionHandler ?? throw new ArgumentNullException(nameof(exceptionHandler));
     _loggerFactory        = loggerFactory;
     _blobWrittenWatcher   = blobWrittenWatcher ?? throw new ArgumentNullException(nameof(blobWrittenWatcher));
 }
示例#4
0
 public SharedBlobQueueListenerFactory(
     StorageAccount hostAccount,
     SharedQueueWatcher sharedQueueWatcher,
     CloudQueue hostBlobTriggerQueue,
     QueuesOptions queueOptions,
     IWebJobsExceptionHandler exceptionHandler,
     ILoggerFactory loggerFactory,
     IBlobWrittenWatcher blobWrittenWatcher)
 {
     _hostAccount          = hostAccount ?? throw new ArgumentNullException(nameof(hostAccount));
     _sharedQueueWatcher   = sharedQueueWatcher ?? throw new ArgumentNullException(nameof(sharedQueueWatcher));
     _hostBlobTriggerQueue = hostBlobTriggerQueue ?? throw new ArgumentNullException(nameof(hostBlobTriggerQueue));
     _queueOptions         = queueOptions ?? throw new ArgumentNullException(nameof(queueOptions));
     _exceptionHandler     = exceptionHandler ?? throw new ArgumentNullException(nameof(exceptionHandler));
     _loggerFactory        = loggerFactory;
     _blobWrittenWatcher   = blobWrittenWatcher ?? throw new ArgumentNullException(nameof(blobWrittenWatcher));
 }
 public SharedBlobQueueListenerFactory(
     QueueServiceClient hostQueueServiceClient,
     SharedQueueWatcher sharedQueueWatcher,
     QueueClient hostBlobTriggerQueue,
     BlobsOptions blobsOptions,
     IWebJobsExceptionHandler exceptionHandler,
     ILoggerFactory loggerFactory,
     IBlobWrittenWatcher blobWrittenWatcher,
     FunctionDescriptor functionDescriptor)
 {
     _hostQueueServiceClient = hostQueueServiceClient ?? throw new ArgumentNullException(nameof(hostQueueServiceClient));
     _sharedQueueWatcher     = sharedQueueWatcher ?? throw new ArgumentNullException(nameof(sharedQueueWatcher));
     _hostBlobTriggerQueue   = hostBlobTriggerQueue ?? throw new ArgumentNullException(nameof(hostBlobTriggerQueue));
     _blobsOptions           = blobsOptions ?? throw new ArgumentNullException(nameof(blobsOptions));
     _exceptionHandler       = exceptionHandler ?? throw new ArgumentNullException(nameof(exceptionHandler));
     _loggerFactory          = loggerFactory;
     _blobWrittenWatcher     = blobWrittenWatcher ?? throw new ArgumentNullException(nameof(blobWrittenWatcher));
     _functionDescriptor     = functionDescriptor;
 }
        public void ExecuteAsync_IfBlobHasChanged_NotifiesWatcherAndReturnsSuccessResult()
        {
            // Arrange
            string                     functionId = "FunctionId";
            IBlobETagReader            eTagReader = CreateStubETagReader("NewETag");
            Mock <IBlobWrittenWatcher> mock       = new Mock <IBlobWrittenWatcher>(MockBehavior.Strict);

            mock.Setup(w => w.Notify(It.IsAny <IStorageBlob>()))
            .Verifiable();
            IBlobWrittenWatcher      blobWrittenWatcher = mock.Object;
            BlobQueueTriggerExecutor product            = CreateProductUnderTest(eTagReader, blobWrittenWatcher);

            product.Register(functionId, CreateDummyTriggeredFunctionExecutor());

            IStorageQueueMessage message = CreateMessage(functionId, "OriginalETag");

            // Act
            Task <FunctionResult> task = product.ExecuteAsync(message, CancellationToken.None);

            // Assert
            task.WaitUntilCompleted();
            mock.Verify();
            Assert.True(task.Result.Succeeded);
        }
 private static BlobQueueTriggerExecutor CreateProductUnderTest(IBlobETagReader eTagReader,
      IBlobCausalityReader causalityReader, IBlobWrittenWatcher blobWrittenWatcher)
 {
     IStorageBlobClient client = CreateClient();
     return new BlobQueueTriggerExecutor(client, eTagReader, causalityReader, blobWrittenWatcher);
 }
示例#8
0
        public static async Task <ICacheAwareWriteObject> BindStreamCacheAwareAsync(BlobWithContainer <BlobBaseClient> blob,
                                                                                    ValueBindingContext context, IBlobWrittenWatcher blobWrittenWatcher, IFunctionDataCache functionDataCache)
        {
            Stream blobStream = await BindStreamAsync(blob, context, blobWrittenWatcher).ConfigureAwait(false);

            return(new CacheableWriteBlob(blob, context.SharedMemoryMetadata, blobStream, functionDataCache));
        }
示例#9
0
 public BlobCommittedAction(ICloudBlob blob, IBlobWrittenWatcher blobWrittenWatcher)
 {
     _blob = blob;
     _blobWrittenWatcher = blobWrittenWatcher;
 }
示例#10
0
 public BlobCommittedAction(BlobWithContainer <BlobBaseClient> blob, IBlobWrittenWatcher blobWrittenWatcher)
 {
     _blob = blob;
     _blobWrittenWatcher = blobWrittenWatcher;
 }
 public BlobQueueTriggerExecutor(IBlobWrittenWatcher blobWrittenWatcher, ILogger <BlobListener> logger)
     : this(BlobCausalityReader.Instance, blobWrittenWatcher, logger)
 {
 }
 private static BlobQueueTriggerExecutor CreateProductUnderTest(IBlobETagReader eTagReader,
                                                                IBlobCausalityReader causalityReader, IBlobWrittenWatcher blobWrittenWatcher)
 {
     return(new BlobQueueTriggerExecutor(eTagReader, causalityReader, blobWrittenWatcher));
 }
 public BlobCommittedAction(IStorageBlob blob, IBlobWrittenWatcher blobWrittenWatcher)
 {
     _blob = blob;
     _blobWrittenWatcher = blobWrittenWatcher;
 }
        public static async Task <WatchableCloudBlobStream> BindStreamAsync(ICloudBlob blob,
                                                                            ValueBindingContext context, IBlobWrittenWatcher blobWrittenWatcher)
        {
            var blockBlob = blob as CloudBlockBlob;

            if (blockBlob == null)
            {
                throw new InvalidOperationException("Cannot bind to page or append blobs using 'out string', 'TextWriter', or writable 'Stream' parameters.");
            }

            BlobCausalityManager.SetWriter(blob.Metadata, context.FunctionInstanceId);

            CloudBlobStream rawStream = await blockBlob.OpenWriteAsync(context.CancellationToken);

            IBlobCommitedAction committedAction = new BlobCommittedAction(blob, blobWrittenWatcher);

            return(new WatchableCloudBlobStream(rawStream, committedAction));
        }
示例#15
0
 public BlobQueueTriggerExecutor(IStorageBlobClient client, IBlobWrittenWatcher blobWrittenWatcher)
     : this(client, BlobETagReader.Instance, BlobCausalityReader.Instance, blobWrittenWatcher)
 {
 }
 private BlobQueueTriggerExecutor CreateProductUnderTest(
     IBlobCausalityReader causalityReader, IBlobWrittenWatcher blobWrittenWatcher)
 {
     return(new BlobQueueTriggerExecutor(causalityReader, BlobTriggerSource.LogsAndContainerScan, blobWrittenWatcher, _logger));
 }
        private static BlobQueueTriggerExecutor CreateProductUnderTest(IBlobETagReader eTagReader,
                                                                       IBlobCausalityReader causalityReader, IBlobWrittenWatcher blobWrittenWatcher)
        {
            IStorageBlobClient client = CreateClient();

            return(new BlobQueueTriggerExecutor(client, eTagReader, causalityReader, blobWrittenWatcher));
        }
示例#18
0
 public BlobQueueTriggerExecutor(IBlobCausalityReader causalityReader, IBlobWrittenWatcher blobWrittenWatcher)
 {
     _causalityReader    = causalityReader;
     _blobWrittenWatcher = blobWrittenWatcher;
     _registrations      = new ConcurrentDictionary <string, BlobQueueRegistration>();
 }
        private IListener CreateQueueMessageToTriggerExecutionListener(
            ISharedContextProvider sharedContextProvider,
            SharedQueueWatcher sharedQueueWatcher,
            IStorageQueueClient queueClient,
            IStorageQueue hostBlobTriggerQueue,
            IStorageBlobClient blobClient,
            IBlobWrittenWatcher blobWrittenWatcher)
        {
            SharedBlobQueueListener sharedListener = sharedContextProvider.GetOrCreate<SharedBlobQueueListener>(
                new SharedBlobQueueListenerFactory(sharedQueueWatcher, queueClient, hostBlobTriggerQueue,
                    blobClient, _queueConfiguration, _backgroundExceptionDispatcher, _log, blobWrittenWatcher));

            sharedListener.Register(_functionId, _executor);

            return new BlobListener(sharedListener);
        }
        public static async Task <WatchableCloudBlobStream> BindStreamAsync(IStorageBlob blob,
                                                                            ValueBindingContext context, IBlobWrittenWatcher blobWrittenWatcher)
        {
            IStorageBlockBlob blockBlob = blob as IStorageBlockBlob;

            if (blockBlob == null)
            {
                throw new InvalidOperationException("Cannot bind a page blob using an out string.");
            }

            BlobCausalityManager.SetWriter(blob.Metadata, context.FunctionInstanceId);

            CloudBlobStream rawStream = await blockBlob.OpenWriteAsync(context.CancellationToken);

            IBlobCommitedAction committedAction = new BlobCommittedAction(blob, blobWrittenWatcher);

            return(new WatchableCloudBlobStream(rawStream, committedAction));
        }
 private static BlobQueueTriggerExecutor CreateProductUnderTest(IBlobETagReader eTagReader,
      IBlobCausalityReader causalityReader, IBlobWrittenWatcher blobWrittenWatcher)
 {
     return new BlobQueueTriggerExecutor(eTagReader, causalityReader, blobWrittenWatcher);
 }
示例#22
0
        private BlobQueueTriggerExecutor CreateProductUnderTest(IBlobWrittenWatcher blobWrittenWatcher)
        {
            IBlobCausalityReader causalityReader = CreateDummyCausalityReader();

            return(CreateProductUnderTest(causalityReader, blobWrittenWatcher));
        }
 public BlobQueueTriggerExecutor(IBlobWrittenWatcher blobWrittenWatcher)
     : this(BlobETagReader.Instance, BlobCausalityReader.Instance, blobWrittenWatcher)
 {
 }
示例#24
0
 public BlobQueueTriggerExecutor(IBlobCausalityReader causalityReader, BlobTriggerSource blobTriggerSource, IBlobWrittenWatcher blobWrittenWatcher, ILogger <BlobListener> logger)
 {
     _causalityReader    = causalityReader;
     _blobTriggerSource  = blobTriggerSource;
     _blobWrittenWatcher = blobWrittenWatcher;
     _registrations      = new ConcurrentDictionary <string, BlobQueueRegistration>();
     _logger             = logger ?? throw new ArgumentNullException(nameof(logger));
 }
        public SharedBlobQueueListenerFactory(IFunctionExecutor executor,
                                              SharedQueueWatcher sharedQueueWatcher,
                                              IStorageQueueClient queueClient,
                                              IStorageQueue hostBlobTriggerQueue,
                                              IStorageBlobClient blobClient,
                                              IQueueConfiguration queueConfiguration,
                                              IBackgroundExceptionDispatcher backgroundExceptionDispatcher,
                                              TextWriter log,
                                              IBlobWrittenWatcher blobWrittenWatcher)
        {
            if (executor == null)
            {
                throw new ArgumentNullException("executor");
            }

            if (sharedQueueWatcher == null)
            {
                throw new ArgumentNullException("sharedQueueWatcher");
            }

            if (queueClient == null)
            {
                throw new ArgumentNullException("queueClient");
            }

            if (hostBlobTriggerQueue == null)
            {
                throw new ArgumentNullException("hostBlobTriggerQueue");
            }

            if (blobClient == null)
            {
                throw new ArgumentNullException("blobClient");
            }

            if (queueConfiguration == null)
            {
                throw new ArgumentNullException("queueConfiguration");
            }

            if (backgroundExceptionDispatcher == null)
            {
                throw new ArgumentNullException("backgroundExceptionDispatcher");
            }

            if (log == null)
            {
                throw new ArgumentNullException("log");
            }

            if (blobWrittenWatcher == null)
            {
                throw new ArgumentNullException("blobWrittenWatcher");
            }

            _executor                      = executor;
            _sharedQueueWatcher            = sharedQueueWatcher;
            _queueClient                   = queueClient;
            _hostBlobTriggerQueue          = hostBlobTriggerQueue;
            _blobClient                    = blobClient;
            _queueConfiguration            = queueConfiguration;
            _backgroundExceptionDispatcher = backgroundExceptionDispatcher;
            _log = log;
            _blobWrittenWatcher = blobWrittenWatcher;
        }
示例#26
0
 public BlobCommittedAction(IStorageBlob blob, IBlobWrittenWatcher blobWrittenWatcher)
 {
     _blob = blob;
     _blobWrittenWatcher = blobWrittenWatcher;
 }
示例#27
0
 private BlobQueueTriggerExecutor CreateProductUnderTest(
     IBlobCausalityReader causalityReader, IBlobWrittenWatcher blobWrittenWatcher)
 {
     return(new BlobQueueTriggerExecutor(causalityReader, blobWrittenWatcher, _logger));
 }
示例#28
0
        public static async Task <NotifyingBlobStream> BindStreamAsync(BlobWithContainer <BlobBaseClient> blob,
                                                                       ValueBindingContext context, IBlobWrittenWatcher blobWrittenWatcher)
        {
            var blockBlob = blob.BlobClient as BlockBlobClient;

            if (blockBlob == null)
            {
                throw new InvalidOperationException("Cannot bind to page or append blobs using 'out string', 'TextWriter', or writable 'Stream' parameters.");
            }
            var            functionID = context.FunctionInstanceId;
            BlobProperties properties = await blockBlob.FetchPropertiesOrNullIfNotExistAsync().ConfigureAwait(false);

            Dictionary <string, string> metadata = new Dictionary <string, string>();

            if (properties != null && properties.Metadata != null)
            {
                metadata = new Dictionary <string, string>(properties.Metadata);
            }

            BlobCausalityManager.SetWriter(metadata, functionID);
            BlockBlobOpenWriteOptions options = new BlockBlobOpenWriteOptions()
            {
                Metadata = metadata,
            };
            Stream rawStream = await blockBlob.OpenWriteAsync(true, options).ConfigureAwait(false);

            IBlobCommitedAction committedAction = new BlobCommittedAction(blob, blobWrittenWatcher);

            return(await Task.FromResult(new NotifyingBlobStream(rawStream, committedAction)).ConfigureAwait(false));
        }