public async Task ReleaseWithApproval() { const int id = 79; var response = File.ReadAllText(Path.Join(ReleaseAssets, "Approved.json")); var request = new VstsRequest <Response.Release>("/keeas"); using var httpTest = new HttpTest(); httpTest.RespondWith(status: 200, body: response); var client = new VstsRestClient("dummy", "pat"); var release = await client.GetAsync(request); release.Id.ShouldBe(id); release.Environments.ShouldNotBeEmpty(); release.Tags.ShouldNotBeEmpty(); var env = release.Environments.Skip(1).First(); env.Id.ShouldNotBe(0); env.PreDeployApprovals.ShouldNotBeEmpty(); env.DeploySteps.ShouldNotBeEmpty(); env.Name.ShouldNotBeNullOrEmpty(); env.DeployPhasesSnapshot.ShouldNotBeEmpty(); var phaseSnapshot = env.DeployPhasesSnapshot.First(); phaseSnapshot.PhaseType.ShouldNotBeEmpty(); phaseSnapshot.DeploymentInput.ShouldNotBeNull(); phaseSnapshot.DeploymentInput.QueueId.ShouldNotBe(0); var deploy = env.DeploySteps.First(); deploy.RequestedFor.ShouldNotBeNull(); deploy.RequestedFor.Id.ShouldNotBeNull(); deploy.LastModifiedBy.ShouldNotBeNull(); var predeploy = env.PreDeployApprovals.First(); predeploy.Status.ShouldNotBeNullOrEmpty(); predeploy.ApprovalType.ShouldNotBeNullOrEmpty(); predeploy.IsAutomated.ShouldBe(false); predeploy.ApprovedBy.ShouldNotBeNull(); predeploy.ApprovedBy.DisplayName.ShouldNotBeNullOrEmpty(); var conditions = env.Conditions.ToList(); conditions.ShouldNotBeEmpty(); var condition = conditions.First(); condition.Result.ShouldBe(false); condition.Name.ShouldNotBeNullOrEmpty(); condition.ConditionType.ShouldNotBeEmpty(); condition.Value.ShouldNotBeNull(); var artifact = release.Artifacts.First(); artifact.Type.ShouldNotBeNull(); artifact.Alias.ShouldNotBeNull(); }
public async Task HandleARM_PR(VstsRequest req) { _logService.TrackEventObject(PR.Helpers.Contract.Constants.Events.INBOUND_PR, "input_pr_json", req); try { var files = await _vstsHelper.GetFilesinPR(req); _logService.TrackTrace("Files loaded", "count", files.Count.ToString()); await _vstsHelper.SetToPending(req); var basicResult = await _validatorRunner.ValidateAll(files, _basicJsonValidator); if (basicResult.Failed) { await _vstsHelper.ReportBackToPullRequest(req, basicResult); return; } var armResult = await _validatorRunner.ValidateAll(files, _armValidator); await _vstsHelper.ReportBackToPullRequest(req, armResult); } catch (Exception ex) { _logService.TrackException(ex); return; } }
public async Task GetJsonThrowsOnError() { var request = new VstsRequest <JObject>("/get/some/data"); using var httpTest = new HttpTest(); httpTest.RespondWith(status: 500); var client = new VstsRestClient("dummy", "pat"); await Assert.ThrowsAsync <FlurlHttpException>(async() => await client.GetAsync(request)); }
public async Task PutThrowsOnError() { var request = new VstsRequest <int, int>("/put/some/data"); using var httpTest = new HttpTest(); httpTest.RespondWith(status: 500); var client = new VstsRestClient("dummy", "pat"); await Assert.ThrowsAsync <FlurlHttpException>(async() => await client.PutAsync(request, 3)); }
public async Task ReportBackToPullRequest(VstsRequest req, AzureValidationResult result) { var gitClient = _getGitClient(req); var repoId = req.resource.repository.id; var gRepoId = new Guid(repoId); var projectId = req.resourceContainers.project.id; var pr = await gitClient.GetPullRequestAsync(repoId, req.resource.pullRequestId); var its = await gitClient.GetPullRequestIterationsAsync(repoId, pr.PullRequestId); var it = its.Last(); var prStatus = new GitPullRequestStatus(); prStatus.Context = new GitStatusContext { Genre = _settings.Value.Genre, Name = _settings.Value.Name }; prStatus.IterationId = it.Id; if (result.Failed) { prStatus.State = GitStatusState.Failed; prStatus.Description = "Failed ARM Template Checks"; var failed = result.ValidatedFiles.FirstOrDefault(_ => _.Failed); var message = ""; if (failed == null) { _logService.TrackException(new Exception("Failed happened but not failed item found!")); message = $"## ARM Validation Failed on Update {it.Id} \r\n Failed checks on Update {it.Id}"; //should not be able to do this:/ } else { message = $"## ARM Validation Failed on Update {it.Id}\r\n**File:** {failed.FilePath}\r\n**Message:** {failed.Message}"; } await _createComment(message, pr, gitClient, repoId); } else { var message = $"## ARM Validation Passed on Update {it.Id}\r\n Scanned {result.ValidatedFiles.Count} files."; await _createComment(message, pr, gitClient, repoId); prStatus.State = GitStatusState.Succeeded; prStatus.Description = "ARM Template Checks Pass"; } await gitClient.CreatePullRequestIterationStatusAsync(prStatus, new Guid(repoId), pr.PullRequestId, it.Id.Value); }
public async Task ConditionResultOnReleaseEnvironmentMustBeNullable() { var response = File.ReadAllText(Path.Join(EnvironmentAssets, "ConditionResultNull.json")); var request = new VstsRequest <Environment>("/keeas"); using var httpTest = new HttpTest(); httpTest.RespondWith(status: 200, body: response); var client = new VstsRestClient("dummy", "pat"); await client.GetAsync(request); }
public async Task <List <(string path, string contents)> > GetFilesinPR(VstsRequest req) { //var connection = new VssConnection(new Uri(_secrets.Value.VSTSCollection), // new VssBasicCredential(string.Empty, _secrets.Value.PAT)); // var c = connection.AuthenticatedIdentity; var gitClient = _getGitClient(req); var repoId = req.resource.repository.id; var projectId = req.resourceContainers.project.id; var branchRef = req.resource.sourceRefName.Replace("refs/heads/", ""); var versionDesc = new GitVersionDescriptor { VersionType = GitVersionType.Branch, Version = branchRef }; try { var items = await gitClient.GetItemsAsync(projectId, repoId, "/", VersionControlRecursionType.Full, versionDescriptor : versionDesc); var result = new List <(string path, string contents)>(); foreach (var i in items.Where(_ => !_.IsFolder)) { if (i.Path.ToLower().IndexOf("gitignore", StringComparison.Ordinal) != -1) { continue; } var content = await gitClient.GetItemAsync(repoId, i.Path, includeContent : true, versionDescriptor : versionDesc); result.Add((i.Path, content.Content.ToString())); } return(result); } catch (Exception ex) { _logService.TrackException(ex); } return(new List <(string path, string contents)>()); }
public async Task <IActionResult> CreateNSGCheckPR([FromBody] VstsRequest req) { _taskQueue.QueueBackgroundWorkItem(async token => { await _prProcessor.HandleARM_PR(req); }); var ser = JsonConvert.SerializeObject(req); System.IO.File.WriteAllText("C:\\Temp\\ser\\req6.json", ser); return(Ok()); //using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8)) //{ // var s= await reader.ReadToEndAsync(); // Debug.WriteLine(s); // return s; //} }
public async Task SetToPending(VstsRequest req) { var gitClient = _getGitClient(req); var prStatus = new GitPullRequestStatus(); prStatus.Context = new GitStatusContext { Genre = _settings.Value.Genre, Name = _settings.Value.Name }; prStatus.State = GitStatusState.Pending; var repoId = req.resource.repository.id; var gRepoId = new Guid(repoId); var projectId = req.resourceContainers.project.id; var pr = await gitClient.GetPullRequestAsync(repoId, req.resource.pullRequestId); var its = await gitClient.GetPullRequestIterationsAsync(repoId, pr.PullRequestId); var it = its.Last(); prStatus.IterationId = it.Id; await gitClient.CreatePullRequestIterationStatusAsync(prStatus, new Guid(repoId), pr.PullRequestId, it.Id.Value); }
GitHttpClient _getGitClient(VstsRequest req) { return(_getConnection(req).GetClient <GitHttpClient>()); }
VssConnection _getConnection(VstsRequest req) { return(new VssConnection(new Uri(_settings.Value.AzureDevOpsCollectionName), new VssBasicCredential(string.Empty, _secrets.Value.PAT))); }