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();
        }
Пример #2
0
        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));
        }
Пример #5
0
        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);
        }
Пример #7
0
        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;
            //}
        }
Пример #9
0
        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);
        }
Пример #10
0
 GitHttpClient _getGitClient(VstsRequest req)
 {
     return(_getConnection(req).GetClient <GitHttpClient>());
 }
Пример #11
0
 VssConnection _getConnection(VstsRequest req)
 {
     return(new VssConnection(new Uri(_settings.Value.AzureDevOpsCollectionName),
                              new VssBasicCredential(string.Empty, _secrets.Value.PAT)));
 }