private async Task <Operation> WaitForLongRunningOperation(Guid operationId, int interavalInSec = 5, int maxTimeInSeconds = 60, CancellationToken cancellationToken = default(CancellationToken)) { OperationsHttpClient operationsClient = RestConnection.GetClient <OperationsHttpClient>(); DateTime expiration = DateTime.Now.AddSeconds(maxTimeInSeconds); int checkCount = 0; while (true) { Logger.Log(LogLevel.Info, $" Checking status ({checkCount++})... "); Operation operation = await operationsClient.GetOperation(operationId, cancellationToken); if (!operation.Completed) { Logger.Log(LogLevel.Info, $" Pausing {interavalInSec} seconds..."); await Task.Delay(interavalInSec * 1000); if (DateTime.Now > expiration) { Logger.Log(LogLevel.Error, $"Operation did not complete in {maxTimeInSeconds} seconds."); } } else { return(operation); } } }
internal async Task <TeamProject> GetOrCreateProjectAsync() { ProjectHttpClient projectClient = RestConnection.GetClient <ProjectHttpClient>(); Logger.Log(LogLevel.Info, "Retreiving project info from Azure DevOps/TFS..."); TeamProject project = null; try { project = await projectClient.GetProject(Settings.Project); } catch (Exception ex) { Logger.Log(ex, $"Failed to get Azure DevOps/TFS project '{Settings.Project}'."); } if (project == null) { project = await CreateProject(Settings.Project, $"{Settings.ProcessTemplate} project for Jira migration", Settings.ProcessTemplate); } return(project); }
internal async Task <TeamProject> CreateProject(string projectName, string projectDescription = "", string processName = "Scrum") { Logger.Log(LogLevel.Warning, $"Project '{projectName}' does not exist."); Console.WriteLine("Would you like to create one? (Y/N)"); var answer = Console.ReadKey(); if (answer.KeyChar != 'Y' && answer.KeyChar != 'y') { return(null); } Logger.Log(LogLevel.Info, $"Creating project '{projectName}'."); // Setup version control properties Dictionary <string, string> versionControlProperties = new Dictionary <string, string> { [TeamProjectCapabilitiesConstants.VersionControlCapabilityAttributeName] = SourceControlTypes.Git.ToString() }; // Setup process properties ProcessHttpClient processClient = RestConnection.GetClient <ProcessHttpClient>(); Guid processId = processClient.GetProcessesAsync().Result.Find(process => { return(process.Name.Equals(processName, StringComparison.InvariantCultureIgnoreCase)); }).Id; Dictionary <string, string> processProperaties = new Dictionary <string, string> { [TeamProjectCapabilitiesConstants.ProcessTemplateCapabilityTemplateTypeIdAttributeName] = processId.ToString() }; // Construct capabilities dictionary Dictionary <string, Dictionary <string, string> > capabilities = new Dictionary <string, Dictionary <string, string> > { [TeamProjectCapabilitiesConstants.VersionControlCapabilityName] = versionControlProperties, [TeamProjectCapabilitiesConstants.ProcessTemplateCapabilityName] = processProperaties }; // Construct object containing properties needed for creating the project TeamProject projectCreateParameters = new TeamProject() { Name = projectName, Description = projectDescription, Capabilities = capabilities }; // Get a client ProjectHttpClient projectClient = RestConnection.GetClient <ProjectHttpClient>(); TeamProject project = null; try { Logger.Log(LogLevel.Info, "Queuing project creation..."); // Queue the project creation operation // This returns an operation object that can be used to check the status of the creation OperationReference operation = await projectClient.QueueCreateProject(projectCreateParameters); // Check the operation status every 5 seconds (for up to 30 seconds) Operation completedOperation = WaitForLongRunningOperation(operation.Id, 5, 30).Result; // Check if the operation succeeded (the project was created) or failed if (completedOperation.Status == OperationStatus.Succeeded) { // Get the full details about the newly created project project = projectClient.GetProject( projectCreateParameters.Name, includeCapabilities: true, includeHistory: true).Result; Logger.Log(LogLevel.Info, $"Project created (ID: {project.Id})"); } else { Logger.Log(LogLevel.Error, "Project creation operation failed: " + completedOperation.ResultMessage); } } catch (Exception ex) { Logger.Log(ex, "Exception during create project.", LogLevel.Critical); } return(project); }