private static DataFactoryManagementClient GetDataFactoryClient(DataFactoryClientConfiguration configuration)
        {
            var context          = new AuthenticationContext($"https://login.windows.net/{configuration.TenantId}");
            var clientCredential = new ClientCredential(configuration.ClientId, configuration.ClientSecret);
            var result           = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).Result;
            ServiceClientCredentials credentials = new TokenCredentials(result.AccessToken);

            return(new DataFactoryManagementClient(credentials)
            {
                SubscriptionId = configuration.SubscriptionId
            });
        }
        private static bool TriggerDataFactoryReleasePipeline(DataFactoryClientConfiguration configuration,
                                                              ILogger logger, PublishReleaseDataMessage message)
        {
            var parameters = BuildPipelineParameters(message);
            var client     = GetDataFactoryClient(configuration);

            var runResponse = client.Pipelines.CreateRunWithHttpMessagesAsync(configuration.ResourceGroupName,
                                                                              configuration.DataFactoryName, configuration.PipelineName, parameters: parameters).Result;

            logger.LogInformation(
                $"Pipeline status code: {runResponse.Response.StatusCode}, run Id: {runResponse.Body.RunId}");

            return(runResponse.Response.IsSuccessStatusCode);
        }
Ejemplo n.º 3
0
        public async Task PublishReleaseData(
            [QueueTrigger(PublishReleaseDataQueue)]
            PublishReleaseDataMessage message,
            ExecutionContext executionContext,
            ILogger logger)
        {
            logger.LogInformation("{0} triggered: {1}",
                                  executionContext.FunctionName,
                                  message);

            try
            {
                // Azure Data Factory isn't emulated for running in a local environment
                // It also has an overhead to run which isn't necessary if there are no data files
                var runDataFactory = !EnvironmentUtils.IsLocalEnvironment() &&
                                     await ReleaseHasAnyDataFiles(message.ReleaseId);

                if (runDataFactory)
                {
                    var clientConfiguration = new DataFactoryClientConfiguration(_configuration);
                    var success             = TriggerDataFactoryReleasePipeline(clientConfiguration, logger, message);
                    await UpdateStage(message, success?Started : Failed);
                }
                else
                {
                    await SimulateDataFactoryReleasePipeline(message);
                    await UpdateStage(message, Complete);
                }
            }
            catch (Exception e)
            {
                logger.LogError(e, "Exception occured while executing {0}",
                                executionContext.FunctionName);
                await UpdateStage(message, Failed,
                                  new ReleasePublishingStatusLogMessage($"Exception in data stage: {e.Message}"));
            }

            logger.LogInformation("{0} completed",
                                  executionContext.FunctionName);
        }
        // ReSharper disable once UnusedMember.Global
        public async Task PublishReleaseData(
            [QueueTrigger(PublishReleaseDataQueue)] PublishReleaseDataMessage message,
            ExecutionContext executionContext,
            ILogger logger)
        {
            logger.LogInformation($"{executionContext.FunctionName} triggered: {message}");

            if (PublisherUtils.IsDevelopment())
            {
                // Skip the ADF Pipeline if running locally
                // If the Release is immediate then trigger publishing the content
                // This usually happens when the ADF Pipeline is complete
                if (await _releaseStatusService.IsImmediate(message.ReleaseId, message.ReleaseStatusId))
                {
                    await _queueService.QueuePublishReleaseContentMessageAsync(message.ReleaseId,
                                                                               message.ReleaseStatusId);
                }

                await UpdateStage(message, Complete);
            }
            else
            {
                try
                {
                    var clientConfiguration = new DataFactoryClientConfiguration(_configuration);
                    var success             = TriggerDataFactoryReleasePipeline(clientConfiguration, logger, message);
                    await UpdateStage(message, success?Started : Failed);
                }
                catch (Exception e)
                {
                    logger.LogError(e, $"Exception occured while executing {executionContext.FunctionName}");
                    await UpdateStage(message, Failed,
                                      new ReleaseStatusLogMessage($"Exception in data stage: {e.Message}"));
                }
            }

            logger.LogInformation($"{executionContext.FunctionName} completed");
        }