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); }
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); }
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); } }
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); }
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()); }
/// <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()); }