private async Task ConfigureDeployment(Recommendation recommendation, IEnumerable <OptionSettingItem> configurableOptionSettings, bool showAdvancedSettings) { _toolInteractiveService.WriteLine(string.Empty); while (true) { var message = "Current settings (select number to change its value)"; var title = message + Environment.NewLine + new string('-', message.Length); _toolInteractiveService.WriteLine(title); var optionSettings = configurableOptionSettings .Where(x => (!recommendation.IsExistingCloudApplication || x.Updatable) && (!x.AdvancedSetting || showAdvancedSettings) && recommendation.IsOptionSettingDisplayable(x)) .ToArray(); for (var i = 1; i <= optionSettings.Length; i++) { DisplayOptionSetting(recommendation, optionSettings[i - 1], i, optionSettings.Length, DisplayOptionSettingsMode.Editable); } _toolInteractiveService.WriteLine(); if (!showAdvancedSettings) { // Don't bother showing 'more' for advanced options if there aren't any advanced options. if (configurableOptionSettings.Any(x => x.AdvancedSetting)) { _toolInteractiveService.WriteLine("Enter 'more' to display Advanced settings. "); } } _toolInteractiveService.WriteLine("Or press 'Enter' to deploy:"); var input = _toolInteractiveService.ReadLine(); // advanced - break to main loop to reprint menu if (input.Trim().ToLower().Equals("more")) { showAdvancedSettings = true; _toolInteractiveService.WriteLine(); continue; } // deploy case, nothing more to configure if (string.IsNullOrEmpty(input)) { return; } // configure option setting if (int.TryParse(input, out var selectedNumber) && selectedNumber >= 1 && selectedNumber <= optionSettings.Length) { await ConfigureDeployment(recommendation, optionSettings[selectedNumber - 1]); } _toolInteractiveService.WriteLine(string.Empty); } }
private IEncryptionProvider CreateEncryptionProvider() { IEncryptionProvider encryptionProvider; if (_noEncryptionKeyInfo) { encryptionProvider = new NoEncryptionProvider(); } else { _interactiveService.WriteLine("Waiting on symmetric key from stdin"); var input = _interactiveService.ReadLine(); var keyInfo = EncryptionKeyInfo.ParseStdInKeyInfo(input); switch (keyInfo.Version) { case EncryptionKeyInfo.VERSION_1_0: var aes = Aes.Create(); if (keyInfo.Key != null) { aes.Key = Convert.FromBase64String(keyInfo.Key); } encryptionProvider = new AesEncryptionProvider(aes); break; case null: throw new InvalidEncryptionKeyInfoException("Missing required \"Version\" property in the symmetric key"); default: throw new InvalidEncryptionKeyInfoException($"Unsupported symmetric key {keyInfo.Version}"); } _interactiveService.WriteLine("Encryption provider enabled"); } return(encryptionProvider); }
private async Task ConfigureDeploymentFromCli(Recommendation recommendation, IEnumerable <OptionSettingItem> configurableOptionSettings, bool showAdvancedSettings) { _toolInteractiveService.WriteLine(string.Empty); while (true) { var message = "Current settings (select number to change its value)"; var title = message + Environment.NewLine + new string('-', message.Length); _toolInteractiveService.WriteLine(title); var optionSettings = configurableOptionSettings .Where(x => (!recommendation.IsExistingCloudApplication || x.Updatable) && (!x.AdvancedSetting || showAdvancedSettings) && recommendation.IsOptionSettingDisplayable(x)) .ToArray(); for (var i = 1; i <= optionSettings.Length; i++) { DisplayOptionSetting(recommendation, optionSettings[i - 1], i, optionSettings.Length, DisplayOptionSettingsMode.Editable); } _toolInteractiveService.WriteLine(); if (!showAdvancedSettings) { // Don't bother showing 'more' for advanced options if there aren't any advanced options. if (configurableOptionSettings.Any(x => x.AdvancedSetting)) { _toolInteractiveService.WriteLine("Enter 'more' to display Advanced settings. "); } } _toolInteractiveService.WriteLine("Or press 'Enter' to deploy:"); var input = _toolInteractiveService.ReadLine(); // advanced - break to main loop to reprint menu if (input.Trim().ToLower().Equals("more")) { showAdvancedSettings = true; _toolInteractiveService.WriteLine(); continue; } // deploy case, nothing more to configure if (string.IsNullOrEmpty(input)) { var validatorFailedResults = recommendation.Recipe .BuildValidators() .Select(validator => validator.Validate(recommendation.Recipe, _session)) .Where(x => !x.IsValid) .ToList(); if (!validatorFailedResults.Any()) { // validation successful // deployment configured return; } _toolInteractiveService.WriteLine(); _toolInteractiveService.WriteErrorLine("The deployment configuration needs to be adjusted before it can be deployed:"); foreach (var result in validatorFailedResults) { _toolInteractiveService.WriteErrorLine($" - {result.ValidationFailedMessage}"); } _toolInteractiveService.WriteLine(); _toolInteractiveService.WriteErrorLine("Please adjust your settings"); } // configure option setting if (int.TryParse(input, out var selectedNumber) && selectedNumber >= 1 && selectedNumber <= optionSettings.Length) { await ConfigureDeploymentFromCli(recommendation, optionSettings[selectedNumber - 1]); } _toolInteractiveService.WriteLine(); } }