Esempio n. 1
0
        public void JenkinsView_Create_Exists_Delete()
        {
            var newView = new JenkinsView(this.jenkinsConnection, "hudson.model.ListView", "JenkinsView_Create_Exists_Delete");

            Assert.IsTrue(newView.Create());
            Assert.IsTrue(newView.Create());
            Assert.IsFalse(newView.Create(true));

            Assert.IsTrue(newView.Exists);

            Assert.IsTrue(newView.Delete());
            Assert.IsTrue(newView.Delete());
            Assert.IsFalse(newView.Delete(true));

            Assert.IsFalse(newView.Exists);
        }
Esempio n. 2
0
        public async Task <JenkinsView> GetViewAsync(string url, bool depthLoad)
        {
            if (url == null)
            {
                throw new ArgumentNullException("url");
            }

            JenkinsView jenkinsView = await this.restManager.LoadAsync <JenkinsView>(url);

            if (depthLoad && jenkinsView != null && jenkinsView.Jobs != null)
            {
                jenkinsView.Jobs = jenkinsView.Jobs.Select(j => this.GetJobAsync(j.RestUrl, true).Result).ToArray();
            }

            return(jenkinsView);
        }
        public static async Task <IEnumerable <JenkinsJob> > GetJobsFromView(JenkinsServer server, JenkinsView view)
        {
            Uri viewUri = new Uri(view.Url);

            var rangeSpecifierSupported = JenkinsServerValidator.RangeSpecifierSupported(server.Url);
            var jobsQuery = rangeSpecifierSupported ? JOBS_QUERY_WITH_RANGE : JOBS_QUERY;

            Uri         jobsInfoUri     = new Uri(viewUri, jobsQuery);
            JenkinsView viewWithJobData = await GetFromJSONData <JenkinsView>(server, jobsInfoUri);

            var result = viewWithJobData == null?Enumerable.Empty <JenkinsJob>() : viewWithJobData.Jobs;

            if (!rangeSpecifierSupported)
            {
                RestrictNumberOfJobBuilds(result);
            }

            return(result);
        }
        private static string FixPrimaryViewUrl(JenkinsView view)
        {
            // Fix JSON problem which contains wrong url for primary view (is always the base url which contains
            // all builds, not just the ones for that view).
            if (!view.Url.ToUpperInvariant().Contains("/VIEW/"))
            {
                // We use Uri class to join url parts, we need a slash as last char. The
                // base url would be used if we didn't fix this, instead of the full url.
                if (view.Url.Last() != '/')
                {
                    view.Url += '/';
                }

                string viewUrlPart = string.Concat("view/", view.Name, "/");
                view.Url = new Uri(new Uri(view.Url), viewUrlPart).AbsoluteUri;
            }

            return(view.Url);
        }
Esempio n. 5
0
        public void InvokeGetViewAsyncWithDepthLoadShouldCallLoadAsync()
        {
            var jobs = new[] { new JenkinsJob {
                                   Url = "monUrlJob"
                               } };
            var view = new JenkinsView
            {
                Url  = Url,
                Jobs = jobs
            };

            restManager.Setup(m => m.LoadAsync <JenkinsView>(It.IsAny <string>()))
            .Returns(() =>
            {
                var tcs = new TaskCompletionSource <JenkinsView>();
                tcs.SetResult(view);
                return(tcs.Task);
            });

            restManager.Setup(m => m.LoadAsync <JenkinsJob>(It.IsAny <string>()))
            .Returns((string jobRestUrl) =>
            {
                var tcs = new TaskCompletionSource <JenkinsJob>();
                tcs.SetResult(jobs.First(j => string.Equals(j.RestUrl, jobRestUrl, StringComparison.OrdinalIgnoreCase)));
                return(tcs.Task);
            });

            restManager.Setup(m => m.LoadAsync <JenkinsBuild>(It.IsAny <string>()))
            .Returns((string buildRestUrl) =>
            {
                var tcs = new TaskCompletionSource <JenkinsBuild>();
                tcs.SetResult(new JenkinsBuild());
                return(tcs.Task);
            });

            this.defaultClient.GetViewAsync(Url, true).Wait();

            this.restManager.Verify(m => m.LoadAsync <JenkinsView>(It.Is <string>(u => string.Equals(u, Url, StringComparison.OrdinalIgnoreCase))), Times.Once);
            foreach (var job in view.Jobs)
            {
                restManager.Verify(m => m.LoadAsync <JenkinsJob>(It.Is <string>(u => string.Equals(u, job.RestUrl, StringComparison.OrdinalIgnoreCase))), Times.Once);
            }
        }
Esempio n. 6
0
        public void JenkinsView_Create_AddJob_Contains_RemoveJob_Delete()
        {
            var newView = new JenkinsView(this.jenkinsConnection, "hudson.model.ListView", "JenkinsView_Create_AddJob_RemoveJob_Delete");
            var job     = new JenkinsJob(this.jenkinsConnection, "hudson.model.FreeStyleProject", "job 1");

            Assert.IsTrue(newView.Create());

            Assert.IsTrue(newView.Add(job));
            Assert.IsTrue(newView.Add(job));
            Assert.IsFalse(newView.Add(job, true));

            Assert.IsTrue(newView.Contains(job));

            Assert.IsTrue(newView.Remove(job));
            Assert.IsTrue(newView.Remove(job));
            Assert.IsFalse(newView.Remove(job, true));

            Assert.IsFalse(newView.Contains(job));

            Assert.IsTrue(newView.Delete());
        }
        private bool TrySelectPreferredView(SolutionChangedEventArgs e)
        {
            if (!ApiHandlerSettingsManager.ContainsSolutionPreference(e.SolutionPath))
            {
                return(false);
            }

            var jobLink       = ApiHandlerSettingsManager.GetJobLink(e.SolutionPath);
            var jobLinkServer = JenkinsServers.FirstOrDefault((s) => string.Equals(s.Url, jobLink.JenkinsServerUrl, StringComparison.InvariantCultureIgnoreCase));

            if (jobLinkServer == null)
            {
                // server has been removed
                return(false);
            }

            bool preferredViewSelected = false;

            if (SelectedJenkinsServer == jobLinkServer)
            {
                // Correct server already selected, just fix the view
                var preferredView = _jenkinsViews.FirstOrDefault((j) => string.Equals(j.Name, jobLink.JenkinsViewName));
                if (preferredView != null)
                {
                    SelectedView          = preferredView;
                    preferredViewSelected = true;
                }
            }
            else
            {
                SelectNewJenkinsServer(jobLinkServer, jobLink.JenkinsViewName);
                preferredViewSelected = true;
            }

            return(preferredViewSelected);
        }
Esempio n. 8
0
        private async static Task <JenkinsView> GetJenkinsView(string jenkinsServerUrl, string viewUrl)
        {
            JenkinsView view = null;

            JenkinsServer server = SettingManager.GetJenkinsServer(jenkinsServerUrl);

            if (server == null)
            {
                return(null);
            }

            using (WebClient wc = new WebClient())
            {
                if (!string.IsNullOrWhiteSpace(server.UserName))
                {
                    // WebClient.Credentials can not be used, because those credentials will only be send to the server
                    // when the server responds with a challenge from the server. Jenkins won't send this challenge as documented
                    // on the wiki: https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients

                    // We should use the "old fashion" way of setting the header manually
                    string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", server.UserName, server.ApiToken)));
                    wc.Headers[HttpRequestHeader.Authorization] = "Basic " + credentials;
                }

                Uri baseUri = new Uri(viewUrl);

                Task <string> jsonRawDataTask = wc.DownloadStringTaskAsync(new Uri(baseUri, "api/json?pretty=true"));

                if (await Task.WhenAny(jsonRawDataTask, Task.Delay(3000)) == jsonRawDataTask)
                {
                    view = JsonConvert.DeserializeObject <JenkinsView>(jsonRawDataTask.Result);
                }
            }

            return(view ?? new JenkinsView());
        }
Esempio n. 9
0
        /// <summary>
        /// Loads all job information
        /// </summary>
        /// <param name="jenkinsServerUrl">The url of the server, without any api paths (eg http://jenkins.cyanogenmod.com/)</param>
        /// <returns>The list of Jobs</returns>
        public async static Task <JenkinsOverview> GetJenkinsOverview(string jenkinsServerUrl)
        {
            JenkinsOverview overview = null;
            JenkinsQueue    queue    = null;

            JenkinsServer server = SettingManager.GetJenkinsServer(jenkinsServerUrl);

            if (server == null)
            {
                return(null);
            }

            using (WebClient wc = new WebClient())
            {
                if (!string.IsNullOrWhiteSpace(server.UserName))
                {
                    // WebClient.Credentials can not be used, because those credentials will only be send to the server
                    // when the server responds with a challenge from the server. Jenkins won't send this challenge as documented
                    // on the wiki: https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients

                    // We should use the "old fashion" way of setting the header manually
                    string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", server.UserName, server.ApiToken)));
                    wc.Headers[HttpRequestHeader.Authorization] = "Basic " + credentials;
                }

                Uri baseUri = new Uri(jenkinsServerUrl);

                Task <string> jsonRawDataTask = wc.DownloadStringTaskAsync(new Uri(baseUri, "api/json?pretty=true&tree=views[name,url]"));
                if (await Task.WhenAny(jsonRawDataTask, Task.Delay(3000)) == jsonRawDataTask)
                {
                    overview = JsonConvert.DeserializeObject <JenkinsOverview>(jsonRawDataTask.Result) ?? new JenkinsOverview();

                    string jsonQueueData = await wc.DownloadStringTaskAsync(new Uri(baseUri, "queue/api/json?pretty=true&tree=items[why,task[name,url,color]]"));

                    queue = JsonConvert.DeserializeObject <JenkinsQueue>(jsonQueueData) ?? new JenkinsQueue();

                    queue.Items = queue.Items ?? new List <ScheduledJob>();

                    object allJobLock = new object();
                    var    allJobs    = new List <Job>();
                    foreach (var view in overview.Views.AsParallel())
                    {
                        // Fix JSON problem which contains wrong url for primary view (is always the base url which contains
                        // all builds, not just the ones for that view).
                        if (!view.Url.Contains("/view/"))
                        {
                            view.Url = string.Format("{0}/view/{1}/", view.Url, view.Name);
                        }

                        JenkinsView viewData = await GetJenkinsView(jenkinsServerUrl, view.Url);

                        if (viewData == null)
                        {
                            continue;
                        }

                        foreach (var job in viewData.Jobs)
                        {
                            lock (allJobLock)
                            {
                                var allJobsJob = allJobs.FirstOrDefault((j) => string.Equals(j.Url, job.Url));
                                if (allJobsJob != null)
                                {
                                    view.Jobs.Add(allJobsJob);
                                }
                                else
                                {
                                    view.Jobs.Add(job);
                                    allJobs.Add(job);
                                }
                            }
                        }
                    }

                    overview.Jobs = ParseJobs(allJobs, queue);

                    return(overview);
                }
            }

            return(new JenkinsOverview());
        }