private bool ConfirmDeployment(Recommendation recommendation) { var message = recommendation.Recipe.DeploymentConfirmation?.DefaultMessage; if (string.IsNullOrEmpty(message)) { return(true); } var result = _consoleUtilities.AskYesNoQuestion(message); return(result == YesNo.Yes); }
public Task <object> Execute(Recommendation recommendation, OptionSettingItem optionSetting) { var answer = _consoleUtilities.AskYesNoQuestion(string.Empty, recommendation.GetOptionSettingValue <string>(optionSetting)); recommendation.DeploymentBundle.DotnetPublishSelfContainedBuild = answer == YesNo.Yes; var result = answer == YesNo.Yes ? "true" : "false"; return(Task.FromResult <object>(result)); }
public async Task <object> Execute(Recommendation recommendation, OptionSettingItem optionSetting) { var currentValue = recommendation.GetOptionSettingValue(optionSetting); var keyPairs = await _awsResourceQueryer.ListOfEC2KeyPairs(); var userInputConfiguration = new UserInputConfiguration <KeyPairInfo>( kp => kp.KeyName, kp => kp.KeyName.Equals(currentValue) ) { AskNewName = true, EmptyOption = true, CurrentValue = currentValue }; var settingValue = ""; while (true) { var userResponse = _consoleUtilities.AskUserToChooseOrCreateNew(keyPairs, "Select key pair to use:", userInputConfiguration); if (userResponse.IsEmpty) { settingValue = ""; break; } else { settingValue = userResponse.SelectedOption?.KeyName ?? userResponse.NewName ?? throw new UserPromptForNameReturnedNullException("The user prompt for a new EC2 Key Pair name was null or empty."); } if (userResponse.CreateNew && !string.IsNullOrEmpty(userResponse.NewName)) { _toolInteractiveService.WriteLine(string.Empty); _toolInteractiveService.WriteLine("You have chosen to create a new key pair."); _toolInteractiveService.WriteLine("You are required to specify a directory to save the key pair private key."); var answer = _consoleUtilities.AskYesNoQuestion("Do you want to continue?", "false"); if (answer == YesNo.No) { continue; } _toolInteractiveService.WriteLine(string.Empty); _toolInteractiveService.WriteLine($"A new key pair will be created with the name {settingValue}."); var keyPairDirectory = _consoleUtilities.AskForEC2KeyPairSaveDirectory(recommendation.ProjectPath); await _awsResourceQueryer.CreateEC2KeyPair(settingValue, keyPairDirectory); } break; } return(settingValue ?? ""); }
/// <summary> /// This method takes a user specified directory path and generates the CDK deployment project at this location. /// If the provided directory path is an empty string, then a default directory is created to save the CDK deployment project. /// </summary> /// <param name="saveCdkDirectoryPath">An absolute or a relative path provided by the user.</param> /// <param name="projectDisplayName">The name of the deployment project that will be displayed in the list of available deployment options.</param> /// <returns></returns> public async Task ExecuteAsync(string saveCdkDirectoryPath, string projectDisplayName) { var orchestrator = new Orchestrator(_session, new[] { RecipeLocator.FindRecipeDefinitionsPath() }); var recommendations = await GenerateRecommendationsToSaveDeploymentProject(orchestrator); var selectedRecommendation = _consoleUtilities.AskToChooseRecommendation(recommendations); if (string.IsNullOrEmpty(saveCdkDirectoryPath)) { saveCdkDirectoryPath = GenerateDefaultSaveDirectoryPath(); } var newDirectoryCreated = CreateSaveCdkDirectory(saveCdkDirectoryPath); var(isValid, errorMessage) = ValidateSaveCdkDirectory(saveCdkDirectoryPath); if (!isValid) { if (newDirectoryCreated) { _directoryManager.Delete(saveCdkDirectoryPath); } errorMessage = $"Failed to generate deployment project.{Environment.NewLine}{errorMessage}"; throw new InvalidSaveDirectoryForCdkProject(errorMessage.Trim()); } var directoryUnderSourceControl = await IsDirectoryUnderSourceControl(saveCdkDirectoryPath); if (!directoryUnderSourceControl) { var userPrompt = "Warning: The target directory is not being tracked by source control. If the saved deployment " + "project is used for deployment it is important that the deployment project is retained to allow " + "future redeployments to previously deployed applications. " + Environment.NewLine + Environment.NewLine + "Do you still want to continue?"; _toolInteractiveService.WriteLine(); var yesNoResult = _consoleUtilities.AskYesNoQuestion(userPrompt, YesNo.Yes); if (yesNoResult == YesNo.No) { if (newDirectoryCreated) { _directoryManager.Delete(saveCdkDirectoryPath); } return; } } _cdkProjectHandler.CreateCdkProject(selectedRecommendation, _session, saveCdkDirectoryPath); await GenerateDeploymentRecipeSnapShot(selectedRecommendation, saveCdkDirectoryPath, projectDisplayName); var saveCdkDirectoryFullPath = _directoryManager.GetDirectoryInfo(saveCdkDirectoryPath).FullName; _toolInteractiveService.WriteLine(); _toolInteractiveService.WriteLine($"The CDK deployment project is saved at: {saveCdkDirectoryFullPath}"); await _deploymentManifestEngine.UpdateDeploymentManifestFile(saveCdkDirectoryFullPath, _targetApplicationFullPath); }
/// <summary> /// Deletes given CloudFormation stack /// </summary> /// <param name="stackName">The stack name to be deleted</param> /// <exception cref="FailedToDeleteException">Thrown when deletion fails</exception> public async Task ExecuteAsync(string stackName) { var canDelete = await CanDeleteAsync(stackName); if (!canDelete) { return; } var confirmDelete = _consoleUtilities.AskYesNoQuestion($"Are you sure you want to delete {stackName}?", YesNo.No); if (confirmDelete == YesNo.No) { return; } _interactiveService.WriteLine($"{stackName}: deleting..."); var monitor = new StackEventMonitor(stackName, _awsClientFactory, _consoleUtilities); try { await _cloudFormationClient.DeleteStackAsync(new DeleteStackRequest { StackName = stackName }); // Fire and forget the monitor // Monitor updates the stdout with current status of the CloudFormation stack var _ = monitor.StartAsync(); await WaitForStackDelete(stackName); if (_session != null) { await _localUserSettingsEngine.DeleteLastDeployedStack(stackName, _session.ProjectDefinition.ProjectName, _session.AWSAccountId, _session.AWSRegion); } _interactiveService.WriteLine($"{stackName}: deleted"); } finally { // Stop monitoring CloudFormation stack status once the deletion operation finishes monitor.Stop(); } }