Example #1
0
            // This is a static validation (so only %% are resolved; not {} )
            // For runtime validation, the regular builder functions can do the resolution.
            private void ValidateQueueAttribute(QueueAttribute attribute, Type parameterType)
            {
                string queueName = NormalizeQueueName(attribute, null);

                // Queue pre-existing  behavior: if there are { }in the path, then defer validation until runtime.
                if (!queueName.Contains("{"))
                {
                    QueueClientExtensions.ValidateQueueName(queueName);
                }
            }
Example #2
0
            internal QueueClient GetQueue(QueueAttribute attrResolved)
            {
                var client = _queueServiceClientProvider.Get(attrResolved.Connection);

                string queueName = attrResolved.QueueName.ToLowerInvariant();

                QueueClientExtensions.ValidateQueueName(queueName);

                return(client.GetQueueClient(queueName));
            }
Example #3
0
        public void VerySimpleOfflineJob()
        {
            var repo = new JobRepository();

            repo.CreateTableIfNotExistsAsync().Wait();

            var logger = LoggerFactory.Create(config => config.AddDebug()).CreateLogger("testing");

            var job = QueueClientExtensions.SaveJobAsync(repo, "adamo", new OcrRequest()
            {
                BlobName = "whatever.pdf", ContainerName = "hello"
            }).Result;

            var processor = new SampleJobRunner(logger);

            processor.ExecuteAsync(job.Id).Wait();
        }
Example #4
0
        private void ZipBuilderInner(bool postUpdates)
        {
            // since this is testing a real job, I need to pass real connection strings from that project
            var dbConnection = Config["Values:ConnectionStrings:Database"];
            var repo         = new JobTrackerRepository(dbConnection);

            var logger = LoggerFactory.Create(config => config.AddDebug()).CreateLogger("testing");

            // I already have some blobs in this location in this account.
            // a more robust test would upload some files first rather than assume these
            var job = QueueClientExtensions.SaveJobAsync(repo, "adamo", new ZipRequest()
            {
                ContainerName = "sample-uploads",
                BlobPrefix    = "anonUser"
            }).Result;

            var storageConnection = Config["Values:ConnectionStrings:Storage"];

            var function = new ZipFileBuilder(storageConnection, (id) => $"https://localhost:44377/JobUpdated/{id}", repo, logger)
            {
                PostStatusUpdates = postUpdates
            };
            var result = function.ExecuteAsync(job.Id).Result;

            // verify the download works
            var response = _client.GetAsync(result.Url).Result;

            response.EnsureSuccessStatusCode();

            // and is a valid zip file
            var tempFile = Path.Combine(Path.GetTempPath(), Path.GetTempFileName() + ".zip");

            using (var downloadFile = File.Create(tempFile))
            {
                response.Content.CopyToAsync(downloadFile).Wait();
            }

            using (var zipFile = ZipFile.OpenRead(tempFile))
            {
                Assert.IsTrue(zipFile.Entries.Any());
            }

            File.Delete(tempFile);
        }
        // https://codehollow.com/2017/02/azure-functions-time-trigger-cron-cheat-sheet/
        public static async Task RunAsync([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log, ExecutionContext context)
        {
            config = Configuration.InitializeConfiguration(config, context);
            KeyVaultExtensions.InitializeConfiguration(config);
            keyVaultClient = KeyVaultExtensions.GetInstance();

            var tableStorageAccountConnectionString = await KeyVaultExtensions.GetSecretAsync(Constants.KeyVaultConstants.AzureWebjobsStorageKey);

            cloudTableClient = CloudTableClientExtensions.InitializeCloudTableClientAsync(cloudTableClient, tableStorageAccountConnectionString);

            var queueConnectionString = await KeyVaultExtensions.GetSecretAsync(Constants.KeyVaultConstants.ServiceBusConnectionString);

            queueClient = QueueClientExtensions.InitializeQueueClient(queueClient, queueConnectionString, "participants");

            uint.TryParse(config["CascadiaGamersGroupId"], out var extraLifeGroupId);

            log.LogInformation($"Getting gamers: {DateTime.Now}");
            var donorDriveClient = new DonorDriveClient();
            var gamers           = new List <ParticipantDto>(); //AutoMapper.Mapper.Map<List<ParticipantDto>>(await donorDriveClient.GetTeamParticipantsAsync(extraLifeGroupId));

            log.LogInformation($"Retrieved: {gamers.Count()} gamers.");

            var participants = AutoMapper.Mapper.Map <List <ParticipantTableEntity> >(gamers);

            await TableStorageExtensions <ParticipantTableEntity> .WriteToTableStorageAsync(cloudTableClient, participants,
                                                                                            "CascadiaGamersParticipants");

            log.LogInformation($"Wrote to Table Storage values for: {gamers.Count()} participants.");

            await QueueExtensions <ParticipantTableEntity> .WriteToQueueAsync(queueClient, participants,
                                                                              "parcicipants");

            log.LogInformation($"Wrote {gamers.Count()} participants to Service Bus to check for new donations.");

            log.LogInformation($"Writing to Sql Server values for: {gamers.Count()} participants.");

            var sqlConnectionString = await KeyVaultExtensions.GetSecretAsync(Constants.KeyVaultConstants.SqlConnectionString);

            await SqlExtensions <ParticipantTableEntity> .WriteParticipantsToSqlAsync(participants, sqlConnectionString);

            log.LogInformation($"Wrote to Sql Server values for: {gamers.Count()} participants.");
        }
Example #6
0
        private static QueueClient CreatePoisonQueueReference(QueueServiceClient client, string name)
        {
            Debug.Assert(client != null);

            // Only use a corresponding poison queue if:
            // 1. The poison queue name would be valid (adding "-poison" doesn't make the name too long), and
            // 2. The queue itself isn't already a poison queue.

            if (name == null || name.EndsWith(poisonQueueSuffix, StringComparison.Ordinal))
            {
                return(null);
            }

            string possiblePoisonQueueName = name + poisonQueueSuffix;

            if (!QueueClientExtensions.IsValidQueueName(possiblePoisonQueueName))
            {
                return(null);
            }

            return(client.GetQueueClient(possiblePoisonQueueName));
        }
Example #7
0
 private static string NormalizeAndValidate(string queueName)
 {
     queueName = queueName.ToLowerInvariant(); // must be lowercase. coerce here to be nice.
     QueueClientExtensions.ValidateQueueName(queueName);
     return(queueName);
 }
Example #8
0
        public static async Task RunAsync(
            [ServiceBusTrigger("participants", Connection = "AzureWebJobsServiceBus")]
            ParticipantTableEntity myQueueItem,
            ILogger log,
            ExecutionContext context)
        {
            config = Configuration.InitializeConfiguration(config, context);
            KeyVaultExtensions.InitializeConfiguration(config);
            keyVaultClient = KeyVaultExtensions.GetInstance();
            logging        = log;

            var tableStorageAccountConnectionString = await KeyVaultExtensions.GetSecretAsync(Constants.KeyVaultConstants.AzureWebjobsStorageKey);

            cloudTableClient = CloudTableClientExtensions.InitializeCloudTableClientAsync(cloudTableClient, tableStorageAccountConnectionString);

            logging.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem.DisplayName}");

            var table = cloudTableClient.GetTableReference("CascadiaGamersParticipants");
            var query = new TableQuery <ParticipantTableEntity>().Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, myQueueItem.RowKey));;

            Guid.TryParse(myQueueItem.RowKey, out var participantId);
            if (!participants.ContainsKey(participantId))
            {
                await AddParticipantToCacheAsync(table, query);
            }

            table = cloudTableClient.GetTableReference("CascadiaGamersDonations");
            var donationQuery = new TableQuery <DonationTableEntity>()
                                .Where(TableQuery.GenerateFilterCondition("ParticipantId", QueryComparisons.Equal, myQueueItem.ParticipantId.ToString()));

            await AddDonationToCacheAsync(table, donationQuery, participants[participantId]);

            logging.LogInformation($"Getting donations for {myQueueItem.DisplayName} at: {DateTime.Now}");
            var donorDriveClient = new DonorDriveClient();
            var donations        = await donorDriveClient.GetDonorParticipantsAsync(uint.Parse(myQueueItem.ParticipantId));

            logging.LogInformation($"Retrieved {donations.Count()} donations for {myQueueItem.DisplayName} at: {DateTime.Now}");

            var participantDto = participants[participantId];
            var newDonations   = new List <Donor>();

            foreach (var donation in donations)
            {
                var donationid = participantDto.CreateGuidFromSHA256Hash(donation);
                if (!participantDto.Donations.ContainsKey(donationid))
                {
                    participantDto.Donations.Add(donationid, donation);
                    newDonations.Add(donation);
                }
            }

            var donationsForTableStorage = AutoMapper.Mapper.Map <List <DonationTableEntity> >(donations);

            donationsForTableStorage.Select(
                d =>
                { d.ParticipantUniqueIdentifier = participantDto.CreateGuidFromSHA256Hash().ToString(); return(d); }
                ).ToList();

            logging.LogInformation($"Updating or Inserting {donationsForTableStorage.Count} donations for {myQueueItem.DisplayName} to Table Storage at: {DateTime.Now}");

            await TableStorageExtensions <DonationTableEntity> .WriteToTableStorageAsync(cloudTableClient, donationsForTableStorage,
                                                                                         "CascadiaGamersDonations");

            logging.LogInformation($"Updating or Inserting {donationsForTableStorage.Count} donations for {myQueueItem.DisplayName} to Sql Server at: {DateTime.Now}");
            var sqlConnectionString = await KeyVaultExtensions.GetSecretAsync(Constants.KeyVaultConstants.SqlConnectionString);

            await SqlExtensions <DonationTableEntity> .WriteDonationsToSqlAsync(donationsForTableStorage, sqlConnectionString);

            logging.LogInformation($"Completed upserting {donationsForTableStorage.Count} donations for {myQueueItem.DisplayName} to Sql Server at: {DateTime.Now}");

            if (newDonations.Count() > 0)
            {
                var donationsForNewDonationsQueue = AutoMapper.Mapper.Map <List <DonationTableEntity> >(newDonations);

                var queueConnectionString = await KeyVaultExtensions.GetSecretAsync(Constants.KeyVaultConstants.ServiceBusConnectionString);

                var queueName = "newdonations";
                queueClient = QueueClientExtensions.InitializeQueueClient(queueClient, queueConnectionString, queueName);
                logging.LogInformation($"Adding {donationsForNewDonationsQueue.Count} new donations for {myQueueItem.DisplayName} to Service Bus at: {DateTime.Now}");
                await QueueExtensions <DonationTableEntity> .WriteToQueueAsync(queueClient, donationsForNewDonationsQueue, queueName);
            }
        }