Ejemplo n.º 1
0
        public ParametersResolver([NotNull] IUserConsole console, [NotNull] IKnownLiterals knownLiterals)
        {
            _console = console ?? throw new ArgumentNullException(nameof(console));

            _knownLiterals = knownLiterals ?? throw new ArgumentNullException(nameof(knownLiterals));

            _parameterPrompts = new Dictionary <ParameterPosition, string>
            {
                { ParameterPosition.Account, "VSTS account" },
                { ParameterPosition.OverrideExistentTarget, $"Override existent target {YesNoPrompt}" },
                { ParameterPosition.SourceGroup, "Source group name" },
                { ParameterPosition.SourceProject, $"Source project or '{_knownLiterals.GroupLocationFileSelector}'" },
                { ParameterPosition.TargetGroup, "Target group name" },
                { ParameterPosition.TargetProject, $"Target project or '{_knownLiterals.GroupLocationFileSelector}'" },
                { ParameterPosition.Token, "VSTS access token" }
            };
        }
Ejemplo n.º 2
0
        public ShowConfiguration(ISerializer yamlSerializer, IOptions <JenoConfiguration> configuration, IUserConsole console)
        {
            _configuration  = configuration.Value;
            _console        = console;
            _yamlSerializer = yamlSerializer;

            Command = (app) =>
            {
                app.Description = Messages.ShowConfigurationCommandDescription;

                app.OnExecuteAsync(token =>
                {
                    _console.WriteLine(_yamlSerializer.Serialize(_configuration));
                    return(Task.FromResult(JenoCodes.Ok));
                });
            };
        }
Ejemplo n.º 3
0
        public RunJob(IGitClient gitWrapper, IEncryptor encryptor, IUserConsole userConsole, IHttpClientFactory factory, IOptions <JenoConfiguration> configuration)
        {
            _gitWrapper    = gitWrapper;
            _client        = factory.CreateClient();
            _configuration = configuration.Value;
            _userConsole   = userConsole;
            _encryptor     = encryptor;

            Command = (CommandLineApplication app) =>
            {
                app.Description = Messages.RunJobDescription;

                var jobParameters = app.Argument("jobParameters", Messages.RunJobArgumentsDescription, true);

                app.OnExecuteAsync(async token =>
                {
                    var validationResult = _validator.Validate(_configuration);
                    if (!validationResult.IsValid)
                    {
                        throw new JenoException(string.Join(Environment.NewLine, validationResult.Errors));
                    }

                    var baseUrl = new Uri(_configuration.JenkinsUrl);

                    if (!await _gitWrapper.IsGitRepository(Directory.GetCurrentDirectory()))
                    {
                        throw new JenoException(Messages.NotGitRepoError);
                    }

                    var currentRepo = await _gitWrapper.GetRepoName(Directory.GetCurrentDirectory());
                    var jobNumber   = await _gitWrapper.GetCurrentBranch(Directory.GetCurrentDirectory());

                    var pipeline = _configuration.Repository.ContainsKey(currentRepo) ?
                                   _configuration.Repository[currentRepo] :
                                   _configuration.Repository[DefaulJobKey];

                    var jobUrl = new Uri(baseUrl, $"{pipeline}/job/{jobNumber}/buildWithParameters");

                    if (jobParameters.Values.Count > 0)
                    {
                        ValidateJobParameters(jobParameters.Values);

                        var builder   = new UriBuilder(jobUrl);
                        builder.Query = string.Join("&", jobParameters.Values);
                        jobUrl        = builder.Uri;
                    }

                    _client.DefaultRequestHeaders.Authorization = new BearerAuthenticationHeader(_configuration.Token);

                    var response = await _client.PostAsync(jobUrl, null);

                    if (response.StatusCode == HttpStatusCode.Forbidden)
                    {
                        var password = string.IsNullOrWhiteSpace(_configuration.Password) ?
                                       _userConsole.ReadInput("password", true) :
                                       _encryptor.Decrypt(_configuration.Password);

                        _client.DefaultRequestHeaders.Authorization = new BasicAuthenticationHeader(_configuration.UserName, password);

                        var crumbUrl      = new Uri(baseUrl, "crumbIssuer/api/json");
                        var crumbResponse = await _client.GetAsync(crumbUrl);

                        if (!crumbResponse.IsSuccessStatusCode)
                        {
                            throw new JenoException($"{Messages.CsrfException}: {crumbResponse.ReasonPhrase}");
                        }

                        var crumbHeader = JsonConvert.DeserializeObject <CrumbHeader>(await crumbResponse.Content.ReadAsStringAsync());
                        _client.DefaultRequestHeaders.Add(crumbHeader.CrumbRequestField, crumbHeader.Crumb);
                        response = await _client.PostAsync(jobUrl, null);
                    }

                    if (!response.IsSuccessStatusCode)
                    {
                        throw new JenoException($"{Messages.JobException}: {response.ReasonPhrase}");
                    }

                    return(JenoCodes.Ok);
                });
            };
        }
Ejemplo n.º 4
0
        public SetConfiguration(IConfigurationSerializer serializer, IEncryptor encryptor, IUserConsole userConsole)
        {
            _serializer  = serializer;
            _encryptor   = encryptor;
            _userConsole = userConsole;

            Command = (app) =>
            {
                app.Description = Messages.ChangeConfigurationDescription;

                var settings     = app.Argument("settings", Messages.SettingDescription, true).Values;
                var deleteOption = app.Option("-d|--delete", Messages.DeleteRepoOptionDescription, CommandOptionType.NoValue);

                app.OnExecuteAsync(async token =>
                {
                    var configuration = await _serializer.ReadConfiguration();

                    var args   = settings.Select(s => ParseSetting(s));
                    var delete = deleteOption.Values.Count > 0;

                    foreach (var arg in args)
                    {
                        switch (arg.Item1)
                        {
                        case ("jenkinsurl"):
                            configuration.JenkinsUrl = GetNewSettingValue(arg, delete);
                            break;

                        case ("username"):
                            configuration.UserName = GetNewSettingValue(arg, delete);
                            break;

                        case ("token"):
                            configuration.Token = GetNewSettingValue(arg, delete);
                            break;

                        case ("password"):
                            configuration.Password = GetNewSettingValue(arg, delete, true);
                            break;

                        case ("repository"):
                            {
                                if (string.IsNullOrWhiteSpace(arg.Item2))
                                {
                                    var repositoryName = _userConsole.ReadInput("repository name");
                                    var jenkinsJob     = _userConsole.ReadInput("jenkins job");

                                    configuration.Repository[repositoryName] = jenkinsJob;
                                    break;
                                }

                                var repositories = arg.Item2.Split(MultiRepositoriesSeparator);

                                if (delete)
                                {
                                    if (repositories.Any(s => s == DefaultPipelineKey))
                                    {
                                        throw new JenoException(Messages.RemoveDefaultJobError);
                                    }

                                    foreach (var repository in repositories)
                                    {
                                        if (configuration.Repository.ContainsKey(repository))
                                        {
                                            configuration.Repository.Remove(repository);
                                        }
                                    }

                                    break;
                                }

                                if (repositories.Any(s => !s.Contains(RepositoryPipelineSeparator)))
                                {
                                    throw new JenoException(Messages.WrongReposFormat);
                                }

                                var repos = repositories.Select(s => (s.Split(RepositoryPipelineSeparator)[0], s.Split(RepositoryPipelineSeparator)[1]));

                                if (repos.Select(s => s.Item1).Any(s => string.IsNullOrWhiteSpace(s)))
                                {
                                    throw new JenoException(Messages.MissingRepoName);
                                }

                                foreach (var repo in repos)
                                {
                                    configuration.Repository[repo.Item1] = repo.Item2;
                                }
                                break;
                            }

                        default:
                            throw new JenoException($"{Messages.UnsupportedSetting}{arg.Item1}");
                        }
                        ;
                    }

                    try
                    {
                        await _serializer.SaveConfiguration(configuration);
                    }
                    catch (UnauthorizedAccessException)
                    {
                        throw new JenoException(Messages.CannotSaveConfigurationChangesErrorMessage);
                    }
                    return(JenoCodes.Ok);
                });
            };
        }
Ejemplo n.º 5
0
 public GameView(IUserConsole console)
 {
     this._console = console;
 }