1
0

Orchestrator.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using Microsoft.Azure.WebJobs;
  2. using Microsoft.Azure.WebJobs.Extensions.DurableTask;
  3. using Microsoft.Extensions.Logging;
  4. using Newtonsoft.Json;
  5. using System;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using static ADPControl.HttpSurface;
  9. namespace ADPControl
  10. {
  11. public static class Orchestrator
  12. {
  13. // The Import Orchestrator
  14. [FunctionName(nameof(RunImportOrchestrator))]
  15. public static async Task RunImportOrchestrator(
  16. [OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
  17. {
  18. log.LogInformation("RunImportOrchestrator: entering");
  19. try {
  20. ImportRequest importRequest = context.GetInput<ImportRequest>();
  21. // Deploy the ARM template to Create empty SQL resource
  22. string deploymentName = await context.CallActivityAsync<string>(nameof(AzureResourceManagerActivity.BeginDeployArmTemplateForImport), importRequest);
  23. while (true)
  24. {
  25. log.LogInformation("RunImportOrchestrator: starting ARM deployment");
  26. string status = await context.CallActivityAsync<string>(nameof(AzureResourceManagerActivity.GetArmDeploymentForImport), (importRequest.SubscriptionId, importRequest.TargetSqlServerResourceGroupName, deploymentName));
  27. if (status == "Succeeded")
  28. {
  29. log.LogInformation("RunImportOrchestrator: ARM deployment succeeded");
  30. break;
  31. }
  32. else if (status == "Failed")
  33. {
  34. log.LogInformation("RunImportOrchestrator: ARM deployment failed");
  35. throw new Exception("Failed ARM Deployment");
  36. }
  37. // Orchestration sleeps until this time.
  38. var nextCheck = context.CurrentUtcDateTime.AddSeconds(10);
  39. if (!context.IsReplaying) { log.LogInformation($"RunImportOrchestrator: Replaying ARM deployment, next check at {nextCheck}."); }
  40. await context.CreateTimer(nextCheck, CancellationToken.None);
  41. }
  42. log.LogInformation("RunImportOrchestrator: Enumerating databases");
  43. var databases = await context.CallActivityAsync<dynamic>(nameof(AzureResourceManagerActivity.GetArmTemplateForImportSkipParameterization), importRequest);
  44. // Create BatchPool And Job
  45. log.LogInformation("RunImportOrchestrator: Creating batch pool and import job");
  46. string jobId = await context.CallActivityAsync<string>(nameof(BatchActivity.CreateBatchPoolAndImportJob), importRequest);
  47. string containerUrl = await context.CallActivityAsync<string>(nameof(StorageActivity.GettingJobContainerUrl), (importRequest.SubscriptionId, importRequest.ResourceGroupName, importRequest.StorageAccountName, importRequest.ContainerName));
  48. log.LogInformation("RunImportOrchestrator: Creating import database tasks");
  49. BatchActivity.CreateBatchTasks("Import", jobId, containerUrl, importRequest.BatchAccountUrl, importRequest.TargetSqlServerName, importRequest.TargetAccessToken, databases, log);
  50. // create output values
  51. Tuple<string, string>[] outputValues = {
  52. Tuple.Create("Orchestration progress:", "Complete"),
  53. Tuple.Create("deploymentName", deploymentName),
  54. Tuple.Create("jobId", jobId),
  55. Tuple.Create("containerUrl", containerUrl)
  56. };
  57. context.SetOutput(outputValues);
  58. }
  59. finally {
  60. log.LogInformation("RunImportOrchestrator: exiting");
  61. }
  62. }
  63. // The Export Orchestrator
  64. [FunctionName(nameof(RunExportOrchestrator))]
  65. public static async Task RunExportOrchestrator(
  66. [OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
  67. {
  68. ExportRequest exportRequest = context.GetInput<ExportRequest>();
  69. // Getting the ARM template Skip ResourceName Parameterization.
  70. var databases = await context.CallActivityAsync<dynamic>(nameof(AzureResourceManagerActivity.GetArmTemplateForExportSkipParameterization), exportRequest);
  71. // Getting the ARM template.
  72. dynamic Template = await context.CallActivityAsync<dynamic>(nameof(AzureResourceManagerActivity.GetArmTemplateForExport), exportRequest);
  73. string json = JsonConvert.SerializeObject(Template);
  74. // Create BatchPool And Job
  75. string jobId = await context.CallActivityAsync<string>(nameof(BatchActivity.CreateBatchPoolAndExportJob), exportRequest);
  76. string containerUrl = await context.CallActivityAsync<string>(nameof(StorageActivity.GettingJobContainerUrl), (exportRequest.SubscriptionId, exportRequest.ResourceGroupName, exportRequest.StorageAccountName, jobId));
  77. await context.CallActivityAsync<string>(nameof(StorageActivity.UploadingArmTemplate), (containerUrl, json));
  78. BatchActivity.CreateBatchTasks("Export", jobId, containerUrl, exportRequest.BatchAccountUrl, exportRequest.SourceSqlServerName, exportRequest.AccessToken, databases, log);
  79. // create output values
  80. Tuple<string, string>[] outputValues = {
  81. Tuple.Create("jobId", jobId),
  82. Tuple.Create("containerUrl", containerUrl)
  83. };
  84. context.SetOutput(outputValues);
  85. }
  86. }
  87. }