async Task GetOperationState(UpdateConfigStatus.ConfigUpdate operationStatus, OperationState state, string operationId) { switch (operationStatus.State) { case UpdateConfigStatus.States.NotStarted: state.Status = "NotStarted"; break; case UpdateConfigStatus.States.CreatingAccounts: case UpdateConfigStatus.States.ImportingAccounts: case UpdateConfigStatus.States.PreServiceUpdate: state.Status = "InProgress"; break; case UpdateConfigStatus.States.UpdatingService: System.Diagnostics.Debug.Assert(!String.IsNullOrWhiteSpace(operationStatus.CloudServiceUpdateOperationId)); using (var serviceClient = await AzureService.GetServiceManagementClient(async () => await GetRdfeAccessToken())) { await ServiceUpdater.UpdateOperationStatus(serviceClient, operationStatus); if (operationStatus.State != UpdateConfigStatus.States.UpdatingService) { await GetOperationState(operationStatus, state, operationId); } else { state.Status = "InProgress"; } } break; case UpdateConfigStatus.States.Completed: state.Status = "Succeeded"; break; case UpdateConfigStatus.States.Failed: state.Status = "Failed"; break; } }
static async Task<AzureServiceManagementClient> GetServiceManagementClient(string subscriptionId, string serviceName, string refreshToken, UpdateConfigStatus.ConfigUpdate operationStatus) { Func<Task<string>> accessTokenFactory = async () => { var accessToken = await DelegationToken.GetAccessTokenFromRefreshToken(refreshToken); if (accessToken == null) { await operationStatus.UpdateStatus(UpdateConfigStatus.States.Failed, "Failed acquiring access token to perform service management operation"); return String.Empty; } return accessToken.AccessToken; }; return await AzureService.GetServiceManagementClient(subscriptionId, serviceName, accessTokenFactory); }
public static async Task<bool> UpdateOperationStatus(AzureServiceManagementClient serviceClient, UpdateConfigStatus.ConfigUpdate operationStatus) { var response = await serviceClient.GetOperationStatus(operationStatus.CloudServiceUpdateOperationId); switch (response.Status) { case Microsoft.WindowsAzure.OperationStatus.InProgress: break; case Microsoft.WindowsAzure.OperationStatus.Failed: if (operationStatus.EndTime == DateTime.MinValue) { operationStatus.EndTime = DateTime.UtcNow; } await operationStatus.UpdateStatus(UpdateConfigStatus.States.Failed, String.Format("Azure service managment failure. {0}:{1}", response.Error.Code, response.Error.Message)); break; case Microsoft.WindowsAzure.OperationStatus.Succeeded: if (operationStatus.EndTime == DateTime.MinValue) { operationStatus.EndTime = DateTime.UtcNow; } await operationStatus.UpdateStatus(UpdateConfigStatus.States.Completed, "Operation completed successfully"); break; } return response.Status == Microsoft.WindowsAzure.OperationStatus.InProgress; }