From c739425c66f41efe6eb5de317078505066007c69 Mon Sep 17 00:00:00 2001 From: Aditya Narayan Date: Tue, 27 Feb 2024 17:32:38 +0530 Subject: [PATCH 01/29] Handling the scenario where the release relation and the comment is retained after manual changes by the user, during subsequent runs of the component creator. --- .../Interfaces/ISW360APICommunication.cs | 2 +- .../Model/AddLinkedRelease.cs | 21 +++++++++++ .../Model/ReleaseLinked.cs | 1 + .../SW360Apicommunication.cs | 8 ++--- src/LCT.Common/Constants/Dataconstant.cs | 1 + .../ISW360ApicommunicationFacade.cs | 2 +- src/LCT.Facade/SW360ApicommunicationFacade.cs | 4 +-- .../ComponentCreator.cs | 36 +++++++++++++++---- .../Interface/ISW360CreatorService.cs | 2 +- src/LCT.Services/Sw360CreatorService.cs | 27 ++++++++------ src/LCT.Services/Sw360ProjectService.cs | 3 +- 11 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 src/LCT.APICommunications/Model/AddLinkedRelease.cs diff --git a/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs b/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs index 03d6bc16..12cd45b6 100644 --- a/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs +++ b/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs @@ -33,7 +33,7 @@ public interface ISw360ApiCommunication Task GetReleaseByCompoenentName(string componentName); Task CreateRelease(Releases createReleaseContent); Task CreateComponent(CreateComponent createComponentContent); - Task LinkReleasesToProject(string[] releaseidArray, string sw360ProjectId); + Task LinkReleasesToProject(HttpContent httpContent, string sw360ProjectId); Task UpdateLinkedRelease(string projectId, string releaseId, UpdateLinkedRelease updateLinkedRelease); Task UpdateRelease(string releaseId, HttpContent httpContent); Task UpdateComponent(string componentId, HttpContent httpContent); diff --git a/src/LCT.APICommunications/Model/AddLinkedRelease.cs b/src/LCT.APICommunications/Model/AddLinkedRelease.cs new file mode 100644 index 00000000..89a67374 --- /dev/null +++ b/src/LCT.APICommunications/Model/AddLinkedRelease.cs @@ -0,0 +1,21 @@ +// -------------------------------------------------------------------------------------------------------------------- +// SPDX-FileCopyrightText: 2024 Siemens AG +// +// SPDX-License-Identifier: MIT +// -------------------------------------------------------------------------------------------------------------------- + +using Newtonsoft.Json; + +namespace LCT.APICommunications.Model +{ + + [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + public class AddLinkedRelease + { + [JsonProperty("releaseRelation")] + public string ReleaseRelation { get; set; } + + [JsonProperty("comment")] + public string Comment { get; set; } + } +} diff --git a/src/LCT.APICommunications/Model/ReleaseLinked.cs b/src/LCT.APICommunications/Model/ReleaseLinked.cs index 2eab13df..8c3b3f1f 100644 --- a/src/LCT.APICommunications/Model/ReleaseLinked.cs +++ b/src/LCT.APICommunications/Model/ReleaseLinked.cs @@ -19,5 +19,6 @@ public class ReleaseLinked public string ReleaseId { get; set; } = string.Empty; public string Comment { get; set; } = string.Empty; + public string Relation { get; set; } = string.Empty; } } \ No newline at end of file diff --git a/src/LCT.APICommunications/SW360Apicommunication.cs b/src/LCT.APICommunications/SW360Apicommunication.cs index d77c0cbe..6f38cdd9 100644 --- a/src/LCT.APICommunications/SW360Apicommunication.cs +++ b/src/LCT.APICommunications/SW360Apicommunication.cs @@ -177,15 +177,11 @@ public async Task GetReleaseByLink(string releaseLink) return await httpClient.GetAsync(releaseLink); } - public async Task LinkReleasesToProject(string[] releaseidArray, string sw360ProjectId) + public async Task LinkReleasesToProject(HttpContent httpContent, string sw360ProjectId) { HttpClient httpClient = GetHttpClient(); string url = $"{sw360ProjectsApi}/{sw360ProjectId}/{ApiConstant.Releases}"; - - string releaseidList = JsonConvert.SerializeObject(releaseidArray); - HttpContent content = new StringContent(releaseidList, Encoding.UTF8, "application/json"); - - return await httpClient.PostAsync(url, content); + return await httpClient.PostAsync(url, httpContent); } public async Task UpdateLinkedRelease(string projectId, string releaseId, UpdateLinkedRelease updateLinkedRelease) diff --git a/src/LCT.Common/Constants/Dataconstant.cs b/src/LCT.Common/Constants/Dataconstant.cs index 4df9ddc6..a3897f58 100644 --- a/src/LCT.Common/Constants/Dataconstant.cs +++ b/src/LCT.Common/Constants/Dataconstant.cs @@ -46,6 +46,7 @@ public static class Dataconstant public const string SourceUrlNotFound = "Source URL not found"; public const string PackageUrlNotFound = "Package URL not found"; public const string LinkedByCATool = "Linked by CA Tool"; + public const string LinkedByCAToolReleaseRelation = "UNKNOWN"; public const string ReleaseAttachmentComment = "Attached by CA Tool"; public const char ForwardSlash = '/'; public const string SourceURLSuffix = "/srcfiles?fileinfo=1"; diff --git a/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs b/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs index df1f4785..9b96fd75 100644 --- a/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs +++ b/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs @@ -34,7 +34,7 @@ public interface ISW360ApicommunicationFacade Task GetReleaseByCompoenentName(string componentName); Task CreateRelease(Releases createReleaseContent); Task CreateComponent(CreateComponent createComponentContent); - Task LinkReleasesToProject(string[] releaseidArray, string sw360ProjectId); + Task LinkReleasesToProject(HttpContent httpContent, string sw360ProjectId); Task UpdateRelease(string releaseId, HttpContent httpContent); Task UpdateComponent(string componentId, HttpContent httpContent); string AttachComponentSourceToSW360(AttachReport attachReport); diff --git a/src/LCT.Facade/SW360ApicommunicationFacade.cs b/src/LCT.Facade/SW360ApicommunicationFacade.cs index 1b2476e3..fdf51bf3 100644 --- a/src/LCT.Facade/SW360ApicommunicationFacade.cs +++ b/src/LCT.Facade/SW360ApicommunicationFacade.cs @@ -88,14 +88,14 @@ public Task GetReleaseByLink(string releaseLink) return m_sw360ApiCommunication.GetReleaseByLink(releaseLink); } - public async Task LinkReleasesToProject(string[] releaseidArray, string sw360ProjectId) + public async Task LinkReleasesToProject(HttpContent httpContent, string sw360ProjectId) { if (m_TestMode) { return new HttpResponseMessage(HttpStatusCode.OK); } - return await m_sw360ApiCommunication.LinkReleasesToProject(releaseidArray, sw360ProjectId); + return await m_sw360ApiCommunication.LinkReleasesToProject(httpContent, sw360ProjectId); } public async Task CreateComponent(CreateComponent createComponentContent) diff --git a/src/LCT.SW360PackageCreator/ComponentCreator.cs b/src/LCT.SW360PackageCreator/ComponentCreator.cs index 27b3b170..e51726e7 100644 --- a/src/LCT.SW360PackageCreator/ComponentCreator.cs +++ b/src/LCT.SW360PackageCreator/ComponentCreator.cs @@ -225,10 +225,14 @@ public async Task CreateComponentInSw360(CommonAppSettings appSettings, { await CreateComponent(creatorHelper, sw360CreatorService, parsedBomData, sw360Url, appSettings); } + var alreadyLinkedReleases = await GetAlreadyLinkedReleasesByProjectId(appSettings.SW360ProjectID, sw360ProjectService); - var manuallyLinkedReleases = await GetManuallyLinkedReleasesFromProject(appSettings, sw360ProjectService); + var manuallyLinkedReleases = await GetManuallyLinkedReleasesFromProject(alreadyLinkedReleases); + + await UpdateSBOMReleasesWithSw360Info(alreadyLinkedReleases); + + var releasesFoundInCbom = ReleasesFoundInCbom.ToList(); - var releasesFoundInCbom = ReleasesFoundInCbom.Select(x => x.ReleaseId).ToList(); // Linking releases to the project await sw360CreatorService.LinkReleasesToProject(releasesFoundInCbom, manuallyLinkedReleases, appSettings.SW360ProjectID); @@ -295,13 +299,31 @@ private async Task CreateComponent(ICreatorHelper creatorHelper, } } - private static async Task> GetManuallyLinkedReleasesFromProject(CommonAppSettings appSettings, ISw360ProjectService sw360ProjectService) + private static async Task> GetManuallyLinkedReleasesFromProject(List alreadyLinkedReleases) + { + var manuallyLinkedReleases = new List(alreadyLinkedReleases); + manuallyLinkedReleases.RemoveAll(x => string.Compare(x.Comment, Dataconstant.LinkedByCATool, StringComparison.OrdinalIgnoreCase) == 0); + + return manuallyLinkedReleases; + } + + private async Task> GetAlreadyLinkedReleasesByProjectId(string projectId, ISw360ProjectService sw360ProjectService) { - List alreadyLinkedReleases = await sw360ProjectService.GetAlreadyLinkedReleasesByProjectId(appSettings.SW360ProjectID); - alreadyLinkedReleases.RemoveAll(x => string.Compare(x.Comment, Dataconstant.LinkedByCATool, StringComparison.OrdinalIgnoreCase) == 0); - var manuallyLinkedReleaseIds = alreadyLinkedReleases.Select(x => x.ReleaseId).ToList(); + List alreadyLinkedReleases = await sw360ProjectService.GetAlreadyLinkedReleasesByProjectId(projectId); + return alreadyLinkedReleases; + } - return manuallyLinkedReleaseIds; + private async Task UpdateSBOMReleasesWithSw360Info(List alreadyLinkedReleases) + { + foreach (var release in ReleasesFoundInCbom) + { + var linkedRelease = alreadyLinkedReleases.FirstOrDefault(r => r.ReleaseId == release.ReleaseId); + if (linkedRelease != null) + { + release.Comment = linkedRelease.Comment; + release.Relation = linkedRelease.Relation; + } + } } private async Task CreateComponentAndRealease(ICreatorHelper creatorHelper, diff --git a/src/LCT.Services/Interface/ISW360CreatorService.cs b/src/LCT.Services/Interface/ISW360CreatorService.cs index c277ef3c..c53c3a32 100644 --- a/src/LCT.Services/Interface/ISW360CreatorService.cs +++ b/src/LCT.Services/Interface/ISW360CreatorService.cs @@ -24,7 +24,7 @@ Task CreateComponentBasesOFswComaprisonBOM( Task CreateReleaseForComponent( ComparisonBomData componentInfo, string componentId, Dictionary attachmentUrlList); - Task LinkReleasesToProject(List releasesTobeLinked, List manuallyLinkedReleases, string sw360ProjectId); + Task LinkReleasesToProject(List releasesTobeLinked, List manuallyLinkedReleases, string sw360ProjectId); Task GetReleaseIDofComponent(string componentName, string componentVersion, string componentid); diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index d0f833af..8be17d0b 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -258,7 +258,7 @@ private static string GetPackageDownloadUrl(ComparisonBomData componentInfo, Dic return componentInfo.PackageUrl ?? string.Empty; } - public async Task LinkReleasesToProject(List releasesTobeLinked, List manuallyLinkedReleases, string sw360ProjectId) + public async Task LinkReleasesToProject(List releasesTobeLinked, List manuallyLinkedReleases, string sw360ProjectId) { if (manuallyLinkedReleases.Count <= 0 && releasesTobeLinked.Count <= 0) { @@ -267,17 +267,24 @@ public async Task LinkReleasesToProject(List releasesTobeLinked, L } try { - manuallyLinkedReleases.AddRange(releasesTobeLinked); - var finalReleasesToBeLinked = manuallyLinkedReleases.Distinct().ToList(); + var finalReleasesToBeLinked = manuallyLinkedReleases.Concat(releasesTobeLinked).Distinct().ToList(); Logger.Debug($"No of release Id's to link - {finalReleasesToBeLinked.Count}"); - string[] releaseidArray = finalReleasesToBeLinked?.ToArray(); - var response = await m_SW360ApiCommunicationFacade.LinkReleasesToProject(releaseidArray, sw360ProjectId); - if (response.IsSuccessStatusCode) - { - await UpdateLinkedReleaseComment(sw360ProjectId, releasesTobeLinked); - } - else + Dictionary linkedReleasesDict = new Dictionary(); + linkedReleasesDict = finalReleasesToBeLinked? + .ToDictionary( + releaseLinked => releaseLinked.ReleaseId, + releaseLinked => new AddLinkedRelease() + { + ReleaseRelation = string.IsNullOrEmpty(releaseLinked.Relation) ? Dataconstant.LinkedByCAToolReleaseRelation + : releaseLinked.Relation, + Comment = manuallyLinkedReleases.Any(r => r.ReleaseId == releaseLinked.ReleaseId) ? releaseLinked.Comment : Dataconstant.LinkedByCATool + }); + + StringContent content = new StringContent(JsonConvert.SerializeObject(linkedReleasesDict), Encoding.UTF8, "application/json"); + + var response = await m_SW360ApiCommunicationFacade.LinkReleasesToProject(content, sw360ProjectId); + if (!response.IsSuccessStatusCode) { Environment.ExitCode = -1; Logger.Error($"LinkReleasesToProject() : Linking releases to project Id {sw360ProjectId} is failed."); diff --git a/src/LCT.Services/Sw360ProjectService.cs b/src/LCT.Services/Sw360ProjectService.cs index a140c772..dd2369cc 100644 --- a/src/LCT.Services/Sw360ProjectService.cs +++ b/src/LCT.Services/Sw360ProjectService.cs @@ -98,7 +98,8 @@ public async Task> GetAlreadyLinkedReleasesByProjectId(strin ReleaseLinked releaseLinked = new ReleaseLinked { Comment = sw360Release.Comment, - ReleaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/") + ReleaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"), + Relation= sw360Release.Relation }; alreadyLinkedReleases.Add(releaseLinked); } From 1c096b4e34a1c8c9a27c74ed8a31de714c3ab193 Mon Sep 17 00:00:00 2001 From: Aditya Narayan Date: Tue, 27 Feb 2024 18:12:19 +0530 Subject: [PATCH 02/29] updating the UT for the changes --- .../SW360ApicommunicationFacadeTest.cs | 13 +-- .../Sw360CreatorServiceTest.cs | 82 ++++--------------- 2 files changed, 23 insertions(+), 72 deletions(-) diff --git a/src/LCT.Facade.UTest/SW360ApicommunicationFacadeTest.cs b/src/LCT.Facade.UTest/SW360ApicommunicationFacadeTest.cs index 8499b179..5ca18c7a 100644 --- a/src/LCT.Facade.UTest/SW360ApicommunicationFacadeTest.cs +++ b/src/LCT.Facade.UTest/SW360ApicommunicationFacadeTest.cs @@ -7,6 +7,7 @@ using LCT.APICommunications.Interfaces; using LCT.APICommunications.Model; using Moq; +using Newtonsoft.Json; using NUnit.Framework; using System.Net; using System.Net.Http; @@ -142,12 +143,12 @@ public async Task LinkReleasesToProject_OnTestMode_ForGivenReleaseIdArray_Return //Arrange HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK); Mock mockSw360comm = new Mock(); - mockSw360comm.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); + mockSw360comm.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); //Act sW360ApicommunicationFacade = new SW360ApicommunicationFacade(mockSw360comm.Object, true); - HttpResponseMessage actual =await sW360ApicommunicationFacade.LinkReleasesToProject( - new string[] { "releasefowerjr393", "r3rilmmdlmawin48u" }, "ieuroejfklsndksdoldmfiosdfowemlfiwe"); + StringContent content = new StringContent(JsonConvert.SerializeObject("{ \"12345\" : { \"releaseRelation\" : \"UNKNOWN\", \"comment\" : \"Test Comment 1\" }, \"54321\" : { \"releaseRelation\" : \"UNKNOWN\", \"comment\" : \"Test Comment 2\" } }"), Encoding.UTF8, "application/json"); + HttpResponseMessage actual =await sW360ApicommunicationFacade.LinkReleasesToProject(content, "ieuroejfklsndksdoldmfiosdfowemlfiwe"); //Assert Assert.That(actual.StatusCode, Is.EqualTo(HttpStatusCode.OK)); @@ -159,12 +160,12 @@ public async Task LinkReleasesToProject_OnNonTestMode_ForGivenReleaseIdArray_Ret //Arrange HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK); Mock mockSw360comm = new Mock(); - mockSw360comm.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); + mockSw360comm.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); //Act sW360ApicommunicationFacade = new SW360ApicommunicationFacade(mockSw360comm.Object, false); - HttpResponseMessage actual =await sW360ApicommunicationFacade.LinkReleasesToProject( - new string[] { "releasefowerjr393", "r3rilmmdlmawin48u" }, "ieuroejfklsndksdoldmfiosdfowemlfiwe"); + StringContent content = new StringContent(JsonConvert.SerializeObject("{ \"12345\" : { \"releaseRelation\" : \"UNKNOWN\", \"comment\" : \"Test Comment 1\" }, \"54321\" : { \"releaseRelation\" : \"UNKNOWN\", \"comment\" : \"Test Comment 2\" } }"), Encoding.UTF8, "application/json"); + HttpResponseMessage actual =await sW360ApicommunicationFacade.LinkReleasesToProject(content, "ieuroejfklsndksdoldmfiosdfowemlfiwe"); //Assert Assert.That(actual.StatusCode, Is.EqualTo(HttpStatusCode.OK)); diff --git a/src/LCT.Services.UTest/Sw360CreatorServiceTest.cs b/src/LCT.Services.UTest/Sw360CreatorServiceTest.cs index 7c2146ce..5ff86a26 100644 --- a/src/LCT.Services.UTest/Sw360CreatorServiceTest.cs +++ b/src/LCT.Services.UTest/Sw360CreatorServiceTest.cs @@ -140,11 +140,13 @@ public async Task LinkReleasesToProject_InternalServerError_LinkingFailed() // Arrange HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError); Mock sw360ApiCommMock = new Mock(); - sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); + sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sw360ApiCommMock.Object); // Act - bool isLinked = await sw360CreatorService.LinkReleasesToProject(new List { "1000000" }, new List { "2000000" }, "fgjk53657989u09ipoklyiutr"); + var releasesToBeLinked = new List { new ReleaseLinked { Name = "GitVersion.CommandLine", Version = "5.3.6", ReleaseId = "5e71f9fc2bf9438e9f20a94dddcc6a0f", Comment = "Linked by CA Tool", Relation = "UNKNOWN" } }; + var manuallyLinkedReleases = new List { new ReleaseLinked { Name = "", Version = "", ReleaseId = "b565b2cc63fd4cff8f4e68fa1b5d5bd3", Comment = "", Relation = "CONTAINED" } }; + bool isLinked = await sw360CreatorService.LinkReleasesToProject(releasesToBeLinked, manuallyLinkedReleases, "fgjk53657989u09ipoklyiutr"); // Assert Assert.That(isLinked, Is.False, "Linking Release failed"); @@ -155,12 +157,14 @@ public async Task LinkReleasesToProject_HttpRequestException_LinkingFailed() { // Arrange Mock sw360ApiCommMock = new Mock(); - sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).Throws(); + sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).Throws(); ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sw360ApiCommMock.Object); // Act - bool isLinked = await sw360CreatorService.LinkReleasesToProject(new List { "1000000" }, new List { "2000000" }, "fgjk53657989u09ipoklyiutr"); + var releasesToBeLinked = new List { new ReleaseLinked { Name = "GitVersion.CommandLine", Version = "5.3.6", ReleaseId = "5e71f9fc2bf9438e9f20a94dddcc6a0f", Comment = "Linked by CA Tool", Relation = "UNKNOWN" } }; + var manuallyLinkedReleases = new List { new ReleaseLinked { Name = "", Version = "", ReleaseId = "b565b2cc63fd4cff8f4e68fa1b5d5bd3", Comment = "", Relation = "CONTAINED" } }; + bool isLinked = await sw360CreatorService.LinkReleasesToProject(releasesToBeLinked, manuallyLinkedReleases, "fgjk53657989u09ipoklyiutr"); // Assert Assert.That(isLinked, Is.False, "Linking Release failed"); @@ -171,11 +175,13 @@ public async Task LinkReleasesToProject_AggregateException_LinkingFailed() { // Arrange Mock sw360ApiCommMock = new Mock(); - sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).Throws(); + sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).Throws(); ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sw360ApiCommMock.Object); // Act - bool isLinked = await sw360CreatorService.LinkReleasesToProject(new List { "1000000" }, new List { "2000000" }, "fgjk53657989u09ipoklyiutr"); + var releasesToBeLinked = new List { new ReleaseLinked { Name = "GitVersion.CommandLine", Version = "5.3.6", ReleaseId = "5e71f9fc2bf9438e9f20a94dddcc6a0f", Comment = "Linked by CA Tool", Relation = "UNKNOWN" } }; + var manuallyLinkedReleases = new List { new ReleaseLinked { Name = "", Version = "", ReleaseId = "b565b2cc63fd4cff8f4e68fa1b5d5bd3", Comment = "", Relation = "CONTAINED" } }; + bool isLinked = await sw360CreatorService.LinkReleasesToProject(releasesToBeLinked, manuallyLinkedReleases, "fgjk53657989u09ipoklyiutr"); // Assert Assert.That(isLinked, Is.False, "Linking Release failed"); @@ -187,75 +193,19 @@ public async Task LinkReleasesToProject_ReleasesLinkedAndCommentUpdated_Success( // Arrange HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK); Mock sw360ApiCommMock = new Mock(); - sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); + sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); sw360ApiCommMock.Setup(x => x.UpdateLinkedRelease(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sw360ApiCommMock.Object); // Act - bool isLinked = await sw360CreatorService.LinkReleasesToProject(new List { "1000000" }, new List { "2000000" }, "fgjk53657989u09ipoklyiutr"); + var releasesToBeLinked = new List { new ReleaseLinked { Name = "GitVersion.CommandLine", Version = "5.3.6", ReleaseId = "5e71f9fc2bf9438e9f20a94dddcc6a0f", Comment = "Linked by CA Tool", Relation = "UNKNOWN" } }; + var manuallyLinkedReleases = new List { new ReleaseLinked { Name = "", Version = "", ReleaseId = "b565b2cc63fd4cff8f4e68fa1b5d5bd3", Comment = "", Relation = "CONTAINED" } }; + bool isLinked = await sw360CreatorService.LinkReleasesToProject(releasesToBeLinked, manuallyLinkedReleases, "fgjk53657989u09ipoklyiutr"); // Assert Assert.That(isLinked, Is.True, "Linking Release success"); } - - [Test] - public async Task LinkReleasesToProject_InputParamsValidation_Success() - { - // Arrange - string[] totalReleasesToBeLinked = new string[] { "1000000", "2000000" }; - string linkToProjectId = "fgjk53657989u09ipoklyiutr"; - HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK); - Mock sw360ApiCommMock = new Mock(); - sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())) - .Callback((newlyLinked, projectId) => { totalReleasesToBeLinked = newlyLinked; linkToProjectId = projectId; }) - .ReturnsAsync(httpResponseMessage); - - sw360ApiCommMock.Setup(x => x.UpdateLinkedRelease(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(httpResponseMessage); - ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sw360ApiCommMock.Object); - - // Act - bool isLinked = await sw360CreatorService.LinkReleasesToProject(new List { "1000000" }, new List { "2000000" }, "fgjk53657989u09ipoklyiutr"); - - // Assert - Assert.That(isLinked, Is.True, "Linking Release success"); - } - - [Test] - public async Task LinkReleasesToProject_HttpRequestException_OnUpdateOfLinkedReleaseComment_LinkingFailed() - { - // Arrange - HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK); - Mock sw360ApiCommMock = new Mock(); - sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); - sw360ApiCommMock.Setup(x => x.UpdateLinkedRelease(It.IsAny(), It.IsAny(), It.IsAny())).Throws(); - ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sw360ApiCommMock.Object); - - // Act - bool isLinked = await sw360CreatorService.LinkReleasesToProject(new List { "1000000" }, new List { "2000000" }, "fgjk53657989u09ipoklyiutr"); - - // Assert - Assert.That(isLinked, Is.False, "Linking Release success, comment update is failed"); - } - - [Test] - public async Task LinkReleasesToProject_AggregateException_OnUpdateOfLinkedReleaseComment_Linkingfailed() - { - // Arrange - HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK); - Mock sw360ApiCommMock = new Mock(); - sw360ApiCommMock.Setup(x => x.LinkReleasesToProject(It.IsAny(), It.IsAny())).ReturnsAsync(httpResponseMessage); - sw360ApiCommMock.Setup(x => x.UpdateLinkedRelease(It.IsAny(), It.IsAny(), It.IsAny())).Throws(); - ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sw360ApiCommMock.Object); - - // Act - bool isLinked = await sw360CreatorService.LinkReleasesToProject(new List { "1000000" }, new List { "2000000" }, "fgjk53657989u09ipoklyiutr"); - - // Assert - Assert.That(isLinked, Is.False, "Linking Release failed"); - } - [TestCase] public async Task Test_CreateComponentBasesOFswComaprisonBOM_Negative() { From 62f176099838a65bb71c6a04986371b5722c7806 Mon Sep 17 00:00:00 2001 From: karthika Date: Mon, 4 Mar 2024 15:54:24 +0530 Subject: [PATCH 03/29] Package Upgrade --- src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj b/src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj index 4b6cf7c7..bbc8d251 100644 --- a/src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj +++ b/src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj @@ -18,11 +18,11 @@ - + - + From 0c530de6fdb61ddede7025229f25992ad8663ce1 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 19 Mar 2024 08:01:28 +0530 Subject: [PATCH 04/29] Classification of packages in artifactory uploader and sonar issues --- .../NugetComparisonBOM.json | 20 +- .../ArtifactoryUploaderTest.cs | 4 +- .../PackageUploadHelperTest.cs | 10 +- .../PackageUploaderTest.cs | 87 ++++ .../ArtifactoryUploader.cs | 6 +- .../Model/DisplayPackagesInfo.cs | 42 ++ .../PackageUploadHelper.cs | 395 ++++++++++++++++-- src/ArtifactoryUploader/PackageUploader.cs | 73 +++- src/ArtifactoryUploader/Program.cs | 13 +- .../Model/ComponentsToArtifactory.cs | 5 + src/LCT.Common/CommonHelper.cs | 2 +- src/LCT.Common/FolderAction.cs | 2 +- src/LCT.PackageIdentifier/MavenProcessor.cs | 4 +- src/LCT.PackageIdentifier/NpmProcessor.cs | 4 +- .../ComponentCreator.cs | 10 +- .../PackageDownloader.cs | 2 +- src/LCT.Services/Sw360CreatorService.cs | 2 +- src/LCT.Services/Sw360ProjectService.cs | 2 +- src/LCT.Services/Sw360Service.cs | 12 +- 19 files changed, 615 insertions(+), 80 deletions(-) create mode 100644 src/ArtifactoryUploader/Model/DisplayPackagesInfo.cs diff --git a/TestFiles/IntegrationTestFiles/ArtifactoryUploaderTestData/NugetComparisonBOM.json b/TestFiles/IntegrationTestFiles/ArtifactoryUploaderTestData/NugetComparisonBOM.json index 99917c02..de3b4cfb 100644 --- a/TestFiles/IntegrationTestFiles/ArtifactoryUploaderTestData/NugetComparisonBOM.json +++ b/TestFiles/IntegrationTestFiles/ArtifactoryUploaderTestData/NugetComparisonBOM.json @@ -42,23 +42,23 @@ "Components": null, "Properties": [ { - "Name": "internal", + "Name": "internal:siemens:clearing:development", "Value": "false" }, { - "Name": "ArtifactoryRepoName", + "Name": "internal:siemens:clearing:repo-name", "Value": "siparty-release-nuget-egll" }, { - "Name": "ProjectType", + "Name": "internal:siemens:clearing:project-type", "Value": "NUGET" }, { - "Name": "ApprovedStatus", + "Name": "internal:siemens:clearing:clearing-state", "Value": "APPROVED" }, { - "Name": "ReleaseLink", + "Name": "internal:siemens:clearing:sw360:release-url", "Value": "http://localhost:8090/resource/api/releases/48fe0619e8f64cc3a5c1563bf15e6240" } ], @@ -87,23 +87,23 @@ "Components": null, "Properties": [ { - "Name": "internal", + "Name": "internal:siemens:clearing:development", "Value": "false" }, { - "Name": "ArtifactoryRepoName", + "Name": "internal:siemens:clearing:repo-name", "Value": "siparty-release-nuget-egll" }, { - "Name": "ProjectType", + "Name": "internal:siemens:clearing:project-type", "Value": "NUGET" }, { - "Name": "ApprovedStatus", + "Name": "internal:siemens:clearing:clearing-state", "Value": "Not Available" }, { - "Name": "ReleaseLink", + "Name": "internal:siemens:clearing:sw360:release-url", "Value": "http://localhost:8090/resource/api/releases/eb5f54a94a544138a86bc423d66a4bb1" } ], diff --git a/src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs b/src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs index 154fdc78..7ec44793 100644 --- a/src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs +++ b/src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs @@ -21,6 +21,7 @@ using LCT.Services.Interface; using LCT.Services; using UnitTestUtilities; +using LCT.ArtifactoryUploader.Model; namespace AritfactoryUploader.UTest { @@ -42,6 +43,7 @@ public async Task UploadPackageToRepo_InputEmptyCreds_ReturnsPackgeNotFound() JFrogApi = UTParams.JFrogURL }; ArtfactoryUploader.jFrogService = GetJfrogService(appSettings); + DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); var componentsToArtifactory = new ComponentsToArtifactory { Name = "html5lib", @@ -63,7 +65,7 @@ public async Task UploadPackageToRepo_InputEmptyCreds_ReturnsPackgeNotFound() }; //Act - var responseMessage = await ArtfactoryUploader.UploadPackageToRepo(componentsToArtifactory, 100); + var responseMessage = await ArtfactoryUploader.UploadPackageToRepo(componentsToArtifactory, 100, displayPackagesInfo); Assert.AreEqual(HttpStatusCode.NotFound, responseMessage.StatusCode); Assert.AreEqual("Package Not Found", responseMessage.ReasonPhrase); diff --git a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs index 703e9e9a..43f7d3d2 100644 --- a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs +++ b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs @@ -16,6 +16,7 @@ using UnitTestUtilities; using System.Threading.Tasks; using System.Linq; +using LCT.ArtifactoryUploader.Model; namespace AritfactoryUploader.UTest { @@ -64,6 +65,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenFewApprovedCompone List componentLists = GetComponentList(); string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string outFolder = Path.GetDirectoryName(exePath); + DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); CommonAppSettings appSettings = new CommonAppSettings() { ArtifactoryUploadApiKey = "wfwfwfwfwegwgweg", @@ -76,7 +78,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenFewApprovedCompone }; //Act - List uploadList = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, appSettings); + List uploadList = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, appSettings, displayPackagesInfo); // Assert Assert.That(3, Is.EqualTo(uploadList.Count), "Checks for 2 no of components to upload"); } @@ -87,6 +89,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenAllApprovedCompone { //Arrange List componentLists = GetComponentList(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); foreach (var component in componentLists) { if (component.Name == "@angular/core") @@ -108,7 +111,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenAllApprovedCompone }; //Act - List uploadList = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, appSettings); + List uploadList = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, appSettings, displayPackagesInfo); // Assert Assert.That(4, Is.EqualTo(uploadList.Count), "Checks for 3 no of components to upload"); @@ -119,6 +122,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenNotApprovedCompone { //Arrange List componentLists = GetComponentList(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); foreach (var component in componentLists) { component.Properties[1].Value = "NEW_CLEARING"; @@ -136,7 +140,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenNotApprovedCompone }; //Act - List uploadList =await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, appSettings); + List uploadList =await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, appSettings, displayPackagesInfo); // Assert Assert.That(0, Is.EqualTo(uploadList.Count), "Checks for components to upload to be zero"); diff --git a/src/AritfactoryUploader.UTest/PackageUploaderTest.cs b/src/AritfactoryUploader.UTest/PackageUploaderTest.cs index 058e546b..c48844b4 100644 --- a/src/AritfactoryUploader.UTest/PackageUploaderTest.cs +++ b/src/AritfactoryUploader.UTest/PackageUploaderTest.cs @@ -20,6 +20,10 @@ using LCT.Facade.Interfaces; using LCT.Facade; using LCT.Services; +using CycloneDX.Models; +using LCT.Common.Constants; +using LCT.Common.Model; +using System.Collections.Generic; namespace AritfactoryUploader.UTest { @@ -69,6 +73,89 @@ public async Task UploadPackageToArtifactory_GivenAppsettings() Assert.That(2, Is.EqualTo(PackageUploader.uploaderKpiData.PackagesNotUploadedDueToError), "Checks for no of components not uploaded due to error"); } + [Test] + public void DisplayAllSettings_GivenListOfComponents_ReturnPackageSettings() + { + //Arrange + CommonAppSettings CommonAppSettings = new CommonAppSettings() + { + + JFrogApi = UTParams.JFrogURL, + Npm = new Config + { + JfrogThirdPartyDestRepoName = "npm-test", + JfrogDevDestRepoName = "npm-test", + JfrogInternalDestRepoName = "npm-test", + Include = { }, + Exclude = { }, + }, + Conan = new Config + { + JfrogThirdPartyDestRepoName = "conan-test", + JfrogDevDestRepoName = "conan-test", + JfrogInternalDestRepoName = "conan-test", + Include = { }, + Exclude = { }, + }, + Nuget = new Config + { + JfrogThirdPartyDestRepoName = "nuget-test", + JfrogDevDestRepoName = "nuget-test", + JfrogInternalDestRepoName = "nuget-test", + Include = { }, + Exclude = { }, + }, + Python = new Config + { + JfrogThirdPartyDestRepoName = "python-test", + JfrogDevDestRepoName = "python-test", + JfrogInternalDestRepoName = "python-test", + Include = { }, + Exclude = { }, + }, + Maven = new Config + { + JfrogThirdPartyDestRepoName = "maven-test", + JfrogDevDestRepoName = "maven-test", + JfrogInternalDestRepoName = "maven-test", + Include = { }, + Exclude = { }, + }, + Debian = new Config + { + JfrogThirdPartyDestRepoName = "debian-test", + JfrogDevDestRepoName = "debian-test", + JfrogInternalDestRepoName = "debian-test", + Include = { }, + Exclude = { }, + }, + TimeOut = 100, + Release = false + }; + List m_ComponentsInBOM = new() + { + new Component { + Name="test", + Version="1.0.0", + Properties=new List() + { + new Property{Name=Dataconstant.Cdx_ProjectType,Value="NPM"}, + new Property{Name=Dataconstant.Cdx_ProjectType,Value="CONAN"}, + new Property{Name=Dataconstant.Cdx_ProjectType,Value="NUGET"}, + new Property{Name=Dataconstant.Cdx_ProjectType,Value="MAVEN"}, + new Property{Name=Dataconstant.Cdx_ProjectType,Value="DEBIAN"}, + new Property{Name=Dataconstant.Cdx_ProjectType,Value="PYTHON"} + } + } + }; + //Act + PackageUploader.DisplayAllSettings(m_ComponentsInBOM, CommonAppSettings); + + //Assert + Assert.IsTrue(true); + } + + private static IJFrogService GetJfrogService(CommonAppSettings appSettings) { diff --git a/src/ArtifactoryUploader/ArtifactoryUploader.cs b/src/ArtifactoryUploader/ArtifactoryUploader.cs index 5b6bc282..5e3c1777 100644 --- a/src/ArtifactoryUploader/ArtifactoryUploader.cs +++ b/src/ArtifactoryUploader/ArtifactoryUploader.cs @@ -8,6 +8,7 @@ using LCT.APICommunications.Interfaces; using LCT.APICommunications.Model; using LCT.APICommunications.Model.AQL; +using LCT.ArtifactoryUploader.Model; using LCT.Services.Interface; using log4net; using System; @@ -28,7 +29,7 @@ public static class ArtfactoryUploader private static string srcRepoName = Environment.GetEnvironmentVariable("JfrogSrcRepo"); public static IJFrogService jFrogService { get; set; } - public static async Task UploadPackageToRepo(ComponentsToArtifactory component, int timeout) + public static async Task UploadPackageToRepo(ComponentsToArtifactory component, int timeout, DisplayPackagesInfo displayPackagesInfo) { Logger.Debug("Starting UploadPackageToArtifactory method"); string operationType = component.PackageType == PackageType.ClearedThirdParty || component.PackageType == PackageType.Development ? "copy" : "move"; @@ -77,8 +78,7 @@ public static async Task UploadPackageToRepo(ComponentsToAr return responsemessage; } - Logger.Info($"Successful{dryRunSuffix} {operationType} package {component.PackageName}-{component.Version}" + - $" from {component.SrcRepoName} to {component.DestRepoName}"); + await PackageUploadHelper.JfrogFoundPackagesAsync(component, displayPackagesInfo, operationType, responsemessage, dryRunSuffix); } catch (HttpRequestException ex) diff --git a/src/ArtifactoryUploader/Model/DisplayPackagesInfo.cs b/src/ArtifactoryUploader/Model/DisplayPackagesInfo.cs new file mode 100644 index 00000000..532813ea --- /dev/null +++ b/src/ArtifactoryUploader/Model/DisplayPackagesInfo.cs @@ -0,0 +1,42 @@ +// -------------------------------------------------------------------------------------------------------------------- +// SPDX-FileCopyrightText: 2024 Siemens AG +// +// SPDX-License-Identifier: MIT +// -------------------------------------------------------------------------------------------------------------------- +using LCT.APICommunications.Model; +using System.Collections.Generic; + +namespace LCT.ArtifactoryUploader.Model +{ + /// + /// The Model class for UnkmownPackagesAll + /// + public class DisplayPackagesInfo + { + public List UnknownPackagesNpm { get; set; } + public List UnknownPackagesNuget { get; set; } + public List UnknownPackagesConan { get; set; } + public List UnknownPackagesPython { get; set; } + public List UnknownPackagesDebian { get; set; } + public List UnknownPackagesMaven { get; set; } + public List JfrogNotFoundPackagesNpm { get; set; } + public List JfrogNotFoundPackagesNuget { get; set; } + public List JfrogNotFoundPackagesConan { get; set; } + public List JfrogNotFoundPackagesPython { get; set; } + public List JfrogNotFoundPackagesDebian { get; set; } + public List JfrogNotFoundPackagesMaven { get; set; } + public List JfrogFoundPackagesNpm { get; set; } + public List JfrogFoundPackagesNuget { get; set; } + public List JfrogFoundPackagesConan { get; set; } + public List JfrogFoundPackagesPython { get; set; } + public List JfrogFoundPackagesDebian { get; set; } + public List JfrogFoundPackagesMaven { get; set; } + public List SuccessfullPackagesNpm { get; set; } + public List SuccessfullPackagesNuget { get; set; } + public List SuccessfullPackagesConan { get; set; } + public List SuccessfullPackagesPython { get; set; } + public List SuccessfullPackagesDebian { get; set; } + public List SuccessfullPackagesMaven { get; set; } + + } +} diff --git a/src/ArtifactoryUploader/PackageUploadHelper.cs b/src/ArtifactoryUploader/PackageUploadHelper.cs index 2116cdd0..c1f76582 100644 --- a/src/ArtifactoryUploader/PackageUploadHelper.cs +++ b/src/ArtifactoryUploader/PackageUploadHelper.cs @@ -64,7 +64,7 @@ public static Bom GetComponentListFromComparisonBOM(string comparisionBomFilePat return componentsToBoms; } - public async static Task> GetComponentsToBeUploadedToArtifactory(List comparisonBomData, CommonAppSettings appSettings) + public async static Task> GetComponentsToBeUploadedToArtifactory(List comparisonBomData, CommonAppSettings appSettings, DisplayPackagesInfo displayPackagesInfo) { Logger.Debug("Starting GetComponentsToBeUploadedToArtifactory() method"); List componentsToBeUploaded = new List(); @@ -112,13 +112,334 @@ public async static Task> GetComponentsToBeUploade { PackageUploader.uploaderKpiData.ComponentNotApproved++; PackageUploader.uploaderKpiData.PackagesNotUploadedToJfrog++; - Logger.Warn($"Package {item.Name}-{item.Version} is not in report approved state,hence artifactory upload will not be done!"); + await AddUnknownPackagesAsync(item, displayPackagesInfo); } } Logger.Debug("Ending GetComponentsToBeUploadedToArtifactory() method"); return componentsToBeUploaded; } + public static DisplayPackagesInfo GetComponentsToBePackages() + { + DisplayPackagesInfo displayPackagesInfo = new DisplayPackagesInfo(); + displayPackagesInfo.UnknownPackagesNpm = new List(); + displayPackagesInfo.UnknownPackagesNuget = new List(); + displayPackagesInfo.UnknownPackagesMaven = new List(); + displayPackagesInfo.UnknownPackagesConan = new List(); + displayPackagesInfo.UnknownPackagesPython = new List(); + displayPackagesInfo.UnknownPackagesDebian = new List(); + displayPackagesInfo.JfrogNotFoundPackagesNpm = new List(); + displayPackagesInfo.JfrogNotFoundPackagesNuget = new List(); + displayPackagesInfo.JfrogNotFoundPackagesPython = new List(); + displayPackagesInfo.JfrogNotFoundPackagesMaven = new List(); + displayPackagesInfo.JfrogNotFoundPackagesConan = new List(); + displayPackagesInfo.JfrogNotFoundPackagesDebian = new List(); + displayPackagesInfo.JfrogFoundPackagesNpm = new List(); + displayPackagesInfo.JfrogFoundPackagesNuget = new List(); + displayPackagesInfo.JfrogFoundPackagesPython = new List(); + displayPackagesInfo.JfrogFoundPackagesMaven = new List(); + displayPackagesInfo.JfrogFoundPackagesConan = new List(); + displayPackagesInfo.JfrogFoundPackagesDebian = new List(); + displayPackagesInfo.SuccessfullPackagesNpm = new List(); + displayPackagesInfo.SuccessfullPackagesNuget = new List(); + displayPackagesInfo.SuccessfullPackagesPython = new List(); + displayPackagesInfo.SuccessfullPackagesMaven = new List(); + displayPackagesInfo.SuccessfullPackagesConan = new List(); + displayPackagesInfo.SuccessfullPackagesDebian = new List(); + + + return displayPackagesInfo; + + } + + private static void DisplaySortedForeachComponents(List unknownPackages, List JfrogNotFoundPackages, List SucessfullPackages, List JfrogFoundPackages, string name) + { + if (unknownPackages.Any() || JfrogNotFoundPackages.Any() || SucessfullPackages.Any() || JfrogFoundPackages.Any()) + { + Logger.Info("\n" + name + "\n"); + DisplayErrorForUnknownPackages(unknownPackages); + DisplayErrorForJfrogFoundPackages(JfrogFoundPackages); + DisplayErrorForJfrogPackages(JfrogNotFoundPackages); + DisplayErrorForSucessfullPackages(SucessfullPackages); + } + + } + + private static void DisplayErrorForJfrogFoundPackages(List JfrogFoundPackages) + { + + if (JfrogFoundPackages.Any()) + { + + foreach (var jfrogFoundPackage in JfrogFoundPackages) + { + Logger.Info($"Successful{jfrogFoundPackage.DryRunSuffix} {jfrogFoundPackage.OperationType} package {jfrogFoundPackage.PackageName}-{jfrogFoundPackage.Version}" + + $" from {jfrogFoundPackage.SrcRepoName} to {jfrogFoundPackage.DestRepoName}"); + + if (jfrogFoundPackage.ResponseMessage.ReasonPhrase == ApiConstant.ErrorInUpload) + { + Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} {jfrogFoundPackage.OperationType} Failed!! {jfrogFoundPackage.SrcRepoName} ---> {jfrogFoundPackage.DestRepoName}"); + } + else if (jfrogFoundPackage.ResponseMessage.ReasonPhrase == ApiConstant.PackageNotFound) + { + Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} not found in {jfrogFoundPackage.SrcRepoName}, Upload Failed!!"); + } + + } + Logger.Info("\n"); + + } + } + + private static void DisplayErrorForJfrogPackages(List JfrogNotFoundPackages) + { + + if (JfrogNotFoundPackages.Any()) + { + + foreach (var jfrogNotFoundPackage in JfrogNotFoundPackages) + { + Logger.Warn($"Package {jfrogNotFoundPackage.Name}-{jfrogNotFoundPackage.Version} is not found in jfrog"); + + } + Logger.Info("\n"); + + } + } + private static void DisplayErrorForUnknownPackages(List unknownPackages) + { + + if (unknownPackages.Any()) + { + + foreach (var unknownPackage in unknownPackages) + { + Logger.Warn($"Package {unknownPackage.Name}-{unknownPackage.Version} is not in report approved state,hence artifactory upload will not be done!"); + } + Logger.Info("\n"); + + } + } + private static void DisplayErrorForSucessfullPackages(List SucessfullPackages) + { + + if (SucessfullPackages.Any()) + { + + foreach (var sucessfullPackage in SucessfullPackages) + { + Logger.Info($"Package {sucessfullPackage.Name}-{sucessfullPackage.Version} is already uploaded"); + } + Logger.Info("\n"); + + } + } + public static void DisplayPackageUploadInformation(DisplayPackagesInfo displayPackagesInfo) + { + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesNpm, displayPackagesInfo.JfrogNotFoundPackagesNpm, displayPackagesInfo.SuccessfullPackagesNpm, displayPackagesInfo.JfrogFoundPackagesNpm, "NPM:"); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesNuget, displayPackagesInfo.JfrogNotFoundPackagesNuget, displayPackagesInfo.SuccessfullPackagesNuget, displayPackagesInfo.JfrogFoundPackagesNuget, "Nuget:"); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesMaven, displayPackagesInfo.JfrogNotFoundPackagesMaven, displayPackagesInfo.SuccessfullPackagesMaven, displayPackagesInfo.JfrogFoundPackagesMaven, "Maven:"); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesConan, displayPackagesInfo.JfrogNotFoundPackagesConan, displayPackagesInfo.SuccessfullPackagesConan, displayPackagesInfo.JfrogFoundPackagesConan, "Conan:"); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesPython, displayPackagesInfo.JfrogNotFoundPackagesPython, displayPackagesInfo.SuccessfullPackagesPython, displayPackagesInfo.JfrogFoundPackagesPython, "Python:"); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesDebian, displayPackagesInfo.JfrogNotFoundPackagesDebian, displayPackagesInfo.SuccessfullPackagesDebian, displayPackagesInfo.JfrogFoundPackagesDebian, "Debian:"); + + } + + private static Task GetUnknownPackageinfo(Component item) + { + + ComponentsToArtifactory components = new ComponentsToArtifactory() + { + Name = item.Name, + Version = item.Version + }; + return Task.FromResult(components); + + } + + private static Task GetPackageinfo(ComponentsToArtifactory item, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) + { + + ComponentsToArtifactory components = new ComponentsToArtifactory() + { + Name = item.Name, + Version = item.Version, + SrcRepoName = item.SrcRepoName, + DestRepoName = item.DestRepoName, + OperationType = operationType, + ResponseMessage = responseMessage, + DryRunSuffix = dryRunSuffix + + }; + return Task.FromResult(components); + + } + private static Task GetSucessFulPackageinfo(ComponentsToArtifactory item) + { + + ComponentsToArtifactory components = new ComponentsToArtifactory() + { + Name = item.Name, + Version = item.Version, + + }; + return Task.FromResult(components); + + } + + private static async Task AddUnknownPackagesAsync(Component item, DisplayPackagesInfo displayPackagesInfo) + { + string GetPropertyValue(string propertyName) => + item.Properties + .Find(p => p.Name == propertyName)? + .Value? + .ToUpperInvariant(); + + if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "NPM") + { + + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesNpm.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "NUGET") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesNuget.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "MAVEN") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesPython.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "PYTHON") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesMaven.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "CONAN") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesConan.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "DEBIAN") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesDebian.Add(components); + } + + } + + private static async Task JfrogNotFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) + { + + if (item.ComponentType == "NPM") + { + + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesNpm.Add(components); + } + else if (item.ComponentType == "NUGET") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesNuget.Add(components); + } + else if (item.ComponentType == "MAVEN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesMaven.Add(components); + } + else if (item.ComponentType == "PYTHON") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesPython.Add(components); + } + else if (item.ComponentType == "CONAN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesConan.Add(components); + } + else if (item.ComponentType == "DEBIAN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesDebian.Add(components); + } + + } + + public static async Task JfrogFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) + { + + if (item.ComponentType == "NPM") + { + + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesNpm.Add(components); + } + else if (item.ComponentType == "NUGET") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesNuget.Add(components); + } + else if (item.ComponentType == "MAVEN") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesMaven.Add(components); + } + else if (item.ComponentType == "PYTHON") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesPython.Add(components); + } + else if (item.ComponentType == "CONAN") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesConan.Add(components); + } + else if (item.ComponentType == "DEBIAN") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesDebian.Add(components); + } + + } + private static async Task SucessfullPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) + { + + if (item.ComponentType == "NPM") + { + + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesNpm.Add(components); + } + else if (item.ComponentType == "NUGET") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesNuget.Add(components); + } + else if (item.ComponentType == "MAVEN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesMaven.Add(components); + } + else if (item.ComponentType == "PYTHON") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.UnknownPackagesPython.Add(components); + } + else if (item.ComponentType == "CONAN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesConan.Add(components); + } + else if (item.ComponentType == "DEBIAN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesDebian.Add(components); + } + + } + + private static PackageType GetPackageType(Component item) { string GetPropertyValue(string propertyName) => @@ -388,12 +709,12 @@ private async static Task GetSrcRepoDetailsForPyPiOrConanPackages(Com return null; } - public static async Task UploadingThePackages(List componentsToUpload, int timeout) + public static async Task UploadingThePackages(List componentsToUpload, int timeout, DisplayPackagesInfo displayPackagesInfo) { Logger.Debug("Starting UploadingThePackages() method"); foreach (var item in componentsToUpload) { - await PackageUploadToArtifactory(PackageUploader.uploaderKpiData, item, timeout); + await PackageUploadToArtifactory(PackageUploader.uploaderKpiData, item, timeout, displayPackagesInfo); } if (SetWarningCode) @@ -406,7 +727,7 @@ public static async Task UploadingThePackages(List comp Program.UploaderStopWatch?.Stop(); } - private static async Task PackageUploadToArtifactory(UploaderKpiData uploaderKpiData, ComponentsToArtifactory item, int timeout) + private static async Task PackageUploadToArtifactory(UploaderKpiData uploaderKpiData, ComponentsToArtifactory item, int timeout, DisplayPackagesInfo displayPackagesInfo) { var packageType = item.PackageType; @@ -414,46 +735,52 @@ private static async Task PackageUploadToArtifactory(UploaderKpiData uploaderKpi { if (!(item.SrcRepoName.Contains("Not Found in JFrog"))) { - string operationType = item.PackageType == PackageType.ClearedThirdParty || item.PackageType == PackageType.Development ? "copy" : "move"; - ArtfactoryUploader.jFrogService = jFrogService; - HttpResponseMessage responseMessage = await ArtfactoryUploader.UploadPackageToRepo(item, timeout); - - if (responseMessage.StatusCode == HttpStatusCode.OK && !item.DryRun) - { - IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, true); - } - else if (responseMessage.ReasonPhrase == ApiConstant.PackageNotFound) - { - Logger.Error($"Package {item.Name}-{item.Version} not found in {item.SrcRepoName}, Upload Failed!!"); - IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, false); - item.DestRepoName = null; - SetWarningCode = true; - } - else if (responseMessage.ReasonPhrase == ApiConstant.ErrorInUpload) - { - Logger.Error($"Package {item.Name}-{item.Version} {operationType} Failed!! {item.SrcRepoName} ---> {item.DestRepoName}"); - IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, false); - item.DestRepoName = null; - var responseContent = await responseMessage.Content.ReadAsStringAsync(); - Logger.Debug($"JFrog Response - {responseContent}"); - } - else - { - // do nothing - } + await SourceRepoFoundToUploadArtifactory(packageType, uploaderKpiData, item, timeout, displayPackagesInfo); } else { uploaderKpiData.PackagesNotExistingInRemoteCache++; item.DestRepoName = null; - Logger.Warn($"Package {item.Name}-{item.Version} is not found in jfrog"); + await JfrogNotFoundPackagesAsync(item, displayPackagesInfo); } } else { IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, true); - Logger.Info($"Package {item.Name}-{item.Version} is already uploaded"); + await SucessfullPackagesAsync(item, displayPackagesInfo); + item.DestRepoName = null; + } + } + + private static async Task SourceRepoFoundToUploadArtifactory(PackageType packageType, UploaderKpiData uploaderKpiData, ComponentsToArtifactory item, int timeout, DisplayPackagesInfo displayPackagesInfo) + { + const string dryRunSuffix = null; + string operationType = item.PackageType == PackageType.ClearedThirdParty || item.PackageType == PackageType.Development ? "copy" : "move"; + ArtfactoryUploader.jFrogService = jFrogService; + HttpResponseMessage responseMessage = await ArtfactoryUploader.UploadPackageToRepo(item, timeout, displayPackagesInfo); + + if (responseMessage.StatusCode == HttpStatusCode.OK && !item.DryRun) + { + IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, true); + } + else if (responseMessage.ReasonPhrase == ApiConstant.PackageNotFound) + { + await JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); + IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, false); item.DestRepoName = null; + SetWarningCode = true; + } + else if (responseMessage.ReasonPhrase == ApiConstant.ErrorInUpload) + { + await JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); + IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, false); + item.DestRepoName = null; + var responseContent = await responseMessage.Content.ReadAsStringAsync(); + Logger.Debug($"JFrog Response - {responseContent}"); + } + else + { + // do nothing } } diff --git a/src/ArtifactoryUploader/PackageUploader.cs b/src/ArtifactoryUploader/PackageUploader.cs index f8d417f2..ddcde5dd 100644 --- a/src/ArtifactoryUploader/PackageUploader.cs +++ b/src/ArtifactoryUploader/PackageUploader.cs @@ -17,6 +17,8 @@ using System.Linq; using LCT.Common.Constants; using System.IO; +using LCT.Common.Model; +using log4net.Core; namespace LCT.ArtifactoryUploader { @@ -34,16 +36,23 @@ public static async Task UploadPackageToArtifactory(CommonAppSettings appSetting Bom m_ComponentsInBOM = PackageUploadHelper.GetComponentListFromComparisonBOM(appSettings.BomFilePath); + DisplayAllSettings(m_ComponentsInBOM.Components, appSettings); uploaderKpiData.ComponentInComparisonBOM = m_ComponentsInBOM.Components.Count; - List m_ComponentsToBeUploaded = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(m_ComponentsInBOM.Components, appSettings); + DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); + + List m_ComponentsToBeUploaded = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(m_ComponentsInBOM.Components, appSettings, displayPackagesInfo); //Uploading the component to artifactory uploaderKpiData.PackagesToBeUploaded = m_ComponentsToBeUploaded.Count(x => x.PackageType == PackageType.ClearedThirdParty); uploaderKpiData.DevPackagesToBeUploaded = m_ComponentsToBeUploaded.Count(x => x.PackageType == PackageType.Development); uploaderKpiData.InternalPackagesToBeUploaded = m_ComponentsToBeUploaded.Count(x => x.PackageType == PackageType.Internal); - await PackageUploadHelper.UploadingThePackages(m_ComponentsToBeUploaded, appSettings.TimeOut); + await PackageUploadHelper.UploadingThePackages(m_ComponentsToBeUploaded, appSettings.TimeOut, displayPackagesInfo); + + //Display packages information + PackageUploadHelper.DisplayPackageUploadInformation(displayPackagesInfo); + //Updating the component's new location var fileOperations = new FileOperations(); @@ -59,11 +68,69 @@ public static async Task UploadPackageToArtifactory(CommonAppSettings appSetting Logger.Debug($"UploadPackageToArtifactory():End"); // set the error code - if(uploaderKpiData.PackagesNotUploadedDueToError > 0 || uploaderKpiData.PackagesNotExistingInRemoteCache > 0) + if (uploaderKpiData.PackagesNotUploadedDueToError > 0 || uploaderKpiData.PackagesNotExistingInRemoteCache > 0) { Environment.ExitCode = 2; Logger.Debug("Setting ExitCode to 2"); } + + } + public static void DisplayAllSettings(List m_ComponentsInBOM, CommonAppSettings appSettings) + { + Logger.Info("Current Application Settings:"); + List projectTypeList = new(); + foreach (var item in m_ComponentsInBOM) + { + + projectTypeList.Add(item.Properties.First(x => x.Name == Dataconstant.Cdx_ProjectType).Value); + } + var projectType = projectTypeList.Distinct().ToList(); + + for (int i = 0; i < projectType.Count; i++) + { + string type = projectType[i]; + Logger.Info($"{projectType[i]}:\n\t"); + switch (type.ToUpperInvariant()) + { + case "NPM": + PackageSettings(appSettings.Npm); + break; + case "NUGET": + PackageSettings(appSettings.Nuget); + break; + case "MAVEN": + PackageSettings(appSettings.Maven); + break; + case "DEBIAN": + PackageSettings(appSettings.Debian); + break; + case "PYTHON": + PackageSettings(appSettings.Python); + break; + case "CONAN": + PackageSettings(appSettings.Conan); + break; + + default: + Logger.Error($"DiplayAllSettings():Invalid ProjectType - {type}"); + break; + } + + } + + } + + private static void PackageSettings(Config project) + { + + Logger.Logger.Log(null, Level.Notice, $"\tDEVDEP_REPO_NAME:\t`{project.JfrogDevDestRepoName}`\n\t" + + $"THIRD_PARTY_REPO_NAME:\t`{project.JfrogThirdPartyDestRepoName}`\n\t" + + $"INTERNAL_REPO_NAME:\t`{project.JfrogInternalDestRepoName}`\n\t" + + $"Config:\n\t" + + $"Include: \t", null); + project.Include?.ToList().ForEach(x => Logger.Logger.Log(null, Level.Notice, $"\t\t\t\t`{x}`\t", null)); + Logger.Logger.Log(null, Level.Notice, $"\tExclude:", null); + project.Exclude?.ToList().ForEach(x => Logger.Logger.Log(null, Level.Notice, $"\t\t\t\t`{x}`\n\t", null)); } } } diff --git a/src/ArtifactoryUploader/Program.cs b/src/ArtifactoryUploader/Program.cs index c66b1ba0..6ef321a3 100644 --- a/src/ArtifactoryUploader/Program.cs +++ b/src/ArtifactoryUploader/Program.cs @@ -53,12 +53,13 @@ static async Task Main(string[] args) - Logger.Logger.Log(null, Level.Notice, $"Input Parameters used in Artifactory Uploader:\n\t" + - $"BomFilePath\t\t --> {appSettings.BomFilePath}\n\t" + - $"JFrogUrl\t\t --> {appSettings.JFrogApi}\n\t" + - $"Artifactory User\t --> {appSettings.ArtifactoryUploadUser}\n\t" + - $"Release\t\t\t --> {appSettings.Release}\n\t" + - $"LogFolderPath\t\t --> {Path.GetFullPath(FolderPath)}", null); + Logger.Logger.Log(null, Level.Info, $"Input Parameters used in Artifactory Uploader:\n\t", null); + Logger.Logger.Log(null, Level.Notice, $"\tBomFilePath:\t\t {appSettings.BomFilePath}\n\t" + + $"JFrogUrl:\t\t {appSettings.JFrogApi}\n\t" + + $"Artifactory User:\t {appSettings.ArtifactoryUploadUser}\n\t" + + $"Artifactory Token:\t {appSettings.ArtifactoryUploadApiKey}\n\t" + + $"Release:\t\t {appSettings.Release}\n\t" + + $"LogFolderPath:\t\t {Path.GetFullPath(FolderPath)}\n", null); //Validator method to check token validity ArtifactoryCredentials artifactoryCredentials = new ArtifactoryCredentials() diff --git a/src/LCT.APICommunications/Model/ComponentsToArtifactory.cs b/src/LCT.APICommunications/Model/ComponentsToArtifactory.cs index 709ec8a5..3592f3fb 100644 --- a/src/LCT.APICommunications/Model/ComponentsToArtifactory.cs +++ b/src/LCT.APICommunications/Model/ComponentsToArtifactory.cs @@ -4,6 +4,8 @@ // SPDX-License-Identifier: MIT // -------------------------------------------------------------------------------------------------------------------- +using System.Net.Http; + namespace LCT.APICommunications.Model { @@ -30,5 +32,8 @@ public class ComponentsToArtifactory public bool DryRun { get; set; } = true; public string Purl { get; set; } public string JfrogPackageName { get;set; } + public string OperationType { get; set; } + public string DryRunSuffix { get; set; } + public HttpResponseMessage ResponseMessage { get; set; } } } diff --git a/src/LCT.Common/CommonHelper.cs b/src/LCT.Common/CommonHelper.cs index 9f53c3be..b128b7ad 100644 --- a/src/LCT.Common/CommonHelper.cs +++ b/src/LCT.Common/CommonHelper.cs @@ -64,7 +64,7 @@ public static string GetSubstringOfLastOccurance(string value, string separator) string result = string.IsNullOrWhiteSpace(value) ? string.Empty : value; if (result.Contains(separator)) { - result = result?[(result.LastIndexOf(separator) + separator.Length)..]; + result = result[(result.LastIndexOf(separator) + separator.Length)..]; } return result; diff --git a/src/LCT.Common/FolderAction.cs b/src/LCT.Common/FolderAction.cs index 9e1e5b83..733cc158 100644 --- a/src/LCT.Common/FolderAction.cs +++ b/src/LCT.Common/FolderAction.cs @@ -118,7 +118,7 @@ public bool ZipFileToTargetDirectory(string targetDirectory) return isZiped; } - private void CopyAll(DirectoryInfo source, DirectoryInfo target) + private static void CopyAll(DirectoryInfo source, DirectoryInfo target) { Logger.Debug("FolderAction.CopyAll():Start"); diff --git a/src/LCT.PackageIdentifier/MavenProcessor.cs b/src/LCT.PackageIdentifier/MavenProcessor.cs index cd2ed832..f3098d38 100644 --- a/src/LCT.PackageIdentifier/MavenProcessor.cs +++ b/src/LCT.PackageIdentifier/MavenProcessor.cs @@ -52,11 +52,11 @@ public Bom ParsePackageFile(CommonAppSettings appSettings) if (componentsForBOM.Count == 0) { - componentsForBOM.AddRange(bomList?.Components); + componentsForBOM.AddRange(bomList.Components); } else { - componentsToBOM.AddRange(bomList?.Components); + componentsToBOM.AddRange(bomList.Components); } if (bomList.Dependencies != null) diff --git a/src/LCT.PackageIdentifier/NpmProcessor.cs b/src/LCT.PackageIdentifier/NpmProcessor.cs index 6f0894a3..8d316c82 100644 --- a/src/LCT.PackageIdentifier/NpmProcessor.cs +++ b/src/LCT.PackageIdentifier/NpmProcessor.cs @@ -104,7 +104,7 @@ public List ParsePackageLockJson(string filepath, CommonAppSettings a var pacakages = jsonDeserialized["packages"]; if (pacakages?.Children() != null) { - IEnumerable depencyComponentList = pacakages?.Children().OfType(); + IEnumerable depencyComponentList = pacakages.Children().OfType(); GetPackagesForBom(filepath, ref bundledComponents, ref lstComponentForBOM, ref noOfDevDependent, depencyComponentList); } @@ -181,7 +181,7 @@ private static void GetPackagesForBom(string filepath, ref List TriggerFossologyProcess(ComparisonBomData item, FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcess(item.ReleaseID, sw360link); if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) { - Logger.Debug($"{fossResult?.Content?.Message}"); - uploadId = await CheckFossologyProcessStatus(fossResult?.Links?.Self?.Href, sw360CreatorService); + Logger.Debug($"{fossResult.Content?.Message}"); + uploadId = await CheckFossologyProcessStatus(fossResult.Links?.Self?.Href, sw360CreatorService); } } @@ -477,7 +477,7 @@ private static async Task CheckFossologyProcessStatus(string link, ISw36 CheckFossologyProcess fossResult = await sw360CreatorService.CheckFossologyProcessStatus(link); if (!string.IsNullOrEmpty(fossResult?.FossologyProcessInfo?.ExternalTool)) { - uploadId = fossResult?.FossologyProcessInfo?.ProcessSteps[0]?.ProcessStepIdInTool; + uploadId = fossResult.FossologyProcessInfo?.ProcessSteps[0]?.ProcessStepIdInTool; } } catch (AggregateException ex) diff --git a/src/LCT.SW360PackageCreator/PackageDownloader.cs b/src/LCT.SW360PackageCreator/PackageDownloader.cs index c70d9136..2a73ad38 100644 --- a/src/LCT.SW360PackageCreator/PackageDownloader.cs +++ b/src/LCT.SW360PackageCreator/PackageDownloader.cs @@ -146,7 +146,7 @@ private static Result ListTagsOfComponent(ComparisonBomData component) const int timeOutMs = 200 * 60 * 1000; var processResult = ProcessAsyncHelper.RunAsync(p.StartInfo, timeOutMs); Result result = processResult?.Result ?? new Result(); - Logger.Debug($"GetCorrectVersion:{gitCommand}:{result?.ExitCode}, output:{result?.StdOut}, Error:{result?.StdErr}"); + Logger.Debug($"GetCorrectVersion:{gitCommand}:{result.ExitCode}, output:{result?.StdOut}, Error:{result.StdErr}"); return result; } diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index 8be17d0b..0b902f60 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -230,7 +230,7 @@ private string AttachSourceAndBinary(Dictionary attachmentUrlLis if (response.Content != null) { - string responseString = response?.Content?.ReadAsStringAsync()?.Result ?? string.Empty; + string responseString = response.Content?.ReadAsStringAsync()?.Result ?? string.Empty; var responseData = JsonConvert.DeserializeObject(responseString); string href = responseData?.Links?.Self?.Href ?? string.Empty; releaseId = CommonHelper.GetSubstringOfLastOccurance(href, "/"); diff --git a/src/LCT.Services/Sw360ProjectService.cs b/src/LCT.Services/Sw360ProjectService.cs index dd2369cc..fbdcc75c 100644 --- a/src/LCT.Services/Sw360ProjectService.cs +++ b/src/LCT.Services/Sw360ProjectService.cs @@ -89,7 +89,7 @@ public async Task> GetAlreadyLinkedReleasesByProjectId(strin Logger.Debug($"GetProjectReleasesByProjectIdFromSw360():Success StatusCode:{projectResponsebyId.StatusCode} " + $"& ReasonPhrase :{projectResponsebyId.ReasonPhrase}"); - string result = projectResponsebyId?.Content?.ReadAsStringAsync()?.Result ?? string.Empty; + string result = projectResponsebyId.Content?.ReadAsStringAsync()?.Result ?? string.Empty; var projectReleases = JsonConvert.DeserializeObject(result); var sw360LinkedReleases = projectReleases?.LinkedReleases ?? new List(); foreach (Sw360LinkedRelease sw360Release in sw360LinkedReleases) diff --git a/src/LCT.Services/Sw360Service.cs b/src/LCT.Services/Sw360Service.cs index 18b3f8ea..1f34774d 100644 --- a/src/LCT.Services/Sw360Service.cs +++ b/src/LCT.Services/Sw360Service.cs @@ -315,14 +315,14 @@ private static bool CheckAvailabilityByNameAndVersion(IList sw360 //checking for release existance with name and version bool isReleaseAvailable = false; Sw360Releases sw360Release = - sw360Releases.FirstOrDefault(x => x.Name?.Trim()?.ToLowerInvariant() == component?.Name?.Trim()?.ToLowerInvariant() - && x.Version?.Trim()?.ToLowerInvariant() == component?.Version?.Trim()?.ToLowerInvariant()); + sw360Releases.FirstOrDefault(x => x.Name?.Trim().ToLowerInvariant() == component?.Name?.Trim().ToLowerInvariant() + && x.Version?.Trim().ToLowerInvariant() == component?.Version?.Trim().ToLowerInvariant()); if (sw360Release == null && component.ReleaseExternalId.Contains(Dataconstant.PurlCheck()["DEBIAN"])) { - string debianVersion = $"{component?.Version?.Trim()?.ToLowerInvariant() ?? string.Empty}.debian"; - sw360Release = sw360Releases.FirstOrDefault(x => x.Name?.Trim()?.ToLowerInvariant() == component?.Name?.Trim()?.ToLowerInvariant() - && x.Version?.Trim()?.ToLowerInvariant() == debianVersion); + string debianVersion = $"{component?.Version?.Trim().ToLowerInvariant() ?? string.Empty}.debian"; + sw360Release = sw360Releases.FirstOrDefault(x => x.Name?.Trim().ToLowerInvariant() == component?.Name?.Trim().ToLowerInvariant() + && x.Version?.Trim().ToLowerInvariant() == debianVersion); } if (sw360Release != null) @@ -362,7 +362,7 @@ private static bool CheckAvailabilityByName(IList sw360Componen //checking for component existance with name bool isComponentAvailable = false; Sw360Components sw360Component = - sw360Components.FirstOrDefault(x => x.Name?.Trim()?.ToLowerInvariant() == component?.Name?.Trim()?.ToLowerInvariant()); + sw360Components.FirstOrDefault(x => x.Name?.Trim().ToLowerInvariant() == component?.Name?.Trim().ToLowerInvariant()); if (sw360Component != null) { availableComponentList.Add(new Components() From d8917bed3224edc7a02b9ee147e117699a4bc634 Mon Sep 17 00:00:00 2001 From: Sumanth K B Date: Tue, 19 Mar 2024 13:39:47 +0530 Subject: [PATCH 05/29] AppSetting Exception Handling --- src/ArtifactoryUploader/Program.cs | 2 +- src/LCT.Common/SettingsManager.cs | 130 ++++++++++++++++++++++++- src/LCT.PackageIdentifier/Program.cs | 2 +- src/LCT.SW360PackageCreator/Program.cs | 2 +- 4 files changed, 132 insertions(+), 4 deletions(-) diff --git a/src/ArtifactoryUploader/Program.cs b/src/ArtifactoryUploader/Program.cs index 6ef321a3..4bc0958e 100644 --- a/src/ArtifactoryUploader/Program.cs +++ b/src/ArtifactoryUploader/Program.cs @@ -39,7 +39,7 @@ static async Task Main(string[] args) if (!m_Verbose && CommonHelper.IsAzureDevOpsDebugEnabled()) m_Verbose = true; - ISettingsManager settingsManager = new SettingsManager(); + ISettingsManager settingsManager = new SettingsManager("Uploader"); CommonAppSettings appSettings = settingsManager.ReadConfiguration(args, FileConstant.appSettingFileName); string FolderPath = InitiateLogger(appSettings); diff --git a/src/LCT.Common/SettingsManager.cs b/src/LCT.Common/SettingsManager.cs index 0d9b30da..1bb2dcc7 100644 --- a/src/LCT.Common/SettingsManager.cs +++ b/src/LCT.Common/SettingsManager.cs @@ -9,9 +9,12 @@ using log4net.Core; using Microsoft.Extensions.Configuration; using System; -using System.Diagnostics; +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Reflection; +using System.Text; +using System.Threading; namespace LCT.Common { @@ -22,6 +25,12 @@ public class SettingsManager : ISettingsManager { public string BasePath { get; private set; } = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly string _currentExe; + + public SettingsManager(string currentExe) + { + _currentExe = currentExe; + } /// /// Reads the Configuration from input args and json setting file @@ -65,6 +74,10 @@ public T ReadConfiguration(string[] args, string jsonSettingsFileName) throw new InvalidDataException(nameof(appSettings)); } + else + { + CheckRequiredArgsToRun(appSettings as CommonAppSettings, _currentExe); + } Logger.Debug($"ReadConfiguration():End"); @@ -109,6 +122,121 @@ internal string GetConfigFilePathFromArgs(string[] args, string jsonSettingsFile return settingsFilePath; } + private void CheckRequiredArgsToRun(CommonAppSettings commonAppSettings, string runningExe) + { + Type type = commonAppSettings.GetType(); + PropertyInfo[] properties = type.GetProperties(); + + if (runningExe == "Identifer") + { + CheckRequiredArgsToRunPackageIdentifier(commonAppSettings, properties); + } + else if (runningExe == "Creator") + { + CheckRequiredArgsToRunComponentCreator(commonAppSettings, properties); + } + else + { + CheckRequiredArgsToRunArtifactoryUploader(commonAppSettings, properties); + } + } + + private static void CheckRequiredArgsToRunPackageIdentifier(CommonAppSettings appSettings, PropertyInfo[] properties) + { + StringBuilder missingParameters = new StringBuilder(); + + //Required parameters to run Package Identifier + List identifierReqParameters = new List() + { + "SW360ProjectID", + "Sw360Token", + "SW360AuthTokenType", + "SW360URL", + "JFrogApi", + "PackageFilePath", + "BomFolderPath", + "ArtifactoryUploadApiKey", + "InternalRepoList", + "ProjectType" + }; + + foreach (string key in identifierReqParameters) + { + string value = properties.First(x => x.Name == key)?.GetValue(appSettings)?.ToString(); + + if (string.IsNullOrWhiteSpace(value)) + { + missingParameters.Append(key + " "); + } + } + + if (!string.IsNullOrWhiteSpace(missingParameters.ToString())) + { + //LogExceptionHandling.ArgumentException(null, missingParameters.ToString()); + //Logger.Logger.Log(null, Level.Error, $"\t CheckRequiredArgsToRunPackageIdentifier : Missing parameters {missingParameters} ", null); + } + } + + private static void CheckRequiredArgsToRunComponentCreator(CommonAppSettings appSettings, PropertyInfo[] properties) + { + StringBuilder missingParameters = new StringBuilder(); + + //Required parameters to run SW360Component Creator + List creatorReqParameters = new List() + { + "SW360ProjectID", + "Sw360Token", + "SW360AuthTokenType", + "SW360URL", + "BomFilePath" + }; + + foreach (string key in creatorReqParameters) + { + string value = properties.First(x => x.Name == key)?.GetValue(appSettings)?.ToString(); + + if (string.IsNullOrWhiteSpace(value)) + { + missingParameters.Append(key + " "); + } + } + + if (!string.IsNullOrWhiteSpace(missingParameters.ToString())) + { + //LogExceptionHandling.ArgumentException(null, missingParameters.ToString()); + //Logger.Logger.Log(null, Level.Error, $"\t CheckRequiredArgsToRunSw360PackageCreator : Missing parameters {missingParameters} ", null); + } + } + + private static void CheckRequiredArgsToRunArtifactoryUploader(CommonAppSettings appSettings, PropertyInfo[] properties) + { + StringBuilder missingParameters = new StringBuilder(); + + //Required parameters to run Artifactory Uploader + List uploaderReqParameters = new List() + { + "JFrogApi", + "PackageFilePath", + "ArtifactoryUploadApiKey", + }; + + foreach (string key in uploaderReqParameters) + { + string value = properties.First(x => x.Name == key)?.GetValue(appSettings)?.ToString(); + + if (string.IsNullOrWhiteSpace(value)) + { + missingParameters.Append(key + " "); + } + } + + if (!string.IsNullOrWhiteSpace(missingParameters.ToString())) + { + //LogExceptionHandling.ArgumentException(null, missingParameters.ToString()); + //Logger.Logger.Log(null, Level.Error, $"\t CheckRequiredArgsToRunArtifactoryUploader : Missing parameters {missingParameters} ", null); + } + } + } public class SettingsFile diff --git a/src/LCT.PackageIdentifier/Program.cs b/src/LCT.PackageIdentifier/Program.cs index b7b0488e..d610151a 100644 --- a/src/LCT.PackageIdentifier/Program.cs +++ b/src/LCT.PackageIdentifier/Program.cs @@ -45,7 +45,7 @@ static async Task Main(string[] args) if (!m_Verbose && CommonHelper.IsAzureDevOpsDebugEnabled()) m_Verbose = true; - ISettingsManager settingsManager = new SettingsManager(); + ISettingsManager settingsManager = new SettingsManager("Identifer"); CommonAppSettings appSettings = settingsManager.ReadConfiguration(args, FileConstant.appSettingFileName); string FolderPath = LogFolderInitialisation(appSettings); diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index 2446d3c9..49c75456 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -45,7 +45,7 @@ static async Task Main(string[] args) if (!m_Verbose && CommonHelper.IsAzureDevOpsDebugEnabled()) m_Verbose = true; - ISettingsManager settingsManager = new SettingsManager(); + ISettingsManager settingsManager = new SettingsManager("Creator"); CommonAppSettings appSettings = settingsManager.ReadConfiguration(args, FileConstant.appSettingFileName); ISW360ApicommunicationFacade sW360ApicommunicationFacade; ISw360ProjectService sw360ProjectService= Getsw360ProjectServiceObject(appSettings, out sW360ApicommunicationFacade); From 0fa290928bc6aa9f290e35def41f307eeac3946a Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 19 Mar 2024 13:59:50 +0530 Subject: [PATCH 06/29] Exception Handling --- .../ArtifactoryValidator.cs | 16 ++++-- .../SW360Apicommunication.cs | 9 +++- src/LCT.Common/ExceptionHandling.cs | 54 +++++++++++++++++++ src/LCT.SW360PackageCreator/Program.cs | 4 +- src/LCT.Services/JFrogService.cs | 14 ++--- src/LCT.Services/Sw360CreatorService.cs | 10 +++- 6 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 src/LCT.Common/ExceptionHandling.cs diff --git a/src/ArtifactoryUploader/ArtifactoryValidator.cs b/src/ArtifactoryUploader/ArtifactoryValidator.cs index 1fe26f78..923db8fd 100644 --- a/src/ArtifactoryUploader/ArtifactoryValidator.cs +++ b/src/ArtifactoryUploader/ArtifactoryValidator.cs @@ -14,6 +14,7 @@ using System.Reflection; using System.Threading.Tasks; using System.Net; +using System; namespace LCT.ArtifactoryUploader { @@ -30,13 +31,18 @@ public ArtifactoryValidator(NpmJfrogApiCommunication jfrogApiCommunication) public async Task ValidateArtifactoryCredentials(CommonAppSettings appSettings) { - HttpResponseMessage responseMessage = await JfrogApiCommunication.GetApiKey(); - - if (responseMessage.StatusCode != HttpStatusCode.OK) + HttpResponseMessage responseMessage = new HttpResponseMessage(); + try + { + responseMessage = await JfrogApiCommunication.GetApiKey(); + responseMessage.EnsureSuccessStatusCode(); + } + catch(HttpRequestException ex) { - Logger.Error("Artifactory Token entered is invalid!"); - throw new InvalidDataException($"Invalid Artifactory Token"); + ExceptionHandling.HttpException(ex,responseMessage, "Artifactory"); + Environment.Exit(-1); } + } } } diff --git a/src/LCT.APICommunications/SW360Apicommunication.cs b/src/LCT.APICommunications/SW360Apicommunication.cs index 6f38cdd9..537da02b 100644 --- a/src/LCT.APICommunications/SW360Apicommunication.cs +++ b/src/LCT.APICommunications/SW360Apicommunication.cs @@ -6,6 +6,7 @@ using LCT.APICommunications.Interfaces; using LCT.APICommunications.Model; +using LCT.Common; using LCT.Common.Model; using log4net; using Newtonsoft.Json; @@ -105,11 +106,17 @@ public async Task GetProjectById(string projectId) { result = await httpClient.GetAsync(projectsByTagUrl); + result.EnsureSuccessStatusCode(); + } + catch (HttpRequestException ex) + { + ExceptionHandling.HttpException(ex,result,"SW360"); + Environment.Exit(-1); } catch (TaskCanceledException ex) { Logger.Debug($"{ex.Message}"); - Logger.Error("A timeout error is thrown from SW360 server,Please wait for sometime and re run the pipeline again"); + ExceptionHandling.TaskCancelledException(ex, "SW360"); Environment.Exit(-1); } diff --git a/src/LCT.Common/ExceptionHandling.cs b/src/LCT.Common/ExceptionHandling.cs new file mode 100644 index 00000000..27477d03 --- /dev/null +++ b/src/LCT.Common/ExceptionHandling.cs @@ -0,0 +1,54 @@ +// -------------------------------------------------------------------------------------------------------------------- +// SPDX-FileCopyrightText: 2024 Siemens AG +// +// SPDX-License-Identifier: MIT +// -------------------------------------------------------------------------------------------------------------------- + + + +using log4net; +using log4net.Core; +using System; +using System.Net; +using System.Net.Http; +using System.Reflection; +using System.Threading.Tasks; + + + +namespace LCT.Common +{ + public class ExceptionHandling + { + protected ExceptionHandling() { } + private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + public static void HttpException(HttpRequestException ex, HttpResponseMessage responce, string exceptionSource) + { + if (400 <= Convert.ToInt32(responce.StatusCode) && Convert.ToInt32(responce.StatusCode) <= 499) + { + Logger.Logger.Log(null, Level.Error, $"The exception may be caused by an incorrect projectid or missing token for {exceptionSource} , Please ensure that a valid token is provided and try again:{ex.Message}", null); + + } + else if (500 <= Convert.ToInt32(responce.StatusCode) && Convert.ToInt32(responce.StatusCode) <= 599) + { + Logger.Logger.Log(null, Level.Error, $"The exception may arise because {exceptionSource} , is currently unresponsive. Please try again later:{ex.Message}", null); + + } + + } + + public static void AggregateException(AggregateException ex, string exceptionSource) + { + Logger.Logger.Log(null, Level.Error, $"An exception has occurred due to unknown reasons originating from {exceptionSource}:{ex.Message}", null); + } + public static void TaskCancelledException(TaskCanceledException ex, string exceptionSource) + { + Logger.Logger.Log(null, Level.Error, $"A timeout error is thrown from {exceptionSource} server,Please wait for sometime and re run the pipeline again:{ex.Message}", null); + } + public static void InvalidOperationException(InvalidOperationException ex, string exceptionSource) + { + Logger.Logger.Log(null, Level.Error, $"An exception has occurred from {exceptionSource}:{ex.Message}", null); + } + } +} \ No newline at end of file diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index 2446d3c9..87881963 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -49,9 +49,9 @@ static async Task Main(string[] args) CommonAppSettings appSettings = settingsManager.ReadConfiguration(args, FileConstant.appSettingFileName); ISW360ApicommunicationFacade sW360ApicommunicationFacade; ISw360ProjectService sw360ProjectService= Getsw360ProjectServiceObject(appSettings, out sW360ApicommunicationFacade); - await CreatorValidator.ValidateAppSettings(appSettings, sw360ProjectService); - + string FolderPath = InitiateLogger(appSettings); + await CreatorValidator.ValidateAppSettings(appSettings, sw360ProjectService); Logger.Logger.Log(null, Level.Notice, $"\n====================<<<<< Package creator >>>>>====================", null); Logger.Logger.Log(null, Level.Notice, $"\nStart of Package creator execution : {DateTime.Now}", null); diff --git a/src/LCT.Services/JFrogService.cs b/src/LCT.Services/JFrogService.cs index b7dd9f3d..5e4b69ea 100644 --- a/src/LCT.Services/JFrogService.cs +++ b/src/LCT.Services/JFrogService.cs @@ -16,6 +16,8 @@ using System.Collections.Generic; using System.Linq; using System.IO; +using LCT.Common; +using System.Net.Mail; namespace LCT.Services { @@ -51,15 +53,15 @@ public async Task> GetInternalComponentDataByRepo(string repoNa } catch (HttpRequestException httpException) { - Logger.Debug(httpException); + ExceptionHandling.HttpException(httpException, httpResponseMessage, "JFROG"); } catch (InvalidOperationException invalidOperationExcep) { - Logger.Debug(invalidOperationExcep); + ExceptionHandling.InvalidOperationException(invalidOperationExcep, "JFROG"); } catch (TaskCanceledException taskCancelledException) { - Logger.Debug(taskCancelledException); + ExceptionHandling.TaskCancelledException(taskCancelledException, "JFROG"); } return aqlResult; @@ -81,15 +83,15 @@ public async Task> GetInternalComponentDataByRepo(string repoNa } catch (HttpRequestException httpException) { - Logger.Debug(httpException); + ExceptionHandling.HttpException(httpException, httpResponseMessage, "JFROG"); } catch (InvalidOperationException invalidOperationExcep) { - Logger.Debug(invalidOperationExcep); + ExceptionHandling.InvalidOperationException(invalidOperationExcep, "JFROG"); } catch (TaskCanceledException taskCancelledException) { - Logger.Debug(taskCancelledException); + ExceptionHandling.TaskCancelledException(taskCancelledException, "JFROG"); } return aqlResult; diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index 0b902f60..5ac58dbd 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -117,7 +117,15 @@ public async Task TriggerFossologyProcess(string releaseId, s } catch (HttpRequestException ex) { - Logger.Logger.Log(null, Level.Error, $"\tTriggering the FossologyProcess is failed due to {ex.StatusCode} : {ex.Message}", null); + if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599) + { + Logger.Logger.Log(null, Level.Error, $"\tThe exception may arise because fossology is currently unresponsive:{ex.Message} Please try again later", null); + } + else + { + Logger.Logger.Log(null, Level.Error, $"\tThe exception may be caused by an incorrect or missing token for fossology :{ex.Message} Please ensure that a valid token is provided and try again", null); + + } } From f0873a144d9761aa1544a415ecfc5a537510e7e3 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 19 Mar 2024 14:58:52 +0530 Subject: [PATCH 07/29] Remove unnessasary code --- src/LCT.Common/ExceptionHandling.cs | 9 ++------- src/LCT.Services/JFrogService.cs | 12 ++++++------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/LCT.Common/ExceptionHandling.cs b/src/LCT.Common/ExceptionHandling.cs index 27477d03..190e5471 100644 --- a/src/LCT.Common/ExceptionHandling.cs +++ b/src/LCT.Common/ExceptionHandling.cs @@ -29,14 +29,9 @@ public static void HttpException(HttpRequestException ex, HttpResponseMessage re { Logger.Logger.Log(null, Level.Error, $"The exception may be caused by an incorrect projectid or missing token for {exceptionSource} , Please ensure that a valid token is provided and try again:{ex.Message}", null); - } - else if (500 <= Convert.ToInt32(responce.StatusCode) && Convert.ToInt32(responce.StatusCode) <= 599) - { - Logger.Logger.Log(null, Level.Error, $"The exception may arise because {exceptionSource} , is currently unresponsive. Please try again later:{ex.Message}", null); - - } + } - } + } public static void AggregateException(AggregateException ex, string exceptionSource) { diff --git a/src/LCT.Services/JFrogService.cs b/src/LCT.Services/JFrogService.cs index 5e4b69ea..cfcb4e18 100644 --- a/src/LCT.Services/JFrogService.cs +++ b/src/LCT.Services/JFrogService.cs @@ -53,15 +53,15 @@ public async Task> GetInternalComponentDataByRepo(string repoNa } catch (HttpRequestException httpException) { - ExceptionHandling.HttpException(httpException, httpResponseMessage, "JFROG"); + Logger.Debug(httpException); } catch (InvalidOperationException invalidOperationExcep) { - ExceptionHandling.InvalidOperationException(invalidOperationExcep, "JFROG"); + Logger.Debug(invalidOperationExcep); } catch (TaskCanceledException taskCancelledException) { - ExceptionHandling.TaskCancelledException(taskCancelledException, "JFROG"); + Logger.Debug(taskCancelledException); } return aqlResult; @@ -83,15 +83,15 @@ public async Task> GetInternalComponentDataByRepo(string repoNa } catch (HttpRequestException httpException) { - ExceptionHandling.HttpException(httpException, httpResponseMessage, "JFROG"); + Logger.Debug(httpException); } catch (InvalidOperationException invalidOperationExcep) { - ExceptionHandling.InvalidOperationException(invalidOperationExcep, "JFROG"); + Logger.Debug(invalidOperationExcep); } catch (TaskCanceledException taskCancelledException) { - ExceptionHandling.TaskCancelledException(taskCancelledException, "JFROG"); + Logger.Debug(taskCancelledException); } return aqlResult; From c46d60cc8026e06a482d9aeaaa7d67ef71f4d3c9 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 19 Mar 2024 15:01:18 +0530 Subject: [PATCH 08/29] Remove unnessasy lines --- src/LCT.Services/JFrogService.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/LCT.Services/JFrogService.cs b/src/LCT.Services/JFrogService.cs index cfcb4e18..9581dbcf 100644 --- a/src/LCT.Services/JFrogService.cs +++ b/src/LCT.Services/JFrogService.cs @@ -15,9 +15,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.IO; -using LCT.Common; -using System.Net.Mail; namespace LCT.Services { From 8d0e6ed89abcbd20fa633641963fc79ef79007ff Mon Sep 17 00:00:00 2001 From: Vijayalakshmi027 <58800320+Vijayalakshmi027@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:25:48 +0530 Subject: [PATCH 09/29] Dependency Injection_29032024 --- .../AlpineParserTests.cs | 25 +++++++--- .../BomHelperUnitTests.cs | 5 +- .../ConanParserTests.cs | 22 ++++++--- .../DebianParserTests.cs | 25 +++++++--- .../MavenParserTests.cs | 37 ++++++++------- .../NPMParserTests.cs | 21 ++++++--- .../NpmProcessorUTest.cs | 15 ++++-- .../NugetParserTests.cs | 47 ++++++++++++------- .../PythonParserTests.cs | 15 ++++-- src/LCT.PackageIdentifier/AlpineProcesser.cs | 12 ++--- src/LCT.PackageIdentifier/BomCreator.cs | 16 +++---- src/LCT.PackageIdentifier/ConanProcessor.cs | 13 ++--- src/LCT.PackageIdentifier/DebianProcessor.cs | 10 ++-- src/LCT.PackageIdentifier/MavenProcessor.cs | 8 ++-- src/LCT.PackageIdentifier/NpmProcessor.cs | 11 ++--- src/LCT.PackageIdentifier/NugetProcessor.cs | 10 ++-- src/LCT.PackageIdentifier/PythonProcessor.cs | 13 ++--- 17 files changed, 182 insertions(+), 123 deletions(-) diff --git a/src/LCT.PackageIdentifier.UTest/AlpineParserTests.cs b/src/LCT.PackageIdentifier.UTest/AlpineParserTests.cs index a04ec763..0d39c2a7 100644 --- a/src/LCT.PackageIdentifier.UTest/AlpineParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/AlpineParserTests.cs @@ -10,6 +10,7 @@ using NUnit.Framework; using System.IO; using LCT.Common.Constants; +using Moq; namespace LCT.PackageIdentifier.UTest { @@ -23,7 +24,9 @@ public void ParsePackageConfig_GivenAMultipleInputFilePath_ReturnsCounts() int expectednoofcomponents = 4; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - AlpineProcessor alpineProcessor = new AlpineProcessor(); + Mock cycloneDXBomParser = new Mock(); + + AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "*_Alpine.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -48,7 +51,9 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsCounts() int expectednoofcomponents = 4; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - AlpineProcessor alpineProcessor = new AlpineProcessor(); + Mock cycloneDXBomParser = new Mock(); + + AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Alpine.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -72,7 +77,9 @@ public void ParsePackageConfig_GivenMultipleInputFiles_ReturnsCountOfDuplicates( int duplicateComponents = 4; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - AlpineProcessor alpineProcessor = new AlpineProcessor(); + Mock cycloneDXBomParser = new Mock(); + + AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "*_Alpine.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() @@ -97,7 +104,9 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsSourceDetails() string sourceName = "alpine-baselayout" + "_" + "3.4.3-r1"; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - AlpineProcessor alpineProcessor = new AlpineProcessor(); + Mock cycloneDXBomParser = new Mock(); + + AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "AlpineSourceDetails_Cyclonedx.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() @@ -122,7 +131,9 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTo int expectednoofcomponents = 5; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - AlpineProcessor alpineProcessor = new AlpineProcessor(); + Mock cycloneDXBomParser = new Mock(); + + AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Alpine.cdx.json", "SBOMTemplate_Alpine.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; @@ -148,7 +159,9 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnUp //Arrange string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - AlpineProcessor alpineProcessor = new AlpineProcessor(); + Mock cycloneDXBomParser = new Mock(); + + AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Alpine.cdx.json", "SBOMTemplate_Alpine.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; diff --git a/src/LCT.PackageIdentifier.UTest/BomHelperUnitTests.cs b/src/LCT.PackageIdentifier.UTest/BomHelperUnitTests.cs index ccb88f41..a5237c7e 100644 --- a/src/LCT.PackageIdentifier.UTest/BomHelperUnitTests.cs +++ b/src/LCT.PackageIdentifier.UTest/BomHelperUnitTests.cs @@ -60,8 +60,9 @@ public async Task GetRepoDetails_GivenProjectTypeAsDebian_ReturnsListOFComponent } }; mockIProcessor.Setup(x => x.GetJfrogArtifactoryRepoInfo(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(lstComponentForBOM); - - IParser parser = new DebianProcessor(); + Mock cycloneDXBomParser = new Mock(); + + IParser parser = new DebianProcessor(cycloneDXBomParser.Object); Mock jFrogService = new Mock(); Mock bomHelper = new Mock(); bomHelper.Setup(x => x.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())).ReturnsAsync(aqlResultList); diff --git a/src/LCT.PackageIdentifier.UTest/ConanParserTests.cs b/src/LCT.PackageIdentifier.UTest/ConanParserTests.cs index f9a01ddf..538b41ed 100644 --- a/src/LCT.PackageIdentifier.UTest/ConanParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/ConanParserTests.cs @@ -44,9 +44,10 @@ public void ParseLockFile_GivenAInputFilePath_ReturnsSuccess() PackageFilePath = packagefilepath, Conan = config }; + Mock cycloneDXBomParser = new Mock(); //Act - Bom listofcomponents = new ConanProcessor().ParsePackageFile(appSettings); + Bom listofcomponents = new ConanProcessor(cycloneDXBomParser.Object).ParsePackageFile(appSettings); //Assert Assert.That(expectedNoOfcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); @@ -73,9 +74,10 @@ public void ParseLockFile_GivenAInputFilePath_ReturnDevDependentComp() PackageFilePath = packagefilepath, Conan = config }; + Mock cycloneDXBomParser = new Mock(); //Act - Bom listofcomponents = new ConanProcessor().ParsePackageFile(appSettings); + Bom listofcomponents = new ConanProcessor(cycloneDXBomParser.Object).ParsePackageFile(appSettings); var IsDevDependency = listofcomponents.Components.Find(a => a.Name == "googletest") .Properties.First(x => x.Name == "internal:siemens:clearing:development").Value; @@ -105,9 +107,10 @@ public void ParseLockFile_GivenAInputFilePathExcludeComponent_ReturnComponentCou PackageFilePath = packagefilepath, Conan = config }; + Mock cycloneDXBomParser = new Mock(); //Act - Bom listofcomponents = new ConanProcessor().ParsePackageFile(appSettings); + Bom listofcomponents = new ConanProcessor(cycloneDXBomParser.Object).ParsePackageFile(appSettings); //Assert Assert.That(totalComponentsAfterExclusion, Is.EqualTo(listofcomponents.Components.Count), "Checks if the excluded components have been removed"); @@ -156,9 +159,10 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData_Succes Mock mockBomHelper = new Mock(); mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); + Mock cycloneDXBomParser = new Mock(); // Act - ConanProcessor conanProcessor = new ConanProcessor(); + ConanProcessor conanProcessor = new ConanProcessor(cycloneDXBomParser.Object); var actual = await conanProcessor.IdentificationOfInternalComponents(componentIdentification, appSettings, mockJfrogService.Object, mockBomHelper.Object); // Assert @@ -193,9 +197,10 @@ public async Task GetJfrogRepoDetailsOfAComponent_ReturnsWithData_SuccessFully() Mock mockBomHelper = new Mock(); mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); + Mock cycloneDXBomParser = new Mock(); // Act - ConanProcessor conanProcessor = new ConanProcessor(); + ConanProcessor conanProcessor = new ConanProcessor(cycloneDXBomParser.Object); var actual = await conanProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); var reponameActual = actual.First(x => x.Properties[0].Name == "internal:siemens:clearing:repo-name").Properties[0].Value; @@ -233,9 +238,10 @@ public async Task GetArtifactoryRepoName_Conan_ReturnsNotFound_ReturnsFailure() Mock mockBomHelper = new Mock(); mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); + Mock cycloneDXBomParser = new Mock(); // Act - ConanProcessor conanProcessor = new ConanProcessor(); + ConanProcessor conanProcessor = new ConanProcessor(cycloneDXBomParser.Object); var actual = await conanProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -251,7 +257,9 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTo int expectednoofcomponents = 1; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - ConanProcessor conanProcessor = new ConanProcessor(); + Mock cycloneDXBomParser = new Mock(); + + ConanProcessor conanProcessor = new ConanProcessor(cycloneDXBomParser.Object); string[] Includes = { "SBOM_ConanCATemplate.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; diff --git a/src/LCT.PackageIdentifier.UTest/DebianParserTests.cs b/src/LCT.PackageIdentifier.UTest/DebianParserTests.cs index 893222e7..55d9d7e5 100644 --- a/src/LCT.PackageIdentifier.UTest/DebianParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/DebianParserTests.cs @@ -11,6 +11,7 @@ using LCT.Common; using LCT.Common.Model; using LCT.Common.Constants; +using Moq; namespace PackageIdentifier.UTest { @@ -24,7 +25,9 @@ public void ParsePackageConfig_GivenAMultipleInputFilePath_ReturnsCounts() int expectednoofcomponents = 8; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - DebianProcessor DebianProcessor = new DebianProcessor(); + Mock cycloneDXBomParser = new Mock(); + + DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "*_Debian.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -48,8 +51,10 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsCounts() //Arrange int expectednoofcomponents = 4; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; + Mock cycloneDXBomParser = new Mock(); + string OutFolder = Path.GetDirectoryName(exePath); - DebianProcessor DebianProcessor = new DebianProcessor(); + DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Debian.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -73,7 +78,9 @@ public void ParsePackageConfig_GivenMultipleInputFiles_ReturnsCountOfDuplicates( int duplicateComponents = 1; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - DebianProcessor DebianProcessor = new DebianProcessor(); + Mock cycloneDXBomParser = new Mock(); + + DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "*_Debian.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() @@ -98,7 +105,9 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsSourceDetails() string sourceName = "adduser" + "_" + "3.118"; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - DebianProcessor DebianProcessor = new DebianProcessor(); + Mock cycloneDXBomParser = new Mock(); + + DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "SourceDetails_Cyclonedx.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() @@ -123,7 +132,9 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTo int expectednoofcomponents = 5; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - DebianProcessor DebianProcessor = new DebianProcessor(); + Mock cycloneDXBomParser = new Mock(); + + DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Debian.cdx.json", "SBOMTemplate_Debian.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; @@ -149,7 +160,9 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnUp //Arrange string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - DebianProcessor DebianProcessor = new DebianProcessor(); + Mock cycloneDXBomParser = new Mock(); + + DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Debian.cdx.json", "SBOMTemplate_Debian.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; diff --git a/src/LCT.PackageIdentifier.UTest/MavenParserTests.cs b/src/LCT.PackageIdentifier.UTest/MavenParserTests.cs index 78e6a38c..002671af 100644 --- a/src/LCT.PackageIdentifier.UTest/MavenParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/MavenParserTests.cs @@ -39,8 +39,8 @@ public void ParsePackageFile_PackageLockWithDuplicateComponents_ReturnsCountOfDu RemoveDevDependency = true, Maven = new Config() { Include = Includes, Exclude = Excludes } }; - - MavenProcessor MavenProcessor = new MavenProcessor(); + Mock cycloneDXBomParser = new Mock(); + MavenProcessor MavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); //Act Bom bom = MavenProcessor.ParsePackageFile(appSettings); @@ -78,9 +78,10 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData_Succes mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("junit"); + Mock cycloneDXBomParser = new Mock(); // Act - MavenProcessor mavenProcessor = new MavenProcessor(); + MavenProcessor mavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); var actual = await mavenProcessor.IdentificationOfInternalComponents(component, appSettings, mockJfrogService.Object, mockBomHelper.Object); // Assert @@ -114,9 +115,10 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData2_Succe mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("junit"); + Mock cycloneDXBomParser = new Mock(); // Act - MavenProcessor mavenProcessor = new MavenProcessor(); + MavenProcessor mavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); var actual = await mavenProcessor.IdentificationOfInternalComponents(component, appSettings, mockJfrogService.Object, mockBomHelper.Object); // Assert @@ -136,7 +138,7 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData3_Succe }; var components = new List() { component1 }; ComponentIdentification componentIdentification = new() { comparisonBOMData = components }; - string[] reooListArr = {"internalrepo1", "internalrepo2" }; + string[] reooListArr = { "internalrepo1", "internalrepo2" }; CommonAppSettings appSettings = new() { InternalRepoList = reooListArr }; AqlResult aqlResult = new() @@ -152,9 +154,10 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData3_Succe mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("junit/junit"); + Mock cycloneDXBomParser = new Mock(); // Act - MavenProcessor mavenProcessor = new MavenProcessor(); + MavenProcessor mavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); var actual = await mavenProcessor.IdentificationOfInternalComponents( componentIdentification, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -191,9 +194,10 @@ public async Task GetJfrogRepoDetailsOfAComponent_ReturnsWithData_SuccessFully() mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("junit/junit"); + Mock cycloneDXBomParser = new Mock(); // Act - MavenProcessor mavenProcessor = new MavenProcessor(); + MavenProcessor mavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); var actual = await mavenProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -230,9 +234,10 @@ public async Task GetJfrogRepoDetailsOfAComponent_ReturnsWithData2_SuccessFully( mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("junit"); + Mock cycloneDXBomParser = new Mock(); // Act - MavenProcessor mavenProcessor = new MavenProcessor(); + MavenProcessor mavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); var actual = await mavenProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -257,8 +262,8 @@ public void DevDependencyIdentificationLogic_ReturnsCountOfDevDependentcomponent RemoveDevDependency = true, Maven = new Config() { Include = Includes, Exclude = Excludes } }; - - MavenProcessor MavenProcessor = new MavenProcessor(); + Mock cycloneDXBomParser = new Mock(); + MavenProcessor MavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); //Act MavenProcessor.ParsePackageFile(appSettings); @@ -284,8 +289,8 @@ public void DevDependencyIdentificationLogic_ReturnsCountOfComponents_WithoutDev RemoveDevDependency = true, Maven = new Config() { Include = Includes, Exclude = Excludes } }; - - MavenProcessor MavenProcessor = new MavenProcessor(); + Mock cycloneDXBomParser = new Mock(); + MavenProcessor MavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); //Act Bom bom = MavenProcessor.ParsePackageFile(appSettings); @@ -314,8 +319,8 @@ public void ParsePackageFile_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTota Maven = new Config() { Include = Includes, Exclude = Excludes }, CycloneDxSBomTemplatePath = filepath + "\\SBOMTemplates\\SBOM_MavenCATemplate.cdx.json" }; - - MavenProcessor MavenProcessor = new MavenProcessor(); + Mock cycloneDXBomParser = new Mock(); + MavenProcessor MavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); //Act Bom bom = MavenProcessor.ParsePackageFile(appSettings); @@ -343,8 +348,8 @@ public void ParsePackageFile_GivenAInputFilePathAlongWithSBOMTemplate_ReturnUpda Maven = new Config() { Include = Includes, Exclude = Excludes }, CycloneDxSBomTemplatePath = filepath + "\\SBOMTemplates\\SBOMTemplate_Maven.cdx.json" }; - - MavenProcessor MavenProcessor = new MavenProcessor(); + Mock cycloneDXBomParser = new Mock(); + MavenProcessor MavenProcessor = new MavenProcessor(cycloneDXBomParser.Object); //Act Bom bom = MavenProcessor.ParsePackageFile(appSettings); diff --git a/src/LCT.PackageIdentifier.UTest/NPMParserTests.cs b/src/LCT.PackageIdentifier.UTest/NPMParserTests.cs index 1e575ece..35dc38bb 100644 --- a/src/LCT.PackageIdentifier.UTest/NPMParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/NPMParserTests.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using CycloneDX.Models; using LCT.Common.Constants; +using Moq; namespace LCT.PackageIdentifier.UTest { @@ -37,7 +38,8 @@ public void ParsePackageFile_PackageLockWithDuplicateComponents_ReturnsCountOfDu Npm = new Config() { Include = Includes, Exclude = Excludes } }; - NpmProcessor NpmProcessor = new NpmProcessor(); + Mock cycloneDXBomParser = new Mock(); + NpmProcessor NpmProcessor = new NpmProcessor(cycloneDXBomParser.Object); //Act NpmProcessor.ParsePackageFile(appSettings); @@ -63,8 +65,8 @@ public void ParsePackageFile_PackageLockWithangular16_ReturnsCountOfComponents() RemoveDevDependency = true, Npm = new Config() { Include = Includes, Exclude = Excludes } }; - - NpmProcessor NpmProcessor = new NpmProcessor(); + Mock cycloneDXBomParser = new Mock(); + NpmProcessor NpmProcessor = new NpmProcessor(cycloneDXBomParser.Object); //Act Bom bom=NpmProcessor.ParsePackageFile(appSettings); @@ -94,7 +96,9 @@ public void ParsePackageFile_PackageLockWithoutDuplicateComponents_ReturnsCountZ }; - NpmProcessor NpmProcessor = new NpmProcessor(); + + Mock cycloneDXBomParser = new Mock(); + NpmProcessor NpmProcessor = new NpmProcessor(cycloneDXBomParser.Object); //Act NpmProcessor.ParsePackageFile(appSettings); @@ -110,7 +114,8 @@ public void ParseCycloneDXFile_GivenMultipleInputFiles_ReturnsCounts() int expectednoofcomponents = 5; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - NpmProcessor npmProcessor = new NpmProcessor(); + Mock cycloneDXBomParser = new Mock(); + NpmProcessor npmProcessor = new NpmProcessor(cycloneDXBomParser.Object); string[] Includes = { "*_NPM.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -134,7 +139,8 @@ public void ParseCycloneDXFile_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTo int expectednoofcomponents = 4; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - NpmProcessor npmProcessor = new NpmProcessor(); + Mock cycloneDXBomParser = new Mock(); + NpmProcessor npmProcessor = new NpmProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX2_NPM.cdx.json", "SBOMTemplate_Npm.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; @@ -160,7 +166,8 @@ public void ParseCycloneDXFile_GivenAInputFilePathAlongWithSBOMTemplate_ReturnUp //Arrange string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - NpmProcessor npmProcessor = new NpmProcessor(); + Mock cycloneDXBomParser = new Mock(); + NpmProcessor npmProcessor = new NpmProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX2_NPM.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; diff --git a/src/LCT.PackageIdentifier.UTest/NpmProcessorUTest.cs b/src/LCT.PackageIdentifier.UTest/NpmProcessorUTest.cs index fa0497d7..dce4abd4 100644 --- a/src/LCT.PackageIdentifier.UTest/NpmProcessorUTest.cs +++ b/src/LCT.PackageIdentifier.UTest/NpmProcessorUTest.cs @@ -47,9 +47,10 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData_Succes mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NpmProcessor npmProcessor = new NpmProcessor(); + NpmProcessor npmProcessor = new NpmProcessor(cycloneDXBomParser.Object); var actual = await npmProcessor.IdentificationOfInternalComponents(component, appSettings, mockJfrogService.Object, mockBomHelper.Object); // Assert @@ -83,9 +84,10 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData2_Succe mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NpmProcessor npmProcessor = new NpmProcessor(); + NpmProcessor npmProcessor = new NpmProcessor(cycloneDXBomParser.Object); var actual = await npmProcessor.IdentificationOfInternalComponents(component, appSettings, mockJfrogService.Object, mockBomHelper.Object); // Assert @@ -121,9 +123,10 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData3_Succe mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations/common"); + Mock cycloneDXBomParser = new Mock(); // Act - NpmProcessor npmProcessor = new NpmProcessor(); + NpmProcessor npmProcessor = new NpmProcessor(cycloneDXBomParser.Object); var actual = await npmProcessor.IdentificationOfInternalComponents( componentIdentification, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -160,9 +163,10 @@ public async Task GetJfrogRepoDetailsOfAComponent_ReturnsWithData_SuccessFully() mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations/common"); + Mock cycloneDXBomParser = new Mock(); // Act - NpmProcessor npmProcessor = new NpmProcessor(); + NpmProcessor npmProcessor = new NpmProcessor(cycloneDXBomParser.Object); var actual = await npmProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -199,9 +203,10 @@ public async Task GetJfrogRepoDetailsOfAComponent_ReturnsWithData2_SuccessFully( mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NpmProcessor npmProcessor = new NpmProcessor(); + NpmProcessor npmProcessor = new NpmProcessor(cycloneDXBomParser.Object); var actual = await npmProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); diff --git a/src/LCT.PackageIdentifier.UTest/NugetParserTests.cs b/src/LCT.PackageIdentifier.UTest/NugetParserTests.cs index 586bee93..f6928359 100644 --- a/src/LCT.PackageIdentifier.UTest/NugetParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/NugetParserTests.cs @@ -179,8 +179,8 @@ public void RemoveExcludedComponents_ReturnsUpdatedBom() string csprojfilepath = outFolder + @"\PackageIdentifierUTTestFiles"; string[] Excludes = null; - CycloneDX.Models.Bom bom = new CycloneDX.Models.Bom(); - bom.Components = new List(); + Bom bom = new Bom(); + bom.Components = new List(); CommonAppSettings CommonAppSettings = new CommonAppSettings() { PackageFilePath = csprojfilepath, @@ -188,7 +188,7 @@ public void RemoveExcludedComponents_ReturnsUpdatedBom() }; //Act - CycloneDX.Models.Bom updatedBom = NugetProcessor.RemoveExcludedComponents(CommonAppSettings, bom); + Bom updatedBom = NugetProcessor.RemoveExcludedComponents(CommonAppSettings, bom); //Assert Assert.AreEqual(0, updatedBom.Components.Count, "Zero component exculded"); @@ -222,9 +222,10 @@ public async Task IdentificationOfInternalComponents_Nuget_ReturnsComponentData_ mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.IdentificationOfInternalComponents( component, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -261,7 +262,8 @@ public async Task IdentificationOfInternalComponents_Nuget_ReturnsComponentData2 mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + Mock cycloneDXBomParser = new Mock(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.IdentificationOfInternalComponents(component, appSettings, mockJfrogService.Object, mockBomHelper.Object); // Assert @@ -298,9 +300,10 @@ public async Task IdentificationOfInternalComponents_ReturnsComponentData3_Succe mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations/common"); + Mock cycloneDXBomParser = new Mock(); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.IdentificationOfInternalComponents( componentIdentification, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -322,7 +325,7 @@ public async Task GetJfrogRepoDetailsOfAComponent_ReturnsWithData_SuccessFully() var components = new List() { component1 }; string[] reooListArr = { "internalrepo1", "internalrepo2" }; CommonAppSettings appSettings = new(); - appSettings.Nuget = new LCT.Common.Model.Config() { JfrogNugetRepoList = reooListArr }; + appSettings.Nuget = new Config() { JfrogNugetRepoList = reooListArr }; AqlResult aqlResult = new() { Name = "animations-common-1.0.0.nupkg", @@ -337,9 +340,10 @@ public async Task GetJfrogRepoDetailsOfAComponent_ReturnsWithData_SuccessFully() mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations/common"); + Mock cycloneDXBomParser = new Mock(); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -376,9 +380,10 @@ public async Task GetJfrogRepoDetailsOfAComponent_Nuget_ReturnsWithData2_Success mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -415,9 +420,10 @@ public async Task GetArtifactoryRepoName_Nuget_ReturnsRepoName_SuccessFully() mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -454,9 +460,10 @@ public async Task GetArtifactoryRepoName_Nuget_ReturnsRepoName_ReturnsFailure() mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -493,9 +500,10 @@ public async Task GetArtifactoryRepoName_Nuget_ReturnsRepoName_ReturnsSuccess() mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -533,9 +541,10 @@ public async Task GetArtifactoryRepoName_Nuget_ReturnsNotFound_ReturnsFailure() mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("animations"); + Mock cycloneDXBomParser = new Mock(); // Act - NugetProcessor nugetProcessor = new NugetProcessor(); + NugetProcessor nugetProcessor = new NugetProcessor(cycloneDXBomParser.Object); var actual = await nugetProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -564,9 +573,10 @@ public void ParseProjectAssetFile_GivenAInputFilePath_ReturnsSuccess() PackageFilePath = packagefilepath, Nuget = config }; + Mock cycloneDXBomParser = new Mock(); //Act - Bom listofcomponents = new NugetProcessor().ParsePackageFile(appSettings); + Bom listofcomponents = new NugetProcessor(cycloneDXBomParser.Object).ParsePackageFile(appSettings); //Assert Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); @@ -593,11 +603,14 @@ public void ParseProjectAssetFile_GivenAInputFilePath_ReturnDevDependentComp() PackageFilePath = packagefilepath, Nuget = config }; + Mock cycloneDXBomParser = new Mock(); - //Act - Bom listofcomponents = new NugetProcessor().ParsePackageFile(appSettings); - var IsDevDependency = listofcomponents.Components.Find(a => a.Name == "SonarAnalyzer.CSharp").Properties[0].Value; + //Act + Bom listofcomponents = new NugetProcessor(cycloneDXBomParser.Object).ParsePackageFile(appSettings); + var IsDevDependency = + listofcomponents.Components.Find(a => a.Name == "SonarAnalyzer.CSharp") + .Properties[0].Value; //Assert Assert.That(IsDev, Is.EqualTo(IsDevDependency), "Checks if Dev Dependency Component or not"); diff --git a/src/LCT.PackageIdentifier.UTest/PythonParserTests.cs b/src/LCT.PackageIdentifier.UTest/PythonParserTests.cs index f84188b0..6527be49 100644 --- a/src/LCT.PackageIdentifier.UTest/PythonParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/PythonParserTests.cs @@ -27,7 +27,8 @@ class PythonParserTests readonly PythonProcessor pythonProcessor; public PythonParserTests() { - pythonProcessor = new PythonProcessor(); + Mock cycloneDXBomParser = new Mock(); + pythonProcessor = new PythonProcessor(cycloneDXBomParser.Object); } [Test] public void ParseCycloneDXFile_GivenAMultipleInputFilePath_ReturnsCounts() @@ -211,7 +212,8 @@ public async Task IdentificationOfInternalComponents_Python_ReturnsComponentData mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("cachy"); // Act - PythonProcessor pyProcessor = new PythonProcessor(); + Mock cycloneDXBomParser = new Mock(); + PythonProcessor pyProcessor = new PythonProcessor(cycloneDXBomParser.Object); var actual = await pyProcessor.IdentificationOfInternalComponents( component, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -246,9 +248,10 @@ public async Task IdentificationOfInternalComponents_Python_ReturnsComponentData mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("cachy"); + Mock cycloneDXBomParser = new Mock(); // Act - PythonProcessor pyProcessor = new PythonProcessor(); + PythonProcessor pyProcessor = new PythonProcessor(cycloneDXBomParser.Object); var actual = await pyProcessor.IdentificationOfInternalComponents( component, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -284,9 +287,10 @@ public async Task GetJfrogRepoDetailsOfAComponentForPython_ReturnsWithData_Succe mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("html5lib"); + Mock cycloneDXBomParser = new Mock(); // Act - PythonProcessor pyProcessor = new PythonProcessor(); + PythonProcessor pyProcessor = new PythonProcessor(cycloneDXBomParser.Object); var actual = await pyProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); @@ -322,9 +326,10 @@ public async Task GetJfrogRepoDetailsOfAComponentForPython_ReturnsWithData2_Succ mockBomHelper.Setup(m => m.GetListOfComponentsFromRepo(It.IsAny(), It.IsAny())) .ReturnsAsync(results); mockBomHelper.Setup(m => m.GetFullNameOfComponent(It.IsAny())).Returns("html5lib"); + Mock cycloneDXBomParser = new Mock(); // Act - PythonProcessor pyProcessor = new PythonProcessor(); + PythonProcessor pyProcessor = new PythonProcessor(cycloneDXBomParser.Object); var actual = await pyProcessor.GetJfrogRepoDetailsOfAComponent( components, appSettings, mockJfrogService.Object, mockBomHelper.Object); diff --git a/src/LCT.PackageIdentifier/AlpineProcesser.cs b/src/LCT.PackageIdentifier/AlpineProcesser.cs index dc4744ef..f9f3da2b 100644 --- a/src/LCT.PackageIdentifier/AlpineProcesser.cs +++ b/src/LCT.PackageIdentifier/AlpineProcesser.cs @@ -11,14 +11,12 @@ using LCT.PackageIdentifier.Model; using LCT.Services.Interface; using log4net; -using Newtonsoft.Json; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Threading.Tasks; -using System.Xml; namespace LCT.PackageIdentifier { @@ -28,11 +26,11 @@ namespace LCT.PackageIdentifier public class AlpineProcessor : IParser { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - readonly CycloneDXBomParser cycloneDXBomParser; + private readonly ICycloneDXBomParser _cycloneDXBomParser; - public AlpineProcessor() + public AlpineProcessor(ICycloneDXBomParser cycloneDXBomParser) { - cycloneDXBomParser = new CycloneDXBomParser(); + _cycloneDXBomParser = cycloneDXBomParser; } #region public method @@ -64,7 +62,7 @@ public Bom ParsePackageFile(CommonAppSettings appSettings) if (File.Exists(appSettings.CycloneDxSBomTemplatePath) && appSettings.CycloneDxSBomTemplatePath.EndsWith(FileConstant.SBOMTemplateFileExtension)) { Bom templateDetails; - templateDetails = CycloneDXBomParser.ExtractSBOMDetailsFromTemplate(cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); + templateDetails = CycloneDXBomParser.ExtractSBOMDetailsFromTemplate(_cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); CycloneDXBomParser.CheckValidComponentsForProjectType(templateDetails.Components, appSettings.ProjectType); //Adding Template Component Details & MetaData SbomTemplate.AddComponentDetails(bom.Components, templateDetails); @@ -122,7 +120,7 @@ public List ParseCycloneDX(string filePath, List depe private void ExtractDetailsForJson(string filePath, ref List alpinePackages, List dependenciesForBOM) { - Bom bom = cycloneDXBomParser.ParseCycloneDXBom(filePath); + Bom bom = _cycloneDXBomParser.ParseCycloneDXBom(filePath); foreach (var componentsInfo in bom.Components) { BomCreator.bomKpiData.ComponentsinPackageLockJsonFile++; diff --git a/src/LCT.PackageIdentifier/BomCreator.cs b/src/LCT.PackageIdentifier/BomCreator.cs index edfbafcb..db67fbb6 100644 --- a/src/LCT.PackageIdentifier/BomCreator.cs +++ b/src/LCT.PackageIdentifier/BomCreator.cs @@ -101,30 +101,30 @@ private static void WriteContentToCycloneDxBOM(CommonAppSettings appSettings, Bo private async Task CallPackageParser(CommonAppSettings appSettings) { IParser parser; - + ICycloneDXBomParser cycloneDXBomParser = new CycloneDXBomParser(); switch (appSettings.ProjectType.ToUpperInvariant()) { case "NPM": - parser = new NpmProcessor(); + parser = new NpmProcessor(cycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "NUGET": - parser = new NugetProcessor(); + parser = new NugetProcessor(cycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "MAVEN": - parser = new MavenProcessor(); + parser = new MavenProcessor(cycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "DEBIAN": - parser = new DebianProcessor(); + parser = new DebianProcessor(cycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "ALPINE": - parser = new AlpineProcessor(); + parser = new AlpineProcessor(cycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "PYTHON": - parser = new PythonProcessor(); + parser = new PythonProcessor(cycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "CONAN": - parser = new ConanProcessor(); + parser = new ConanProcessor(cycloneDXBomParser); return await ComponentIdentification(appSettings, parser); default: Logger.Error($"GenerateBom():Invalid ProjectType - {appSettings.ProjectType}"); diff --git a/src/LCT.PackageIdentifier/ConanProcessor.cs b/src/LCT.PackageIdentifier/ConanProcessor.cs index 2b470109..1207dd38 100644 --- a/src/LCT.PackageIdentifier/ConanProcessor.cs +++ b/src/LCT.PackageIdentifier/ConanProcessor.cs @@ -33,16 +33,13 @@ public class ConanProcessor : CycloneDXBomParser, IParser { #region fields static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - readonly CycloneDXBomParser cycloneDXBomParser; + private readonly ICycloneDXBomParser _cycloneDXBomParser; #endregion #region constructor - public ConanProcessor() + public ConanProcessor(ICycloneDXBomParser cycloneDXBomParser) { - if (cycloneDXBomParser == null) - { - cycloneDXBomParser = new CycloneDXBomParser(); - } + _cycloneDXBomParser = cycloneDXBomParser; } #endregion @@ -182,7 +179,7 @@ private void ParsingInputFileForBOM(CommonAppSettings appSettings, ref Bom bom) else if (filepath.EndsWith(FileConstant.CycloneDXFileExtension) && !filepath.EndsWith(FileConstant.SBOMTemplateFileExtension)) { Logger.Debug($"ParsingInputFileForBOM():Found as CycloneDXFile"); - bom = cycloneDXBomParser.ParseCycloneDXBom(filepath); + bom = _cycloneDXBomParser.ParseCycloneDXBom(filepath); CheckValidComponentsForProjectType(bom.Components, appSettings.ProjectType); componentsForBOM.AddRange(bom.Components); GetDetailsforManuallyAddedComp(componentsForBOM); @@ -208,7 +205,7 @@ private void ParsingInputFileForBOM(CommonAppSettings appSettings, ref Bom bom) { //Adding Template Component Details Bom templateDetails; - templateDetails = ExtractSBOMDetailsFromTemplate(cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); + templateDetails = ExtractSBOMDetailsFromTemplate(_cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); CheckValidComponentsForProjectType(templateDetails.Components, appSettings.ProjectType); SbomTemplate.AddComponentDetails(bom.Components, templateDetails); } diff --git a/src/LCT.PackageIdentifier/DebianProcessor.cs b/src/LCT.PackageIdentifier/DebianProcessor.cs index ee63a7ff..b077b442 100644 --- a/src/LCT.PackageIdentifier/DebianProcessor.cs +++ b/src/LCT.PackageIdentifier/DebianProcessor.cs @@ -28,12 +28,12 @@ namespace LCT.PackageIdentifier public class DebianProcessor : IParser { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - readonly CycloneDXBomParser cycloneDXBomParser; + private readonly ICycloneDXBomParser _cycloneDXBomParser; private const string NotFoundInRepo = "Not Found in JFrogRepo"; - public DebianProcessor() + public DebianProcessor(ICycloneDXBomParser cycloneDXBomParser) { - cycloneDXBomParser = new CycloneDXBomParser(); + _cycloneDXBomParser = cycloneDXBomParser; } #region public method @@ -66,7 +66,7 @@ public Bom ParsePackageFile(CommonAppSettings appSettings) if (File.Exists(appSettings.CycloneDxSBomTemplatePath) && appSettings.CycloneDxSBomTemplatePath.EndsWith(FileConstant.SBOMTemplateFileExtension)) { Bom templateDetails; - templateDetails = CycloneDXBomParser.ExtractSBOMDetailsFromTemplate(cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); + templateDetails = CycloneDXBomParser.ExtractSBOMDetailsFromTemplate(_cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); CycloneDXBomParser.CheckValidComponentsForProjectType(templateDetails.Components, appSettings.ProjectType); //Adding Template Component Details & MetaData SbomTemplate.AddComponentDetails(bom.Components, templateDetails); @@ -221,7 +221,7 @@ private static bool IsInternalDebianComponent( private Bom ExtractDetailsForJson(string filePath, ref List debianPackages) { - Bom bom = cycloneDXBomParser.ParseCycloneDXBom(filePath); + Bom bom = _cycloneDXBomParser.ParseCycloneDXBom(filePath); foreach (var componentsInfo in bom.Components) { diff --git a/src/LCT.PackageIdentifier/MavenProcessor.cs b/src/LCT.PackageIdentifier/MavenProcessor.cs index cd2ed832..e0d16bd8 100644 --- a/src/LCT.PackageIdentifier/MavenProcessor.cs +++ b/src/LCT.PackageIdentifier/MavenProcessor.cs @@ -24,11 +24,11 @@ public class MavenProcessor : CycloneDXBomParser, IParser { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private const string NotFoundInRepo = "Not Found in JFrogRepo"; - readonly CycloneDXBomParser cycloneDXBomParser; + private readonly ICycloneDXBomParser _cycloneDXBomParser; - public MavenProcessor() + public MavenProcessor(ICycloneDXBomParser cycloneDXBomParser) { - cycloneDXBomParser = new CycloneDXBomParser(); + _cycloneDXBomParser = cycloneDXBomParser; } public Bom ParsePackageFile(CommonAppSettings appSettings) @@ -70,7 +70,7 @@ public Bom ParsePackageFile(CommonAppSettings appSettings) { //Adding Template Component Details Bom templateDetails; - templateDetails = ExtractSBOMDetailsFromTemplate(cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); + templateDetails = ExtractSBOMDetailsFromTemplate(_cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); CheckValidComponentsForProjectType(templateDetails.Components, appSettings.ProjectType); SbomTemplate.AddComponentDetails(componentsForBOM, templateDetails); } diff --git a/src/LCT.PackageIdentifier/NpmProcessor.cs b/src/LCT.PackageIdentifier/NpmProcessor.cs index 6f0894a3..beed824f 100644 --- a/src/LCT.PackageIdentifier/NpmProcessor.cs +++ b/src/LCT.PackageIdentifier/NpmProcessor.cs @@ -33,7 +33,7 @@ namespace LCT.PackageIdentifier public class NpmProcessor : CycloneDXBomParser, IParser { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - readonly CycloneDXBomParser cycloneDXBomParser; + private readonly ICycloneDXBomParser _cycloneDXBomParser; private const string Bundled = "bundled"; private const string Dependencies = "dependencies"; private const string Dev = "dev"; @@ -42,12 +42,9 @@ public class NpmProcessor : CycloneDXBomParser, IParser private const string NotFoundInRepo = "Not Found in JFrogRepo"; private const string Requires = "requires"; - public NpmProcessor() + public NpmProcessor(ICycloneDXBomParser cycloneDXBomParser) { - if (cycloneDXBomParser == null) - { - cycloneDXBomParser = new CycloneDXBomParser(); - } + _cycloneDXBomParser = cycloneDXBomParser; } public Bom ParsePackageFile(CommonAppSettings appSettings) @@ -383,7 +380,7 @@ private void ParsingInputFileForBOM(CommonAppSettings appSettings, ref List valu private List ExtractDetailsFromJson(string filePath, CommonAppSettings appSettings, ref List dependencies) { List PythonPackages = new List(); - Bom bom = cycloneDXBomParser.ParseCycloneDXBom(filePath); + Bom bom = _cycloneDXBomParser.ParseCycloneDXBom(filePath); CycloneDXBomParser.CheckValidComponentsForProjectType(bom.Components, appSettings.ProjectType); foreach (var componentsInfo in bom.Components) From 2016362500ce53b43443d3b7a1444ebaa3430130 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 19 Mar 2024 16:14:12 +0530 Subject: [PATCH 10/29] Updated review comments --- src/LCT.Common/ExceptionHandling.cs | 22 +++++++++++++++++++--- src/LCT.Services/Sw360CreatorService.cs | 10 +--------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/LCT.Common/ExceptionHandling.cs b/src/LCT.Common/ExceptionHandling.cs index 190e5471..6cbddf8a 100644 --- a/src/LCT.Common/ExceptionHandling.cs +++ b/src/LCT.Common/ExceptionHandling.cs @@ -23,15 +23,31 @@ public class ExceptionHandling protected ExceptionHandling() { } private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - public static void HttpException(HttpRequestException ex, HttpResponseMessage responce, string exceptionSource) + public static void HttpException(HttpRequestException ex, HttpResponseMessage response, string exceptionSource) { - if (400 <= Convert.ToInt32(responce.StatusCode) && Convert.ToInt32(responce.StatusCode) <= 499) + if (400 <= Convert.ToInt32(response.StatusCode) && Convert.ToInt32(response.StatusCode) <= 499) { Logger.Logger.Log(null, Level.Error, $"The exception may be caused by an incorrect projectid or missing token for {exceptionSource} , Please ensure that a valid token is provided and try again:{ex.Message}", null); + }else if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599) + { + Logger.Logger.Log(null, Level.Error, $"\tThe exception may arise because {exceptionSource} is currently unresponsive:{ex.Message} Please try again later", null); } - } + } + public static void FossologyException(HttpRequestException ex) + { + if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599 ) + { + Logger.Logger.Log(null, Level.Error, $"\tThe exception may arise because fossology is currently unresponsive:{ex.Message} Please try again later", null); + } + else + { + Logger.Logger.Log(null, Level.Error, $"\tThe exception may be caused by an incorrect or missing token for fossology :{ex.Message} Please ensure that a valid token is provided and try again", null); + + } + + } public static void AggregateException(AggregateException ex, string exceptionSource) { diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index 5ac58dbd..d49541fd 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -117,15 +117,7 @@ public async Task TriggerFossologyProcess(string releaseId, s } catch (HttpRequestException ex) { - if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599) - { - Logger.Logger.Log(null, Level.Error, $"\tThe exception may arise because fossology is currently unresponsive:{ex.Message} Please try again later", null); - } - else - { - Logger.Logger.Log(null, Level.Error, $"\tThe exception may be caused by an incorrect or missing token for fossology :{ex.Message} Please ensure that a valid token is provided and try again", null); - - } + ExceptionHandling.FossologyException(ex); } From 36dd45ef6417c39dfeff2e78c393d4ca676b0b3f Mon Sep 17 00:00:00 2001 From: Sumanth K B Date: Tue, 19 Mar 2024 17:32:19 +0530 Subject: [PATCH 11/29] changes --- src/LCT.Common/SettingsManager.cs | 3 +-- src/LCT.PackageIdentifier/NpmProcessor.cs | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/LCT.Common/SettingsManager.cs b/src/LCT.Common/SettingsManager.cs index 1bb2dcc7..92d616f7 100644 --- a/src/LCT.Common/SettingsManager.cs +++ b/src/LCT.Common/SettingsManager.cs @@ -14,7 +14,6 @@ using System.Linq; using System.Reflection; using System.Text; -using System.Threading; namespace LCT.Common { @@ -216,7 +215,7 @@ private static void CheckRequiredArgsToRunArtifactoryUploader(CommonAppSettings List uploaderReqParameters = new List() { "JFrogApi", - "PackageFilePath", + "BomFilePath", "ArtifactoryUploadApiKey", }; diff --git a/src/LCT.PackageIdentifier/NpmProcessor.cs b/src/LCT.PackageIdentifier/NpmProcessor.cs index 8d316c82..75e2ce7c 100644 --- a/src/LCT.PackageIdentifier/NpmProcessor.cs +++ b/src/LCT.PackageIdentifier/NpmProcessor.cs @@ -23,10 +23,8 @@ using System.Security; using System.Threading.Tasks; - namespace LCT.PackageIdentifier { - /// /// Parses the NPM Packages /// From 6ea20b5c549b142808eea35f30684ce1f44ee7dc Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Wed, 20 Mar 2024 08:48:28 +0530 Subject: [PATCH 12/29] Jfrog exception handling --- src/LCT.APICommunications/NpmJfrogAPICommunication.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/LCT.APICommunications/NpmJfrogAPICommunication.cs b/src/LCT.APICommunications/NpmJfrogAPICommunication.cs index ed433e3d..bbe91239 100644 --- a/src/LCT.APICommunications/NpmJfrogAPICommunication.cs +++ b/src/LCT.APICommunications/NpmJfrogAPICommunication.cs @@ -5,6 +5,7 @@ // -------------------------------------------------------------------------------------------------------------------- using LCT.APICommunications.Model; +using LCT.Common; using log4net; using System; using System.Net.Http; @@ -61,14 +62,14 @@ public override async Task GetPackageInfo(ComponentsToArtif { HttpClient httpClient = GetHttpClient(ArtifactoryCredentials); result = await httpClient.GetAsync(component.PackageInfoApiUrl); + result.EnsureSuccessStatusCode(); } catch (TaskCanceledException ex) { Logger.Debug($"{ex.Message}"); - Logger.Error("A timeout error is thrown from Jfrog server,Please wait for sometime and re run the pipeline again"); + ExceptionHandling.TaskCancelledException(ex,"Jfrog"); Environment.Exit(-1); - - } + } return result; } From 1f0640b8fa4284df3874550cb2c3d73f869c6dda Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Wed, 20 Mar 2024 09:53:25 +0530 Subject: [PATCH 13/29] Bug fix while backupfile createing for mixed project bomfile. --- src/LCT.Common/FileOperations.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/LCT.Common/FileOperations.cs b/src/LCT.Common/FileOperations.cs index 437cd7b2..3ec79012 100644 --- a/src/LCT.Common/FileOperations.cs +++ b/src/LCT.Common/FileOperations.cs @@ -167,7 +167,7 @@ public string WriteContentToCycloneDXFile(T dataToWrite, string filePath, str private static void BackupTheGivenFile(string folderPath, string fileName) { string oldFile = Path.Combine(folderPath, fileName); - string newFile = string.Format("{0}/{1:MM-dd-yyyy_HHmm}_Backup_{2}", folderPath, DateTime.Now, fileName); + string newFile = string.Format("{0}/{1:MM-dd-yyyy_HHmm_ss}_Backup_{2}", folderPath, DateTime.Now, fileName); Logger.Debug($"BackupTheGivenFile():oldFile{oldFile},newFile{newFile}"); try { @@ -179,15 +179,18 @@ private static void BackupTheGivenFile(string folderPath, string fileName) } catch (IOException ex) { - Logger.Debug($"BackupTheGivenFile():", ex); + Logger.Error($"Error occurred while generating backup BOM file", ex); + Environment.ExitCode = -1; } catch (NotSupportedException ex) { - Logger.Debug($"BackupTheGivenFile():", ex); + Logger.Error($"Error occurred while generating backup BOM file", ex); + Environment.ExitCode = -1; } catch (UnauthorizedAccessException ex) { - Logger.Debug($"BackupTheGivenFile():", ex); + Logger.Error($"Error occurred while generating backup BOM file", ex); + Environment.ExitCode = -1; } } } From bfa1749bb6b46a77536e10d961a8804ca06629dc Mon Sep 17 00:00:00 2001 From: Sumanth K B Date: Wed, 20 Mar 2024 15:55:37 +0530 Subject: [PATCH 14/29] AppSetting Exception handling --- src/ArtifactoryUploader/Program.cs | 4 +- src/LCT.Common/ExceptionHandling.cs | 24 ++++-------- src/LCT.Common/Interface/ISettingsManager.cs | 2 + src/LCT.Common/SettingsManager.cs | 40 +++++++------------- src/LCT.PackageIdentifier/Program.cs | 4 +- src/LCT.SW360PackageCreator/Program.cs | 4 +- 6 files changed, 32 insertions(+), 46 deletions(-) diff --git a/src/ArtifactoryUploader/Program.cs b/src/ArtifactoryUploader/Program.cs index 4bc0958e..ffaa0ce7 100644 --- a/src/ArtifactoryUploader/Program.cs +++ b/src/ArtifactoryUploader/Program.cs @@ -39,10 +39,12 @@ static async Task Main(string[] args) if (!m_Verbose && CommonHelper.IsAzureDevOpsDebugEnabled()) m_Verbose = true; - ISettingsManager settingsManager = new SettingsManager("Uploader"); + ISettingsManager settingsManager = new SettingsManager(); CommonAppSettings appSettings = settingsManager.ReadConfiguration(args, FileConstant.appSettingFileName); string FolderPath = InitiateLogger(appSettings); + settingsManager.CheckRequiredArgsToRun(appSettings, "Uploader"); + Logger.Logger.Log(null, Level.Notice, $"\n====================<<<<< Artifactory Uploader >>>>>====================", null); Logger.Logger.Log(null, Level.Notice, $"\nStart of Artifactory Uploader execution: {DateTime.Now}", null); diff --git a/src/LCT.Common/ExceptionHandling.cs b/src/LCT.Common/ExceptionHandling.cs index 6cbddf8a..1f59d8ac 100644 --- a/src/LCT.Common/ExceptionHandling.cs +++ b/src/LCT.Common/ExceptionHandling.cs @@ -4,18 +4,13 @@ // SPDX-License-Identifier: MIT // -------------------------------------------------------------------------------------------------------------------- - - using log4net; using log4net.Core; using System; -using System.Net; using System.Net.Http; using System.Reflection; using System.Threading.Tasks; - - namespace LCT.Common { public class ExceptionHandling @@ -28,38 +23,33 @@ public static void HttpException(HttpRequestException ex, HttpResponseMessage re if (400 <= Convert.ToInt32(response.StatusCode) && Convert.ToInt32(response.StatusCode) <= 499) { Logger.Logger.Log(null, Level.Error, $"The exception may be caused by an incorrect projectid or missing token for {exceptionSource} , Please ensure that a valid token is provided and try again:{ex.Message}", null); - - }else if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599) + + } + else if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599) { Logger.Logger.Log(null, Level.Error, $"\tThe exception may arise because {exceptionSource} is currently unresponsive:{ex.Message} Please try again later", null); - } + } } public static void FossologyException(HttpRequestException ex) { - if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599 ) + if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599) { Logger.Logger.Log(null, Level.Error, $"\tThe exception may arise because fossology is currently unresponsive:{ex.Message} Please try again later", null); } else { Logger.Logger.Log(null, Level.Error, $"\tThe exception may be caused by an incorrect or missing token for fossology :{ex.Message} Please ensure that a valid token is provided and try again", null); - } - } - public static void AggregateException(AggregateException ex, string exceptionSource) + public static void ArgumentException( string message) { - Logger.Logger.Log(null, Level.Error, $"An exception has occurred due to unknown reasons originating from {exceptionSource}:{ex.Message}", null); + Logger.Logger.Log(null, Level.Error, $"Missing Arguments: Please provide the below arguments via inline or in the appSettings.json file to proceed.\n{message}", null); } public static void TaskCancelledException(TaskCanceledException ex, string exceptionSource) { Logger.Logger.Log(null, Level.Error, $"A timeout error is thrown from {exceptionSource} server,Please wait for sometime and re run the pipeline again:{ex.Message}", null); } - public static void InvalidOperationException(InvalidOperationException ex, string exceptionSource) - { - Logger.Logger.Log(null, Level.Error, $"An exception has occurred from {exceptionSource}:{ex.Message}", null); - } } } \ No newline at end of file diff --git a/src/LCT.Common/Interface/ISettingsManager.cs b/src/LCT.Common/Interface/ISettingsManager.cs index 31c4b6bf..92cdc262 100644 --- a/src/LCT.Common/Interface/ISettingsManager.cs +++ b/src/LCT.Common/Interface/ISettingsManager.cs @@ -18,5 +18,7 @@ public interface ISettingsManager /// jsonSettingsFileName /// AppSettings public T ReadConfiguration(string[] args, string jsonSettingsFileName); + + public void CheckRequiredArgsToRun(CommonAppSettings appSettings, string currentExe); } } diff --git a/src/LCT.Common/SettingsManager.cs b/src/LCT.Common/SettingsManager.cs index 92d616f7..7c4cf158 100644 --- a/src/LCT.Common/SettingsManager.cs +++ b/src/LCT.Common/SettingsManager.cs @@ -24,12 +24,6 @@ public class SettingsManager : ISettingsManager { public string BasePath { get; private set; } = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private readonly string _currentExe; - - public SettingsManager(string currentExe) - { - _currentExe = currentExe; - } /// /// Reads the Configuration from input args and json setting file @@ -73,10 +67,6 @@ public T ReadConfiguration(string[] args, string jsonSettingsFileName) throw new InvalidDataException(nameof(appSettings)); } - else - { - CheckRequiredArgsToRun(appSettings as CommonAppSettings, _currentExe); - } Logger.Debug($"ReadConfiguration():End"); @@ -121,22 +111,22 @@ internal string GetConfigFilePathFromArgs(string[] args, string jsonSettingsFile return settingsFilePath; } - private void CheckRequiredArgsToRun(CommonAppSettings commonAppSettings, string runningExe) + public void CheckRequiredArgsToRun(CommonAppSettings appSettings, string currentExe) { - Type type = commonAppSettings.GetType(); + Type type = appSettings.GetType(); PropertyInfo[] properties = type.GetProperties(); - if (runningExe == "Identifer") + if (currentExe == "Identifer") { - CheckRequiredArgsToRunPackageIdentifier(commonAppSettings, properties); + CheckRequiredArgsToRunPackageIdentifier(appSettings, properties); } - else if (runningExe == "Creator") + else if (currentExe == "Creator") { - CheckRequiredArgsToRunComponentCreator(commonAppSettings, properties); + CheckRequiredArgsToRunComponentCreator(appSettings, properties); } else { - CheckRequiredArgsToRunArtifactoryUploader(commonAppSettings, properties); + CheckRequiredArgsToRunArtifactoryUploader(appSettings, properties); } } @@ -149,7 +139,6 @@ private static void CheckRequiredArgsToRunPackageIdentifier(CommonAppSettings ap { "SW360ProjectID", "Sw360Token", - "SW360AuthTokenType", "SW360URL", "JFrogApi", "PackageFilePath", @@ -165,14 +154,14 @@ private static void CheckRequiredArgsToRunPackageIdentifier(CommonAppSettings ap if (string.IsNullOrWhiteSpace(value)) { - missingParameters.Append(key + " "); + missingParameters.Append(key + "\n"); } } if (!string.IsNullOrWhiteSpace(missingParameters.ToString())) { - //LogExceptionHandling.ArgumentException(null, missingParameters.ToString()); - //Logger.Logger.Log(null, Level.Error, $"\t CheckRequiredArgsToRunPackageIdentifier : Missing parameters {missingParameters} ", null); + ExceptionHandling.ArgumentException(missingParameters.ToString()); + Environment.Exit(-1); } } @@ -185,7 +174,6 @@ private static void CheckRequiredArgsToRunComponentCreator(CommonAppSettings app { "SW360ProjectID", "Sw360Token", - "SW360AuthTokenType", "SW360URL", "BomFilePath" }; @@ -202,8 +190,8 @@ private static void CheckRequiredArgsToRunComponentCreator(CommonAppSettings app if (!string.IsNullOrWhiteSpace(missingParameters.ToString())) { - //LogExceptionHandling.ArgumentException(null, missingParameters.ToString()); - //Logger.Logger.Log(null, Level.Error, $"\t CheckRequiredArgsToRunSw360PackageCreator : Missing parameters {missingParameters} ", null); + ExceptionHandling.ArgumentException(missingParameters.ToString()); + Environment.Exit(-1); } } @@ -231,8 +219,8 @@ private static void CheckRequiredArgsToRunArtifactoryUploader(CommonAppSettings if (!string.IsNullOrWhiteSpace(missingParameters.ToString())) { - //LogExceptionHandling.ArgumentException(null, missingParameters.ToString()); - //Logger.Logger.Log(null, Level.Error, $"\t CheckRequiredArgsToRunArtifactoryUploader : Missing parameters {missingParameters} ", null); + ExceptionHandling.ArgumentException(missingParameters.ToString()); + Environment.Exit(-1); } } diff --git a/src/LCT.PackageIdentifier/Program.cs b/src/LCT.PackageIdentifier/Program.cs index d610151a..24a4a55c 100644 --- a/src/LCT.PackageIdentifier/Program.cs +++ b/src/LCT.PackageIdentifier/Program.cs @@ -45,11 +45,13 @@ static async Task Main(string[] args) if (!m_Verbose && CommonHelper.IsAzureDevOpsDebugEnabled()) m_Verbose = true; - ISettingsManager settingsManager = new SettingsManager("Identifer"); + ISettingsManager settingsManager = new SettingsManager(); CommonAppSettings appSettings = settingsManager.ReadConfiguration(args, FileConstant.appSettingFileName); string FolderPath = LogFolderInitialisation(appSettings); + settingsManager.CheckRequiredArgsToRun(appSettings, "Identifer"); + Logger.Logger.Log(null, Level.Notice, $"\n====================<<<<< Package Identifier >>>>>====================", null); Logger.Logger.Log(null, Level.Notice, $"\nStart of Package Identifier execution: {DateTime.Now}", null); diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index fc689942..bada6cfd 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -45,7 +45,7 @@ static async Task Main(string[] args) if (!m_Verbose && CommonHelper.IsAzureDevOpsDebugEnabled()) m_Verbose = true; - ISettingsManager settingsManager = new SettingsManager("Creator"); + ISettingsManager settingsManager = new SettingsManager(); CommonAppSettings appSettings = settingsManager.ReadConfiguration(args, FileConstant.appSettingFileName); ISW360ApicommunicationFacade sW360ApicommunicationFacade; ISw360ProjectService sw360ProjectService= Getsw360ProjectServiceObject(appSettings, out sW360ApicommunicationFacade); @@ -53,6 +53,8 @@ static async Task Main(string[] args) string FolderPath = InitiateLogger(appSettings); await CreatorValidator.ValidateAppSettings(appSettings, sw360ProjectService); + settingsManager.CheckRequiredArgsToRun(appSettings, "Creator"); + Logger.Logger.Log(null, Level.Notice, $"\n====================<<<<< Package creator >>>>>====================", null); Logger.Logger.Log(null, Level.Notice, $"\nStart of Package creator execution : {DateTime.Now}", null); if (appSettings.ProjectType.ToUpperInvariant() == "ALPINE") From e93eb5d5c044151f7114658ca3e706a337b188f6 Mon Sep 17 00:00:00 2001 From: Sumanth K B Date: Wed, 20 Mar 2024 17:39:01 +0530 Subject: [PATCH 15/29] Usage Doc update --- CA.nuspec | 2 +- doc/UsageDoc/CA_UsageDocument.md | 22 +++------------------- src/LCT.PackageIdentifier/BomCreator.cs | 4 ++++ 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/CA.nuspec b/CA.nuspec index 2fe4ff43..b771d758 100644 --- a/CA.nuspec +++ b/CA.nuspec @@ -4,7 +4,7 @@ continuous-clearing - 6.1.0 + 6.2.0 Siemens AG continuous-clearing contributors https://github.com/siemens/continuous-clearing diff --git a/doc/UsageDoc/CA_UsageDocument.md b/doc/UsageDoc/CA_UsageDocument.md index 066a49de..0a008a69 100644 --- a/doc/UsageDoc/CA_UsageDocument.md +++ b/doc/UsageDoc/CA_UsageDocument.md @@ -207,36 +207,20 @@ Currently LTA support is not provided for SBOM, hence until that is implemented * Input file repository should contain **conan.lock** file. - - **Project Type :** **Debian** + - **Project Type :** **Debian & Alpine** **Note** : below steps is required only if you have `tar` file to process , otherwise you can keep `CycloneDx.json` file in the InputDirectory. * Create `InputImage` directory for keeping `tar` images and `InputDirectory` for resulted file storing . * Run the command given below by replacing the place holder values (i.e., path to input image directory, path to input directory and file name of the Debian image to be cleared) with actual values. - **Example**: `docker run --rm -v :/tmp/InputImages -v :/tmp/OutputFiles ghcr.io/siemens/continuous-clearing ./syft packages /tmp/InputImages/ -o cyclonedx-json --file "/tmp/OutputFiles/output.json"` + **Example**: `docker run --rm -v :/tmp/InputImages -v :/tmp/OutputFiles ghcr.io/siemens/continuous-clearing ./syft packages /tmp/InputImages/ -o cyclonedx-json --file "/tmp/OutputFiles/output.json"` After successful execution, `output.json` (_CycloneDX.json_) file will be created in specified directory ![image.png](../usagedocimg/output.PNG) - Resulted `output.json` file will be having the list of installed packages and the same file will be used as an input to `Continuous clearing tool - Bom creator` as an argument(`--packagefilepath`). The remaining process is same as other project types. - - **Project Type :** **Alpine** - - **Note** : below steps is required only if you have `tar` file to process , otherwise you can keep `CycloneDx.json` file in the InputDirectory. - ` - * Create `InputImage` directory for keeping `tar` images and `InputDirectory` for resulted file storing . - - * Run the command given below by replacing the place holder values (i.e., path to input image directory, path to input directory and file name of the Alpine image to be cleared) with actual values. - - **Example**: `docker run --rm -v :/tmp/InputImages -v :/tmp/OutputFiles ghcr.io/siemens/continuous-clearing ./syft packages /tmp/InputImages/ -o cyclonedx-json --file "/tmp/OutputFiles/output.json"` - - - After successful execution, `output.json` (_CycloneDX.json_) file will be created in specified directory - - ![image.png](../usagedocimg/output.PNG) - Resulted `output.json` file will be having the list of installed packages and the same file will be used as an input to `Continuous clearing tool - Bom creator` as an argument(`--packagefilepath`). The remaining process is same as other project types. ### **Configuring the Continuous Clearing Tool** @@ -253,7 +237,7 @@ Currently LTA support is not provided for SBOM, hence until that is implemented ``` { - "CaVersion": "4.0.0", + "CaVersion": "6.2.0", "TimeOut": 200, "ProjectType": "", "SW360ProjectName": "", diff --git a/src/LCT.PackageIdentifier/BomCreator.cs b/src/LCT.PackageIdentifier/BomCreator.cs index edfbafcb..1b77a7b0 100644 --- a/src/LCT.PackageIdentifier/BomCreator.cs +++ b/src/LCT.PackageIdentifier/BomCreator.cs @@ -185,6 +185,10 @@ public async Task CheckJFrogConnection() { Logger.Logger.Log(null, Level.Error, $"Check the provided JFrog server details..", null); } + else + { + Logger.Logger.Log(null, Level.Error, $"JFrog Connection was not successfull check the server status.", null); + } } return false; } From 475a4d49c2385a79c19510292937f7dbf0658951 Mon Sep 17 00:00:00 2001 From: Sumanth K B Date: Thu, 21 Mar 2024 10:24:20 +0530 Subject: [PATCH 16/29] Copyright & other Changes --- doc/UsageDoc/CA_UsageDocument.md | 2 +- .../SW360Apicommunication.cs | 3 +- src/LCT.Common/ExceptionHandling.cs | 3 +- src/LCT.Common/SettingsManager.cs | 83 +++++-------------- src/LCT.SW360PackageCreator/Program.cs | 3 +- src/LCT.Services/Sw360ProjectService.cs | 7 +- 6 files changed, 28 insertions(+), 73 deletions(-) diff --git a/doc/UsageDoc/CA_UsageDocument.md b/doc/UsageDoc/CA_UsageDocument.md index 0a008a69..c97f1240 100644 --- a/doc/UsageDoc/CA_UsageDocument.md +++ b/doc/UsageDoc/CA_UsageDocument.md @@ -547,4 +547,4 @@ For reporting any bug or enhancement and for your feedbacks click [here](https:/ - SW360 API Guide : [https://www.eclipse.org/sw360/docs/development/restapi/dev-rest-api/](https://www.eclipse.org/sw360/docs/development/restapi/dev-rest-api/) - FOSSology API Guide: [https://www.fossology.org/get-started/basic-rest-api-calls/](https://www.fossology.org/get-started/basic-rest-api-calls/) -Copyright © Siemens AG ▪ 2023 +Copyright © Siemens AG ▪ 2024 diff --git a/src/LCT.APICommunications/SW360Apicommunication.cs b/src/LCT.APICommunications/SW360Apicommunication.cs index 537da02b..006a7065 100644 --- a/src/LCT.APICommunications/SW360Apicommunication.cs +++ b/src/LCT.APICommunications/SW360Apicommunication.cs @@ -104,13 +104,12 @@ public async Task GetProjectById(string projectId) string projectsByTagUrl = $"{sw360ProjectsApi}/{projectId}"; try { - result = await httpClient.GetAsync(projectsByTagUrl); result.EnsureSuccessStatusCode(); } catch (HttpRequestException ex) { - ExceptionHandling.HttpException(ex,result,"SW360"); + ExceptionHandling.HttpException(ex, result, "SW360"); Environment.Exit(-1); } catch (TaskCanceledException ex) diff --git a/src/LCT.Common/ExceptionHandling.cs b/src/LCT.Common/ExceptionHandling.cs index 1f59d8ac..e0da4515 100644 --- a/src/LCT.Common/ExceptionHandling.cs +++ b/src/LCT.Common/ExceptionHandling.cs @@ -45,7 +45,8 @@ public static void FossologyException(HttpRequestException ex) public static void ArgumentException( string message) { - Logger.Logger.Log(null, Level.Error, $"Missing Arguments: Please provide the below arguments via inline or in the appSettings.json file to proceed.\n{message}", null); + Logger.Logger.Log(null, Level.Error, $"Missing Arguments: Please provide the below arguments via inline or in the appSettings.json file to proceed.", null); + Logger.Logger.Log(null, Level.Warn, $"{message}", null); } public static void TaskCancelledException(TaskCanceledException ex, string exceptionSource) { diff --git a/src/LCT.Common/SettingsManager.cs b/src/LCT.Common/SettingsManager.cs index 7c4cf158..eda9097f 100644 --- a/src/LCT.Common/SettingsManager.cs +++ b/src/LCT.Common/SettingsManager.cs @@ -118,24 +118,8 @@ public void CheckRequiredArgsToRun(CommonAppSettings appSettings, string current if (currentExe == "Identifer") { - CheckRequiredArgsToRunPackageIdentifier(appSettings, properties); - } - else if (currentExe == "Creator") - { - CheckRequiredArgsToRunComponentCreator(appSettings, properties); - } - else - { - CheckRequiredArgsToRunArtifactoryUploader(appSettings, properties); - } - } - - private static void CheckRequiredArgsToRunPackageIdentifier(CommonAppSettings appSettings, PropertyInfo[] properties) - { - StringBuilder missingParameters = new StringBuilder(); - - //Required parameters to run Package Identifier - List identifierReqParameters = new List() + //Required parameters to run Package Identifier + List identifierReqParameters = new List() { "SW360ProjectID", "Sw360Token", @@ -147,73 +131,44 @@ private static void CheckRequiredArgsToRunPackageIdentifier(CommonAppSettings ap "InternalRepoList", "ProjectType" }; - - foreach (string key in identifierReqParameters) - { - string value = properties.First(x => x.Name == key)?.GetValue(appSettings)?.ToString(); - - if (string.IsNullOrWhiteSpace(value)) - { - missingParameters.Append(key + "\n"); - } + CheckForMissingParameter(appSettings, properties, identifierReqParameters); } - - if (!string.IsNullOrWhiteSpace(missingParameters.ToString())) + else if (currentExe == "Creator") { - ExceptionHandling.ArgumentException(missingParameters.ToString()); - Environment.Exit(-1); - } - } - - private static void CheckRequiredArgsToRunComponentCreator(CommonAppSettings appSettings, PropertyInfo[] properties) - { - StringBuilder missingParameters = new StringBuilder(); - - //Required parameters to run SW360Component Creator - List creatorReqParameters = new List() + //Required parameters to run SW360Component Creator + List creatorReqParameters = new List() { "SW360ProjectID", "Sw360Token", "SW360URL", "BomFilePath" }; - - foreach (string key in creatorReqParameters) - { - string value = properties.First(x => x.Name == key)?.GetValue(appSettings)?.ToString(); - - if (string.IsNullOrWhiteSpace(value)) - { - missingParameters.Append(key + " "); - } + CheckForMissingParameter(appSettings, properties, creatorReqParameters); } - - if (!string.IsNullOrWhiteSpace(missingParameters.ToString())) + else { - ExceptionHandling.ArgumentException(missingParameters.ToString()); - Environment.Exit(-1); - } - } - - private static void CheckRequiredArgsToRunArtifactoryUploader(CommonAppSettings appSettings, PropertyInfo[] properties) - { - StringBuilder missingParameters = new StringBuilder(); - - //Required parameters to run Artifactory Uploader - List uploaderReqParameters = new List() + //Required parameters to run Artifactory Uploader + List uploaderReqParameters = new List() { "JFrogApi", "BomFilePath", "ArtifactoryUploadApiKey", }; + CheckForMissingParameter(appSettings, properties, uploaderReqParameters); + } + } + + private static void CheckForMissingParameter(CommonAppSettings appSettings, PropertyInfo[] properties, List reqParameters) + { + StringBuilder missingParameters = new StringBuilder(); - foreach (string key in uploaderReqParameters) + foreach (string key in reqParameters) { string value = properties.First(x => x.Name == key)?.GetValue(appSettings)?.ToString(); if (string.IsNullOrWhiteSpace(value)) { - missingParameters.Append(key + " "); + missingParameters.Append(key + "\n"); } } diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index bada6cfd..cb5eb449 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -51,9 +51,8 @@ static async Task Main(string[] args) ISw360ProjectService sw360ProjectService= Getsw360ProjectServiceObject(appSettings, out sW360ApicommunicationFacade); string FolderPath = InitiateLogger(appSettings); - await CreatorValidator.ValidateAppSettings(appSettings, sw360ProjectService); - settingsManager.CheckRequiredArgsToRun(appSettings, "Creator"); + await CreatorValidator.ValidateAppSettings(appSettings, sw360ProjectService); Logger.Logger.Log(null, Level.Notice, $"\n====================<<<<< Package creator >>>>>====================", null); Logger.Logger.Log(null, Level.Notice, $"\nStart of Package creator execution : {DateTime.Now}", null); diff --git a/src/LCT.Services/Sw360ProjectService.cs b/src/LCT.Services/Sw360ProjectService.cs index fbdcc75c..0dd5b48d 100644 --- a/src/LCT.Services/Sw360ProjectService.cs +++ b/src/LCT.Services/Sw360ProjectService.cs @@ -56,19 +56,20 @@ public async Task GetProjectNameByProjectIDFromSW360(string projectId, s { var projectInfo = JsonConvert.DeserializeObject(result); sw360ProjectName = projectInfo?.Name; + } } catch (HttpRequestException ex) { - Environment.ExitCode = -1; Logger.Error($"Failed to connect SW360 : {ex.Message}"); Logger.Debug($"GetProjectNameByProjectIDFromSW360()", ex); + Environment.ExitCode = -1; } catch (AggregateException ex) { - Environment.ExitCode = -1; Logger.Error($"Failed to connect SW360 : {ex.Message}"); Logger.Debug($"GetProjectNameByProjectIDFromSW360()", ex); + Environment.ExitCode = -1; } return sw360ProjectName; @@ -99,7 +100,7 @@ public async Task> GetAlreadyLinkedReleasesByProjectId(strin { Comment = sw360Release.Comment, ReleaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"), - Relation= sw360Release.Relation + Relation = sw360Release.Relation }; alreadyLinkedReleases.Add(releaseLinked); } From 2f389b9f059b8234c66b59b90092091ff7adde39 Mon Sep 17 00:00:00 2001 From: Sumanth K B Date: Thu, 21 Mar 2024 10:53:37 +0530 Subject: [PATCH 17/29] Review comments --- CA.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CA.nuspec b/CA.nuspec index b771d758..e9fc6a7d 100644 --- a/CA.nuspec +++ b/CA.nuspec @@ -17,7 +17,7 @@ for clearing license - Copyright 2023 + Copyright 2024 ClearingTool SW360 OSS Clearing Software Continuous-Clearing NPM NUGET DEBIAN MAVEN PYTHON SBOM From e7f9872ce4f91567548f2d21a49ee9c69c05da9a Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Wed, 27 Mar 2024 09:48:36 +0530 Subject: [PATCH 18/29] Remove unnessasary thing --- src/LCT.Common/ExceptionHandling.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/LCT.Common/ExceptionHandling.cs b/src/LCT.Common/ExceptionHandling.cs index e0da4515..a32eb7b8 100644 --- a/src/LCT.Common/ExceptionHandling.cs +++ b/src/LCT.Common/ExceptionHandling.cs @@ -27,7 +27,7 @@ public static void HttpException(HttpRequestException ex, HttpResponseMessage re } else if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599) { - Logger.Logger.Log(null, Level.Error, $"\tThe exception may arise because {exceptionSource} is currently unresponsive:{ex.Message} Please try again later", null); + Logger.Logger.Log(null, Level.Error, $"The exception may arise because {exceptionSource} is currently unresponsive:{ex.Message} Please try again later", null); } } @@ -35,11 +35,11 @@ public static void FossologyException(HttpRequestException ex) { if (500 <= Convert.ToInt32(ex.StatusCode) && Convert.ToInt32(ex.StatusCode) <= 599) { - Logger.Logger.Log(null, Level.Error, $"\tThe exception may arise because fossology is currently unresponsive:{ex.Message} Please try again later", null); + Logger.Logger.Log(null, Level.Error, $"The exception may arise because fossology is currently unresponsive:{ex.Message} Please try again later", null); } else { - Logger.Logger.Log(null, Level.Error, $"\tThe exception may be caused by an incorrect or missing token for fossology :{ex.Message} Please ensure that a valid token is provided and try again", null); + Logger.Logger.Log(null, Level.Error, $"The exception may be caused by an incorrect or missing token for fossology :{ex.Message} Please ensure that a valid token is provided and try again", null); } } From 8d8a85edc5ee9b0d08936361f98da80b26a2dfba Mon Sep 17 00:00:00 2001 From: karthika Date: Wed, 27 Mar 2024 14:02:13 +0530 Subject: [PATCH 19/29] package update --- src/LCT.APICommunications/LCT.APICommunications.csproj | 1 + src/LCT.Common/LCT.Common.csproj | 1 + 2 files changed, 2 insertions(+) diff --git a/src/LCT.APICommunications/LCT.APICommunications.csproj b/src/LCT.APICommunications/LCT.APICommunications.csproj index 8502cba3..21e6fe9d 100644 --- a/src/LCT.APICommunications/LCT.APICommunications.csproj +++ b/src/LCT.APICommunications/LCT.APICommunications.csproj @@ -24,6 +24,7 @@ + diff --git a/src/LCT.Common/LCT.Common.csproj b/src/LCT.Common/LCT.Common.csproj index d5fe12af..ef880ba2 100644 --- a/src/LCT.Common/LCT.Common.csproj +++ b/src/LCT.Common/LCT.Common.csproj @@ -27,6 +27,7 @@ + From 4d2df563cb6ae3f191cfda6c8e76500d7239e35e Mon Sep 17 00:00:00 2001 From: Vijayalakshmi027 <58800320+Vijayalakshmi027@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:06:07 +0530 Subject: [PATCH 20/29] DI unit test updates --- src/LCT.Common/CycloneDXBomParser.cs | 7 +- .../Interface/ICycloneDXBomParser.cs | 2 +- .../AlpineParserTests.cs | 80 ++++++++++--------- .../ConanParserTests.cs | 2 +- .../DebianParserTests.cs | 58 +++++++------- .../MavenParserTests.cs | 2 +- .../NPMParserTests.cs | 2 +- .../PythonParserTests.cs | 20 +++-- src/LCT.PackageIdentifier/PythonProcessor.cs | 6 +- 9 files changed, 99 insertions(+), 80 deletions(-) diff --git a/src/LCT.Common/CycloneDXBomParser.cs b/src/LCT.Common/CycloneDXBomParser.cs index 86a6647f..bd570cce 100644 --- a/src/LCT.Common/CycloneDXBomParser.cs +++ b/src/LCT.Common/CycloneDXBomParser.cs @@ -7,7 +7,6 @@ using CycloneDX.Json; using CycloneDX.Models; using LCT.Common.Constants; -using LCT.Common.Model; using log4net; using log4net.Core; using Newtonsoft.Json; @@ -82,14 +81,16 @@ public static void CheckValidComponentsForProjectType(List bom, strin foreach (var component in bom.ToList()) { if (!string.IsNullOrEmpty(component.Name) && !string.IsNullOrEmpty(component.Version) - && !string.IsNullOrEmpty(component.Purl) && component.Purl.Contains(Dataconstant.PurlCheck()[projectType.ToUpper()])) + && !string.IsNullOrEmpty(component.Purl) && + component.Purl.Contains(Dataconstant.PurlCheck()[projectType.ToUpper()])) { //Taking Valid Components for perticular projects } else { bom.Remove(component); - Logger.Debug("CheckValidComponenstForProjectType(): Not valid Component / Purl ID " + component.Purl + " for Project Type :" + projectType); + Logger.Debug("CheckValidComponenstForProjectType(): " + + "Not valid Component / Purl ID " + component.Purl + " for Project Type :" + projectType); } } } diff --git a/src/LCT.Common/Interface/ICycloneDXBomParser.cs b/src/LCT.Common/Interface/ICycloneDXBomParser.cs index 1fd3d286..8de9133d 100644 --- a/src/LCT.Common/Interface/ICycloneDXBomParser.cs +++ b/src/LCT.Common/Interface/ICycloneDXBomParser.cs @@ -5,7 +5,6 @@ // -------------------------------------------------------------------------------------------------------------------- using CycloneDX.Models; -using System.Collections.Generic; namespace LCT.Common { @@ -15,5 +14,6 @@ namespace LCT.Common public interface ICycloneDXBomParser { public Bom ParseCycloneDXBom(string filePath); + } } diff --git a/src/LCT.PackageIdentifier.UTest/AlpineParserTests.cs b/src/LCT.PackageIdentifier.UTest/AlpineParserTests.cs index 0d39c2a7..39dfb449 100644 --- a/src/LCT.PackageIdentifier.UTest/AlpineParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/AlpineParserTests.cs @@ -11,22 +11,37 @@ using System.IO; using LCT.Common.Constants; using Moq; +using System.Collections.Generic; +using Microsoft.Build.Evaluation; namespace LCT.PackageIdentifier.UTest { [TestFixture] - class AlpineParserTests + public class AlpineParserTests { + private readonly AlpineProcessor _alpineProcessor; + + public AlpineParserTests() + { + List components = new List(); + components.Add(new Component() { Name = "apk-tools", Version = "2.12.9-r3", Purl = "pkg:apk/alpine/apk-tools@2.12.9-r3?arch=x86_64&distro=alpine-3.16.2" }); + components.Add(new Component() { Name = "busybox", Version = "1.35.0-r17", Purl = "pkg:apk/alpine/busybox@1.35.0-r17?arch=x86_64&distro=alpine-3.16.2" }); + Bom bom = new() { Components = components }; + + Mock cycloneDXBomParser = new Mock(); + cycloneDXBomParser.Setup(x => x.ParseCycloneDXBom(It.IsAny())).Returns(bom); + + _alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); + } + [Test] public void ParsePackageConfig_GivenAMultipleInputFilePath_ReturnsCounts() { //Arrange - int expectednoofcomponents = 4; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); + string[] Includes = { "*_Alpine.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -37,10 +52,11 @@ public void ParsePackageConfig_GivenAMultipleInputFilePath_ReturnsCounts() }; //Act - Bom listofcomponents = alpineProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _alpineProcessor.ParsePackageFile(appSettings); //Assert - Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); + Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), + "Checks for no of components"); } @@ -48,12 +64,9 @@ public void ParsePackageConfig_GivenAMultipleInputFilePath_ReturnsCounts() public void ParsePackageConfig_GivenAInputFilePath_ReturnsCounts() { //Arrange - int expectednoofcomponents = 4; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Alpine.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -64,22 +77,21 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsCounts() }; //Act - Bom listofcomponents = alpineProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _alpineProcessor.ParsePackageFile(appSettings); //Assert - Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); + Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), + "Checks for no of components"); } [Test] public void ParsePackageConfig_GivenMultipleInputFiles_ReturnsCountOfDuplicates() { //Arrange - int duplicateComponents = 4; + int duplicateComponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); + string[] Includes = { "*_Alpine.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() @@ -91,22 +103,20 @@ public void ParsePackageConfig_GivenMultipleInputFiles_ReturnsCountOfDuplicates( }; //Act - alpineProcessor.ParsePackageFile(appSettings); + _alpineProcessor.ParsePackageFile(appSettings); //Assert - Assert.That(duplicateComponents, Is.EqualTo(BomCreator.bomKpiData.DuplicateComponents), "Checks for no of duplicate components"); + Assert.That(duplicateComponents, Is.EqualTo(BomCreator.bomKpiData.DuplicateComponents), + "Checks for no of duplicate components"); } [Test] public void ParsePackageConfig_GivenAInputFilePath_ReturnsSourceDetails() { //Arrange - string sourceName = "alpine-baselayout" + "_" + "3.4.3-r1"; + string sourceName =@"apk-tools_2.12.9-r3"; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "AlpineSourceDetails_Cyclonedx.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() @@ -118,22 +128,20 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsSourceDetails() }; //Act - Bom listofcomponents = alpineProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _alpineProcessor.ParsePackageFile(appSettings); //Assert - Assert.AreEqual(sourceName, listofcomponents.Components[0].Name + "_" + listofcomponents.Components[0].Version, "Checks component name and version"); + Assert.AreEqual(sourceName, listofcomponents.Components[0].Name + "_" + + listofcomponents.Components[0].Version, "Checks component name and version"); } [Test] public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTotalComponentsList() { //Arrange - int expectednoofcomponents = 5; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Alpine.cdx.json", "SBOMTemplate_Alpine.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; @@ -147,10 +155,11 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTo }; //Act - Bom listofcomponents = alpineProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _alpineProcessor.ParsePackageFile(appSettings); //Assert - Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); + Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), + "Checks for no of components"); } [Test] @@ -159,9 +168,6 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnUp //Arrange string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - AlpineProcessor alpineProcessor = new AlpineProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Alpine.cdx.json", "SBOMTemplate_Alpine.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; @@ -175,8 +181,10 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnUp }; //Act - Bom listofcomponents = alpineProcessor.ParsePackageFile(appSettings); - bool isUpdated = listofcomponents.Components.Exists(x => x.Properties != null && x.Properties.Exists(x => x.Name == Dataconstant.Cdx_IdentifierType && x.Value == Dataconstant.Discovered)); + Bom listofcomponents = _alpineProcessor.ParsePackageFile(appSettings); + bool isUpdated = listofcomponents.Components.Exists(x => x.Properties != null + && x.Properties.Exists(x => x.Name == Dataconstant.Cdx_IdentifierType + && x.Value == Dataconstant.Discovered)); //Assert Assert.IsTrue(isUpdated, "Checks For Updated Property In List "); diff --git a/src/LCT.PackageIdentifier.UTest/ConanParserTests.cs b/src/LCT.PackageIdentifier.UTest/ConanParserTests.cs index 538b41ed..6dde7e67 100644 --- a/src/LCT.PackageIdentifier.UTest/ConanParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/ConanParserTests.cs @@ -254,7 +254,7 @@ public async Task GetArtifactoryRepoName_Conan_ReturnsNotFound_ReturnsFailure() public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTotalComponentsList() { //Arrange - int expectednoofcomponents = 1; + int expectednoofcomponents = 0; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); Mock cycloneDXBomParser = new Mock(); diff --git a/src/LCT.PackageIdentifier.UTest/DebianParserTests.cs b/src/LCT.PackageIdentifier.UTest/DebianParserTests.cs index 55d9d7e5..31dc3db2 100644 --- a/src/LCT.PackageIdentifier.UTest/DebianParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/DebianParserTests.cs @@ -12,22 +12,35 @@ using LCT.Common.Model; using LCT.Common.Constants; using Moq; +using System.Collections.Generic; namespace PackageIdentifier.UTest { [TestFixture] - class DebianParserTests + public class DebianParserTests { + readonly DebianProcessor _debianProcessor; + + public DebianParserTests() + { + List components = new List(); + components.Add(new Component() { Name = "adduser", Version = "3.118", Purl = "pkg:deb/debian/adduser@3.118?arch=all\u0026distro=debian-10" }); + components.Add(new Component() { Name = "base-files", Version = "10.3+deb10u10", Purl = "pkg:deb/debian/base-files@10.3+deb10u10?arch=amd64\u0026distro=debian-10" }); + Bom bom = new() { Components = components }; + + Mock cycloneDXBomParser = new Mock(); + cycloneDXBomParser.Setup(x => x.ParseCycloneDXBom(It.IsAny())).Returns(bom); + + _debianProcessor = new DebianProcessor(cycloneDXBomParser.Object); + } + [Test] public void ParsePackageConfig_GivenAMultipleInputFilePath_ReturnsCounts() { //Arrange - int expectednoofcomponents = 8; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "*_Debian.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -38,10 +51,11 @@ public void ParsePackageConfig_GivenAMultipleInputFilePath_ReturnsCounts() }; //Act - Bom listofcomponents = DebianProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _debianProcessor.ParsePackageFile(appSettings); //Assert - Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); + Assert.That(expectednoofcomponents, + Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); } @@ -49,12 +63,10 @@ public void ParsePackageConfig_GivenAMultipleInputFilePath_ReturnsCounts() public void ParsePackageConfig_GivenAInputFilePath_ReturnsCounts() { //Arrange - int expectednoofcomponents = 4; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; - Mock cycloneDXBomParser = new Mock(); string OutFolder = Path.GetDirectoryName(exePath); - DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Debian.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() { @@ -65,7 +77,7 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsCounts() }; //Act - Bom listofcomponents = DebianProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _debianProcessor.ParsePackageFile(appSettings); //Assert Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); @@ -75,12 +87,9 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsCounts() public void ParsePackageConfig_GivenMultipleInputFiles_ReturnsCountOfDuplicates() { //Arrange - int duplicateComponents = 1; + int duplicateComponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "*_Debian.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() @@ -92,7 +101,7 @@ public void ParsePackageConfig_GivenMultipleInputFiles_ReturnsCountOfDuplicates( }; //Act - DebianProcessor.ParsePackageFile(appSettings); + _debianProcessor.ParsePackageFile(appSettings); //Assert Assert.That(duplicateComponents, Is.EqualTo(BomCreator.bomKpiData.DuplicateComponents), "Checks for no of duplicate components"); @@ -105,9 +114,6 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsSourceDetails() string sourceName = "adduser" + "_" + "3.118"; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "SourceDetails_Cyclonedx.cdx.json" }; CommonAppSettings appSettings = new CommonAppSettings() @@ -119,7 +125,7 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsSourceDetails() }; //Act - Bom listofcomponents = DebianProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _debianProcessor.ParsePackageFile(appSettings); //Assert Assert.AreEqual(sourceName, listofcomponents.Components[0].Name + "_" + listofcomponents.Components[0].Version, "Checks component name and version"); @@ -129,12 +135,9 @@ public void ParsePackageConfig_GivenAInputFilePath_ReturnsSourceDetails() public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTotalComponentsList() { //Arrange - int expectednoofcomponents = 5; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Debian.cdx.json", "SBOMTemplate_Debian.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; @@ -148,7 +151,7 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTo }; //Act - Bom listofcomponents = DebianProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _debianProcessor.ParsePackageFile(appSettings); //Assert Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); @@ -160,9 +163,6 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnUp //Arrange string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); - Mock cycloneDXBomParser = new Mock(); - - DebianProcessor DebianProcessor = new DebianProcessor(cycloneDXBomParser.Object); string[] Includes = { "CycloneDX_Debian.cdx.json", "SBOMTemplate_Debian.cdx.json" }; string packagefilepath = OutFolder + @"\PackageIdentifierUTTestFiles"; @@ -176,7 +176,7 @@ public void ParsePackageConfig_GivenAInputFilePathAlongWithSBOMTemplate_ReturnUp }; //Act - Bom listofcomponents = DebianProcessor.ParsePackageFile(appSettings); + Bom listofcomponents = _debianProcessor.ParsePackageFile(appSettings); bool isUpdated = listofcomponents.Components.Exists(x => x.Properties != null && x.Properties.Exists(x => x.Name == Dataconstant.Cdx_IdentifierType && x.Value == Dataconstant.Discovered)); //Assert diff --git a/src/LCT.PackageIdentifier.UTest/MavenParserTests.cs b/src/LCT.PackageIdentifier.UTest/MavenParserTests.cs index 002671af..5c78758f 100644 --- a/src/LCT.PackageIdentifier.UTest/MavenParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/MavenParserTests.cs @@ -304,7 +304,7 @@ public void DevDependencyIdentificationLogic_ReturnsCountOfComponents_WithoutDev public void ParsePackageFile_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTotalComponentsList() { //Arrange - int expectednoofcomponents = 2; + int expectednoofcomponents = 1; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string outFolder = Path.GetDirectoryName(exePath); string filepath = outFolder + @"\PackageIdentifierUTTestFiles"; diff --git a/src/LCT.PackageIdentifier.UTest/NPMParserTests.cs b/src/LCT.PackageIdentifier.UTest/NPMParserTests.cs index 35dc38bb..c7059ba7 100644 --- a/src/LCT.PackageIdentifier.UTest/NPMParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/NPMParserTests.cs @@ -136,7 +136,7 @@ public void ParseCycloneDXFile_GivenMultipleInputFiles_ReturnsCounts() public void ParseCycloneDXFile_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTotalComponentsList() { //Arrange - int expectednoofcomponents = 4; + int expectednoofcomponents = 3; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); Mock cycloneDXBomParser = new Mock(); diff --git a/src/LCT.PackageIdentifier.UTest/PythonParserTests.cs b/src/LCT.PackageIdentifier.UTest/PythonParserTests.cs index 6527be49..4cca2706 100644 --- a/src/LCT.PackageIdentifier.UTest/PythonParserTests.cs +++ b/src/LCT.PackageIdentifier.UTest/PythonParserTests.cs @@ -27,14 +27,21 @@ class PythonParserTests readonly PythonProcessor pythonProcessor; public PythonParserTests() { + + List components = new List(); + components.Add(new Component() { Name = "virtualenv", Version = "20.16.5", Purl = "pkg:pypi/virtualenv@20.16.5" }); + components.Add(new Component() { Name = "virtualenv", Version = "20.19.0", Purl = "pkg:pypi/virtualenv@20.19.0" }); + Bom bom = new() { Components = components }; + Mock cycloneDXBomParser = new Mock(); + cycloneDXBomParser.Setup(x => x.ParseCycloneDXBom(It.IsAny())).Returns(bom); pythonProcessor = new PythonProcessor(cycloneDXBomParser.Object); } [Test] public void ParseCycloneDXFile_GivenAMultipleInputFilePath_ReturnsCounts() { //Arrange - int expectednoofcomponents = 9; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); string[] Includes = { "*_Python.cdx.json" }; @@ -58,7 +65,7 @@ public void ParseCycloneDXFile_GivenAMultipleInputFilePath_ReturnsCounts() public void ParseCycloneDXFile_GivenAInputFilePath_ReturnsCounts() { //Arrange - int expectednoofcomponents = 4; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); string[] Includes = { "CycloneDX_Python.cdx.json" }; @@ -74,13 +81,14 @@ public void ParseCycloneDXFile_GivenAInputFilePath_ReturnsCounts() Bom listofcomponents = pythonProcessor.ParsePackageFile(appSettings); //Assert - Assert.That(expectednoofcomponents, Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); + Assert.That(expectednoofcomponents, + Is.EqualTo(listofcomponents.Components.Count), "Checks for no of components"); } [Test] public void ParseCycloneDXFile_GivenAInputFilePathExcludeOneComponent_ReturnsCounts() { //Arrange - int expectednoofcomponents = 3; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); string[] Includes = { "CycloneDX_Python.cdx.json" }; @@ -111,7 +119,7 @@ public void ParseCycloneDXFile_GivenAInputFilePathExcludeOneComponent_ReturnsCou public void ParseCycloneDXFile_GivenMultipleInputFiles_ReturnsCountOfDuplicates() { //Arrange - int duplicateComponents = 1; + int duplicateComponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); string[] Includes = { "*_Python.cdx.json" }; @@ -134,7 +142,7 @@ public void ParseCycloneDXFile_GivenMultipleInputFiles_ReturnsCountOfDuplicates( public void ParseCycloneDXFile_GivenAInputFilePathAlongWithSBOMTemplate_ReturnTotalComponentsList() { //Arrange - int expectednoofcomponents = 5; + int expectednoofcomponents = 2; string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string OutFolder = Path.GetDirectoryName(exePath); string[] Includes = { "CycloneDX_Python.cdx.json", "SBOMTemplate_Python.cdx.json" }; diff --git a/src/LCT.PackageIdentifier/PythonProcessor.cs b/src/LCT.PackageIdentifier/PythonProcessor.cs index 626515c2..f1058ce2 100644 --- a/src/LCT.PackageIdentifier/PythonProcessor.cs +++ b/src/LCT.PackageIdentifier/PythonProcessor.cs @@ -58,7 +58,8 @@ public Bom ParsePackageFile(CommonAppSettings appSettings) } Bom templateDetails = new Bom(); - if (File.Exists(appSettings.CycloneDxSBomTemplatePath) && appSettings.CycloneDxSBomTemplatePath.EndsWith(FileConstant.SBOMTemplateFileExtension)) + if (File.Exists(appSettings.CycloneDxSBomTemplatePath) + && appSettings.CycloneDxSBomTemplatePath.EndsWith(FileConstant.SBOMTemplateFileExtension)) { templateDetails = CycloneDXBomParser.ExtractSBOMDetailsFromTemplate(_cycloneDXBomParser.ParseCycloneDXBom(appSettings.CycloneDxSBomTemplatePath)); CycloneDXBomParser.CheckValidComponentsForProjectType(templateDetails.Components, appSettings.ProjectType); @@ -265,7 +266,8 @@ private static List FormComponentReleaseExternalID(List componentForBOM = cycloneDXBOM.Components.ToList(); int noOfExcludedComponents = 0; From c1cc4283e9e681ff7593764c29f25f613ddfc164 Mon Sep 17 00:00:00 2001 From: Vijayalakshmi027 <58800320+Vijayalakshmi027@users.noreply.github.com> Date: Tue, 2 Apr 2024 09:21:34 +0530 Subject: [PATCH 21/29] contructor injection --- src/LCT.PackageIdentifier/BomCreator.cs | 21 +++++++++++++-------- src/LCT.PackageIdentifier/Program.cs | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/LCT.PackageIdentifier/BomCreator.cs b/src/LCT.PackageIdentifier/BomCreator.cs index db67fbb6..b3304030 100644 --- a/src/LCT.PackageIdentifier/BomCreator.cs +++ b/src/LCT.PackageIdentifier/BomCreator.cs @@ -30,10 +30,16 @@ public class BomCreator : IBomCreator static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public static readonly BomKpiData bomKpiData = new(); ComponentIdentification componentData; + private readonly ICycloneDXBomParser CycloneDXBomParser; public IJFrogService JFrogService { get; set; } public IBomHelper BomHelper { get; set; } + public BomCreator(ICycloneDXBomParser cycloneDXBomParser) + { + CycloneDXBomParser = cycloneDXBomParser; + } + public async Task GenerateBom(CommonAppSettings appSettings, IBomHelper bomHelper, IFileOperations fileOperations) { Logger.Debug($"GenerateBom():Start"); @@ -101,30 +107,29 @@ private static void WriteContentToCycloneDxBOM(CommonAppSettings appSettings, Bo private async Task CallPackageParser(CommonAppSettings appSettings) { IParser parser; - ICycloneDXBomParser cycloneDXBomParser = new CycloneDXBomParser(); switch (appSettings.ProjectType.ToUpperInvariant()) { case "NPM": - parser = new NpmProcessor(cycloneDXBomParser); + parser = new NpmProcessor(CycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "NUGET": - parser = new NugetProcessor(cycloneDXBomParser); + parser = new NugetProcessor(CycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "MAVEN": - parser = new MavenProcessor(cycloneDXBomParser); + parser = new MavenProcessor(CycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "DEBIAN": - parser = new DebianProcessor(cycloneDXBomParser); + parser = new DebianProcessor(CycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "ALPINE": - parser = new AlpineProcessor(cycloneDXBomParser); + parser = new AlpineProcessor(CycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "PYTHON": - parser = new PythonProcessor(cycloneDXBomParser); + parser = new PythonProcessor(CycloneDXBomParser); return await ComponentIdentification(appSettings, parser); case "CONAN": - parser = new ConanProcessor(cycloneDXBomParser); + parser = new ConanProcessor(CycloneDXBomParser); return await ComponentIdentification(appSettings, parser); default: Logger.Error($"GenerateBom():Invalid ProjectType - {appSettings.ProjectType}"); diff --git a/src/LCT.PackageIdentifier/Program.cs b/src/LCT.PackageIdentifier/Program.cs index b7b0488e..e2aebc8c 100644 --- a/src/LCT.PackageIdentifier/Program.cs +++ b/src/LCT.PackageIdentifier/Program.cs @@ -78,8 +78,8 @@ static async Task Main(string[] args) if (appSettings.IsTestMode) Logger.Logger.Log(null, Level.Notice, $"\tMode\t\t\t --> {appSettings.Mode}\n", null); - - IBomCreator bomCreator = new BomCreator(); + ICycloneDXBomParser cycloneDXBomParser = new CycloneDXBomParser(); + IBomCreator bomCreator = new BomCreator(cycloneDXBomParser); bomCreator.JFrogService = GetJfrogService(appSettings); bomCreator.BomHelper = new BomHelper(); From 656370ae90222174ed451709b8a4296e9037d9e2 Mon Sep 17 00:00:00 2001 From: karthika Date: Tue, 2 Apr 2024 17:00:50 +0530 Subject: [PATCH 22/29] package update --- src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj b/src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj index bbc8d251..4182228e 100644 --- a/src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj +++ b/src/LCT.PackageIdentifier/LCT.PackageIdentifier.csproj @@ -25,6 +25,7 @@ + From f8825945faae5a8c8a0b126e44a9731eac315e39 Mon Sep 17 00:00:00 2001 From: Vijayalakshmi027 <58800320+Vijayalakshmi027@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:59:10 +0530 Subject: [PATCH 23/29] component creator DI changes --- .../PackageDownloaderTest.cs | 1 - .../AlpinePackageDownloader.cs | 4 +++- src/LCT.SW360PackageCreator/ComponentCreator.cs | 3 ++- src/LCT.SW360PackageCreator/Model/ConanSources.cs | 8 +++++++- src/LCT.SW360PackageCreator/PackageDownloader.cs | 1 - src/LCT.SW360PackageCreator/Program.cs | 1 - src/LCT.SW360PackageCreator/Repository.cs | 15 +++++++-------- src/LCT.SW360PackageCreator/URLHelper.cs | 11 ----------- src/TestUtilities/JsonManager.cs | 2 -- src/TestUtilities/TestConstant.cs | 1 - src/TestUtilities/TestHelper.cs | 1 - src/TestUtilities/TestParam.cs | 1 - src/TestUtilities/TestParamAlpine.cs | 1 - src/TestUtilities/TestParamConan.cs | 13 +++++++------ src/TestUtilities/TestParamDebian.cs | 1 - src/TestUtilities/TestParamMaven.cs | 13 +++++++------ 16 files changed, 33 insertions(+), 44 deletions(-) diff --git a/src/LCT.SW360PackageCreator.UTest/PackageDownloaderTest.cs b/src/LCT.SW360PackageCreator.UTest/PackageDownloaderTest.cs index 1ad4e781..45381ec8 100644 --- a/src/LCT.SW360PackageCreator.UTest/PackageDownloaderTest.cs +++ b/src/LCT.SW360PackageCreator.UTest/PackageDownloaderTest.cs @@ -7,7 +7,6 @@ using LCT.Common.Model; using LCT.SW360PackageCreator; using LCT.SW360PackageCreator.Interfaces; -using Moq; using NUnit.Framework; using System.IO; using System.Threading.Tasks; diff --git a/src/LCT.SW360PackageCreator/AlpinePackageDownloader.cs b/src/LCT.SW360PackageCreator/AlpinePackageDownloader.cs index 541309ca..a27f0bab 100644 --- a/src/LCT.SW360PackageCreator/AlpinePackageDownloader.cs +++ b/src/LCT.SW360PackageCreator/AlpinePackageDownloader.cs @@ -214,7 +214,9 @@ public static string PackageFolderGzip(string localPathforDownload, ComparisonBo if (Directory.GetDirectories(localPathforDownload).Length != 0) { - var tempFolder = Directory.CreateDirectory($"{Directory.GetParent(Directory.GetCurrentDirectory())}\\ClearingTool\\DownloadedFiles\\SourceCodeZipped\\{component.Name}\\--{DateTime.Now.ToString("yyyyMMddHHmmss")}\\"); + var tempFolder = Directory.CreateDirectory($"{Directory.GetParent(Directory.GetCurrentDirectory())}" + + $"\\ClearingTool\\DownloadedFiles\\SourceCodeZipped\\{component.Name}\\--" + + $"{DateTime.Now.ToString("yyyyMMddHHmmss")}\\"); tarArchivePath = tempFolder + (component.Name + "_" + component.Version) + ".tar.gz"; var InputDirectory = localPathforDownload; var OutputFilename = tarArchivePath; diff --git a/src/LCT.SW360PackageCreator/ComponentCreator.cs b/src/LCT.SW360PackageCreator/ComponentCreator.cs index 1f8faa7f..33888055 100644 --- a/src/LCT.SW360PackageCreator/ComponentCreator.cs +++ b/src/LCT.SW360PackageCreator/ComponentCreator.cs @@ -303,7 +303,7 @@ private static async Task> GetManuallyLinkedReleasesFromProj { var manuallyLinkedReleases = new List(alreadyLinkedReleases); manuallyLinkedReleases.RemoveAll(x => string.Compare(x.Comment, Dataconstant.LinkedByCATool, StringComparison.OrdinalIgnoreCase) == 0); - + await Task.Yield(); return manuallyLinkedReleases; } @@ -324,6 +324,7 @@ private async Task UpdateSBOMReleasesWithSw360Info(List alreadyLi release.Relation = linkedRelease.Relation; } } + await Task.Yield(); } private async Task CreateComponentAndRealease(ICreatorHelper creatorHelper, diff --git a/src/LCT.SW360PackageCreator/Model/ConanSources.cs b/src/LCT.SW360PackageCreator/Model/ConanSources.cs index 42867fc0..ba4d2505 100644 --- a/src/LCT.SW360PackageCreator/Model/ConanSources.cs +++ b/src/LCT.SW360PackageCreator/Model/ConanSources.cs @@ -1,4 +1,10 @@ -using System.Collections.Generic; +// -------------------------------------------------------------------------------------------------------------------- +// SPDX-FileCopyrightText: 2024 Siemens AG +// +// SPDX-License-Identifier: MIT +// -------------------------------------------------------------------------------------------------------------------- + +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using YamlDotNet.Serialization; diff --git a/src/LCT.SW360PackageCreator/PackageDownloader.cs b/src/LCT.SW360PackageCreator/PackageDownloader.cs index 2a73ad38..a37cefae 100644 --- a/src/LCT.SW360PackageCreator/PackageDownloader.cs +++ b/src/LCT.SW360PackageCreator/PackageDownloader.cs @@ -10,7 +10,6 @@ using System; using System.Threading.Tasks; using log4net; -using log4net.Core; using System.Reflection; using LCT.Common.Constants; using System.IO; diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index cb5eb449..5cdb573f 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -15,7 +15,6 @@ using LCT.SW360PackageCreator.Interfaces; using log4net; using log4net.Core; -using NuGet.Protocol.Plugins; using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/LCT.SW360PackageCreator/Repository.cs b/src/LCT.SW360PackageCreator/Repository.cs index 50e6162c..19d7dc0e 100644 --- a/src/LCT.SW360PackageCreator/Repository.cs +++ b/src/LCT.SW360PackageCreator/Repository.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Linq; namespace LCT.SW360PackageCreator { @@ -80,20 +81,18 @@ public string FormGitCloneUrl(string url, string componentName, string version) private string GetRepoName(string url) { + string repoUrl = string.Empty; if (string.IsNullOrWhiteSpace(url)) { return string.Empty; } - foreach (string repoUrl in m_RepoUrlList) - { - if (url.Contains(repoUrl)) - { - return repoUrl; - } - } + repoUrl = (from string repoUrl2 in m_RepoUrlList + where url.Contains(repoUrl2) + select repoUrl2).FirstOrDefault(); + - return string.Empty; + return repoUrl; } } } diff --git a/src/LCT.SW360PackageCreator/URLHelper.cs b/src/LCT.SW360PackageCreator/URLHelper.cs index 9ea1eb91..80158c69 100644 --- a/src/LCT.SW360PackageCreator/URLHelper.cs +++ b/src/LCT.SW360PackageCreator/URLHelper.cs @@ -5,39 +5,28 @@ // -------------------------------------------------------------------------------------------------------------------- using System; -using System.Collections; using System.Collections.Generic; using System.Diagnostics; -using System.Dynamic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; using System.Runtime.InteropServices; -using System.Security.Policy; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Xml; -using System.Xml.Linq; -using JetBrains.Annotations; -using LCT.APICommunications.Model.Foss; using LCT.Common; using LCT.Common.Constants; using LCT.Common.Model; using LCT.SW360PackageCreator.Interfaces; using LCT.SW360PackageCreator.Model; using log4net; -using Microsoft.PowerShell.Commands; -using Microsoft.Web.Administration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using YamlDotNet.Core; -using YamlDotNet.Core.Tokens; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; -using System.Management.Automation.Runspaces; -using NuGet.ProjectModel; namespace LCT.SW360PackageCreator { diff --git a/src/TestUtilities/JsonManager.cs b/src/TestUtilities/JsonManager.cs index a4fc2dc1..d1c6eff1 100644 --- a/src/TestUtilities/JsonManager.cs +++ b/src/TestUtilities/JsonManager.cs @@ -2,12 +2,10 @@ // SPDX-FileCopyrightText: 2024 Siemens AG // // SPDX-License-Identifier: MIT - // -------------------------------------------------------------------------------------------------------------------- using CycloneDX.Models; using Newtonsoft.Json; -using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; diff --git a/src/TestUtilities/TestConstant.cs b/src/TestUtilities/TestConstant.cs index 6f7b7710..7f1a49da 100644 --- a/src/TestUtilities/TestConstant.cs +++ b/src/TestUtilities/TestConstant.cs @@ -2,7 +2,6 @@ // SPDX-FileCopyrightText: 2024 Siemens AG // // SPDX-License-Identifier: MIT - // -------------------------------------------------------------------------------------------------------------------- using System.Diagnostics.CodeAnalysis; diff --git a/src/TestUtilities/TestHelper.cs b/src/TestUtilities/TestHelper.cs index 8cd8216d..12bf9693 100644 --- a/src/TestUtilities/TestHelper.cs +++ b/src/TestUtilities/TestHelper.cs @@ -2,7 +2,6 @@ // SPDX-FileCopyrightText: 2024 Siemens AG // // SPDX-License-Identifier: MIT - // -------------------------------------------------------------------------------------------------------------------- using System; diff --git a/src/TestUtilities/TestParam.cs b/src/TestUtilities/TestParam.cs index 23dfe5b3..05648096 100644 --- a/src/TestUtilities/TestParam.cs +++ b/src/TestUtilities/TestParam.cs @@ -2,7 +2,6 @@ // SPDX-FileCopyrightText: 2024 Siemens AG // // SPDX-License-Identifier: MIT - // -------------------------------------------------------------------------------------------------------------------- using Microsoft.Extensions.Configuration; diff --git a/src/TestUtilities/TestParamAlpine.cs b/src/TestUtilities/TestParamAlpine.cs index d43e9daf..c76a7a48 100644 --- a/src/TestUtilities/TestParamAlpine.cs +++ b/src/TestUtilities/TestParamAlpine.cs @@ -2,7 +2,6 @@ // SPDX-FileCopyrightText: 2024 Siemens AG // // SPDX-License-Identifier: MIT - // -------------------------------------------------------------------------------------------------------------------- using Microsoft.Extensions.Configuration; diff --git a/src/TestUtilities/TestParamConan.cs b/src/TestUtilities/TestParamConan.cs index e35b5e60..7bd4ed14 100644 --- a/src/TestUtilities/TestParamConan.cs +++ b/src/TestUtilities/TestParamConan.cs @@ -1,9 +1,10 @@ -using Microsoft.Extensions.Configuration; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// -------------------------------------------------------------------------------------------------------------------- +// SPDX-FileCopyrightText: 2024 Siemens AG +// +// SPDX-License-Identifier: MIT +// -------------------------------------------------------------------------------------------------------------------- + +using Microsoft.Extensions.Configuration; namespace TestUtilities { diff --git a/src/TestUtilities/TestParamDebian.cs b/src/TestUtilities/TestParamDebian.cs index f24c9c84..1f0d170b 100644 --- a/src/TestUtilities/TestParamDebian.cs +++ b/src/TestUtilities/TestParamDebian.cs @@ -2,7 +2,6 @@ // SPDX-FileCopyrightText: 2024 Siemens AG // // SPDX-License-Identifier: MIT - // -------------------------------------------------------------------------------------------------------------------- using Microsoft.Extensions.Configuration; diff --git a/src/TestUtilities/TestParamMaven.cs b/src/TestUtilities/TestParamMaven.cs index da72d3c9..b268c3b3 100644 --- a/src/TestUtilities/TestParamMaven.cs +++ b/src/TestUtilities/TestParamMaven.cs @@ -1,9 +1,10 @@ -using Microsoft.Extensions.Configuration; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// -------------------------------------------------------------------------------------------------------------------- +// SPDX-FileCopyrightText: 2024 Siemens AG +// +// SPDX-License-Identifier: MIT +// -------------------------------------------------------------------------------------------------------------------- + +using Microsoft.Extensions.Configuration; namespace TestUtilities { From a584763c1b98e3e688e72175c6fa67271b95c522 Mon Sep 17 00:00:00 2001 From: karthika Date: Fri, 12 Apr 2024 18:06:22 +0530 Subject: [PATCH 24/29] WildCard Pattern matching --- src/LCT.Common/CommonHelper.cs | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/LCT.Common/CommonHelper.cs b/src/LCT.Common/CommonHelper.cs index 9f53c3be..4db2b3ec 100644 --- a/src/LCT.Common/CommonHelper.cs +++ b/src/LCT.Common/CommonHelper.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Text.RegularExpressions; namespace LCT.Common { @@ -24,6 +25,7 @@ public static class CommonHelper private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public static string ProjectSummaryLink { get; set; } + #region public public static bool IsAzureDevOpsDebugEnabled() { string azureDevOpsDebug = System.Environment.GetEnvironmentVariable("System.Debug"); @@ -47,8 +49,8 @@ public static List RemoveExcludedComponents(List Component { name = $"{component.Group}/{component.Name}"; } - - if (name.ToLowerInvariant() == excludedcomponent[0].ToLowerInvariant() && excludedcomponent.Length > 0 && (component.Version.ToLowerInvariant() == excludedcomponent[1].ToLowerInvariant() || excludedcomponent[1].ToLowerInvariant() == "*")) + if (excludedcomponent.Length > 0 && (Regex.IsMatch(name.ToLowerInvariant(), WildcardToRegex(excludedcomponent[0].ToLowerInvariant()))) || + (component.Version.ToLowerInvariant().Contains(excludedcomponent[1].ToLowerInvariant()))) { noOfExcludedComponents++; ExcludedList.Add(component); @@ -145,12 +147,6 @@ public static void WriteToConsoleTable(Dictionary printData, Dictio } } - private static string Sw360URL(string sw360Env, string releaseId) - { - string sw360URL = $"{sw360Env}{"/group/guest/components/-/component/release/detailRelease/"}{releaseId}"; - return sw360URL; - } - public static void WriteComponentsWithoutDownloadURLToKpi(List componentInfo, List lstReleaseNotCreated, string sw360URL) { const string Name = "Name"; @@ -242,7 +238,23 @@ public static void GetDetailsforManuallyAdded(List componentsForBOM, listComponentForBOM.Add(component); } } + #endregion + + #region private + private static string WildcardToRegex(string wildcard) + { + return "^" + Regex.Escape(wildcard).Replace("\\*", ".*") + "$"; + } - + private static string Sw360URL(string sw360Env, string releaseId) + { + string sw360URL = $"{sw360Env}{"/group/guest/components/-/component/release/detailRelease/"}{releaseId}"; + return sw360URL; + } + #endregion } } + + + + From a54404cbb8ae201cd65bbc0992328196d135cf23 Mon Sep 17 00:00:00 2001 From: karthika Date: Tue, 16 Apr 2024 14:16:02 +0530 Subject: [PATCH 25/29] Removed duplicate code --- src/LCT.PackageIdentifier/NugetProcessor.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/LCT.PackageIdentifier/NugetProcessor.cs b/src/LCT.PackageIdentifier/NugetProcessor.cs index 0f1861c1..e07244da 100644 --- a/src/LCT.PackageIdentifier/NugetProcessor.cs +++ b/src/LCT.PackageIdentifier/NugetProcessor.cs @@ -412,8 +412,9 @@ private void ParsingInputFileForBOM(CommonAppSettings appSettings, ref List listComponentForBOM, List listofComponents, List dependencies) @@ -512,11 +513,6 @@ private static void ParseInputFiles(CommonAppSettings appSettings, string filepa private static void CheckForMultipleVersions(CommonAppSettings appSettings, ref List listComponentForBOM, ref int noOfExcludedComponents, List componentsWithMultipleVersions) { - if (appSettings.Nuget.ExcludedComponents != null) - { - listComponentForBOM = CommonHelper.RemoveExcludedComponents(listComponentForBOM, appSettings.Nuget.ExcludedComponents, ref noOfExcludedComponents); - BomCreator.bomKpiData.ComponentsExcluded += noOfExcludedComponents; - } if (componentsWithMultipleVersions.Count != 0) { From 77e352200bf4d42120e26089d3270018c9a8c029 Mon Sep 17 00:00:00 2001 From: karthika Date: Tue, 16 Apr 2024 16:14:57 +0530 Subject: [PATCH 26/29] Bug fix --- src/LCT.Common/CommonHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LCT.Common/CommonHelper.cs b/src/LCT.Common/CommonHelper.cs index 4db2b3ec..c93dae34 100644 --- a/src/LCT.Common/CommonHelper.cs +++ b/src/LCT.Common/CommonHelper.cs @@ -49,8 +49,8 @@ public static List RemoveExcludedComponents(List Component { name = $"{component.Group}/{component.Name}"; } - if (excludedcomponent.Length > 0 && (Regex.IsMatch(name.ToLowerInvariant(), WildcardToRegex(excludedcomponent[0].ToLowerInvariant()))) || - (component.Version.ToLowerInvariant().Contains(excludedcomponent[1].ToLowerInvariant()))) + if (excludedcomponent.Length > 0 && (Regex.IsMatch(name.ToLowerInvariant(), WildcardToRegex(excludedcomponent[0].ToLowerInvariant()))) && + (component.Version.ToLowerInvariant().Contains(excludedcomponent[1].ToLowerInvariant())|| excludedcomponent[1].ToLowerInvariant() == "*")) { noOfExcludedComponents++; ExcludedList.Add(component); From 32f8a31c0ad64b15c09e8581e9bd57e48129823a Mon Sep 17 00:00:00 2001 From: Sumanth Kb Date: Wed, 17 Apr 2024 10:12:24 +0530 Subject: [PATCH 27/29] Nuget Dependency changes --- .../SW360Apicommunication.cs | 2 -- .../NugetDevDependencyParser.cs | 7 +++---- src/LCT.SW360PackageCreator/Program.cs | 2 +- src/LCT.Services/Sw360Service.cs | 17 ++++++++++++++++- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/LCT.APICommunications/SW360Apicommunication.cs b/src/LCT.APICommunications/SW360Apicommunication.cs index 006a7065..1722e900 100644 --- a/src/LCT.APICommunications/SW360Apicommunication.cs +++ b/src/LCT.APICommunications/SW360Apicommunication.cs @@ -71,7 +71,6 @@ public async Task GetProjects() Logger.Debug($"{ex.Message}"); Logger.Error("A timeout error is thrown from SW360 server,Please wait for sometime and re run the pipeline again"); Environment.Exit(-1); - } return result; } @@ -135,7 +134,6 @@ public async Task GetReleases() Logger.Debug($"{ex.Message}"); Logger.Error("A timeout error is thrown from SW360 server,Please wait for sometime and re run the pipeline again"); Environment.Exit(-1); - } return result; } diff --git a/src/LCT.PackageIdentifier/NugetDevDependencyParser.cs b/src/LCT.PackageIdentifier/NugetDevDependencyParser.cs index bae7b42c..175205bc 100644 --- a/src/LCT.PackageIdentifier/NugetDevDependencyParser.cs +++ b/src/LCT.PackageIdentifier/NugetDevDependencyParser.cs @@ -249,10 +249,9 @@ private static void GetDependencies(LockFileTargetLibrary library, NuGetComponen { depPackage = (existingDependency as NuGetComponent)!; } - else - { - components.Add(depPackage.Id, depPackage); - } + + //Dependencies or not adding as a componenst since it's just a + //self-declaration of a component what that main component requires if (!component.Dependencies.Contains(depPackage)) { diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index 5cdb573f..44b29a45 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -55,7 +55,7 @@ static async Task Main(string[] args) Logger.Logger.Log(null, Level.Notice, $"\n====================<<<<< Package creator >>>>>====================", null); Logger.Logger.Log(null, Level.Notice, $"\nStart of Package creator execution : {DateTime.Now}", null); - if (appSettings.ProjectType.ToUpperInvariant() == "ALPINE") + if (appSettings.ProjectType?.ToUpperInvariant() == "ALPINE") { Logger.Error($"\nPlease note that the Alpine feature is currently in preview state. This means it's available for testing and evaluation purposes. While functional, it may not yet include all planned features and could encounter occasional issues. Your feedback during this preview phase is appreciated as we work towards its official release. Thank you for exploring Alpine with us."); } diff --git a/src/LCT.Services/Sw360Service.cs b/src/LCT.Services/Sw360Service.cs index 1f34774d..40e46998 100644 --- a/src/LCT.Services/Sw360Service.cs +++ b/src/LCT.Services/Sw360Service.cs @@ -59,6 +59,14 @@ public async Task> GetAvailableReleasesInSw360(List { Sw360ServiceStopWatch.Start(); string responseBody = await m_SW360ApiCommunicationFacade.GetReleases(); + + if(string.IsNullOrWhiteSpace(responseBody)) + { + Logger.Debug($"GetAvailableReleasesInSw360():"); + Logger.Error("SW360 server is not accessible,Please wait for sometime and re run the pipeline again"); + Environment.ExitCode = -1; + } + Sw360ServiceStopWatch.Stop(); Logger.Debug($"GetAvailableReleasesInSw360():Time taken to in GetReleases() call" + $"-{TimeSpan.FromMilliseconds(Sw360ServiceStopWatch.ElapsedMilliseconds).TotalSeconds}"); @@ -72,8 +80,15 @@ public async Task> GetAvailableReleasesInSw360(List } catch (HttpRequestException ex) { + Logger.Debug($"GetAvailableReleasesInSw360():", ex); + Logger.Error("SW360 server is not accessible,Please wait for sometime and re run the pipeline again"); + Environment.ExitCode = -1; + } + catch (InvalidOperationException ex) + { + Logger.Debug($"GetAvailableReleasesInSw360():", ex); + Logger.Error("SW360 server is not accessible,Please wait for sometime and re run the pipeline again"); Environment.ExitCode = -1; - Logger.Error($"GetAvailableReleasesInSw360():", ex); } return availableComponentsList; From b5ca02d44a1ad73999f9057a50e85480f77762f0 Mon Sep 17 00:00:00 2001 From: Aditya Narayan <57411194+adityanarayanp@users.noreply.github.com> Date: Wed, 17 Apr 2024 14:12:09 +0530 Subject: [PATCH 28/29] SonarQube fixes for release 6.2.0 (#151) * sonar qube fixed and adding UT --------- Co-authored-by: Aditya Narayan --- .../ArtifactoryValidator.cs | 2 - .../DebianJfrogAPICommunicationUTest.cs | 59 +++++++++++++++++++ src/LCT.PackageIdentifier/NpmProcessor.cs | 2 +- src/LCT.PackageIdentifier/NugetProcessor.cs | 5 +- .../ComponentCreator.cs | 2 +- src/LCT.Services/Sw360CreatorService.cs | 13 ---- 6 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 src/LCT.APICommunications.UTest/DebianJfrogAPICommunicationUTest.cs diff --git a/src/ArtifactoryUploader/ArtifactoryValidator.cs b/src/ArtifactoryUploader/ArtifactoryValidator.cs index 923db8fd..3b19e881 100644 --- a/src/ArtifactoryUploader/ArtifactoryValidator.cs +++ b/src/ArtifactoryUploader/ArtifactoryValidator.cs @@ -20,8 +20,6 @@ namespace LCT.ArtifactoryUploader { public class ArtifactoryValidator { - static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private readonly NpmJfrogApiCommunication JfrogApiCommunication; public ArtifactoryValidator(NpmJfrogApiCommunication jfrogApiCommunication) diff --git a/src/LCT.APICommunications.UTest/DebianJfrogAPICommunicationUTest.cs b/src/LCT.APICommunications.UTest/DebianJfrogAPICommunicationUTest.cs new file mode 100644 index 00000000..ccb25032 --- /dev/null +++ b/src/LCT.APICommunications.UTest/DebianJfrogAPICommunicationUTest.cs @@ -0,0 +1,59 @@ +// -------------------------------------------------------------------------------------------------------------------- +// SPDX-FileCopyrightText: 2024 Siemens AG +// +// SPDX-License-Identifier: MIT +// -------------------------------------------------------------------------------------------------------------------- + + +using LCT.APICommunications.Model; + +namespace LCT.APICommunications.UTest +{ + public class DebainJfrogAPICommunicationUTest + { + [SetUp] + public void Setup() + { + // Method intentionally left empty. + } + + [Test] + public void DebainJfrogApiCommunication_CopyFromRemoteRepo_ReturnsInvalidOperationException() + { + //Arrange + ArtifactoryCredentials repoCredentials = new ArtifactoryCredentials(); + + //Act + JfrogApicommunication jfrogApicommunication = new DebianJfrogAPICommunication("", "", repoCredentials,100); + + //Assert + Assert.ThrowsAsync(async () => await jfrogApicommunication.CopyFromRemoteRepo(new ComponentsToArtifactory())); + } + + [Test] + public void DebainJfrogApiCommunication_UpdatePackagePropertiesInJfrog_ReturnsInvalidOperationException() + { + //Arrange + ArtifactoryCredentials repoCredentials = new ArtifactoryCredentials(); + + //Act + JfrogApicommunication jfrogApicommunication = new DebianJfrogAPICommunication("", "", repoCredentials, 100); + + //Assert + Assert.ThrowsAsync(() => { jfrogApicommunication.UpdatePackagePropertiesInJfrog("", "", new UploadArgs()); return Task.CompletedTask; }); + } + + [Test] + public void DebainJfrogApiCommunication_GetPackageInfo_ReturnsInvalidOperationException() + { + //Arrange + ArtifactoryCredentials repoCredentials = new ArtifactoryCredentials(); + + //Act + JfrogApicommunication jfrogApicommunication = new DebianJfrogAPICommunication("", "", repoCredentials, 100); + + //Assert + Assert.ThrowsAsync(async () => await jfrogApicommunication.GetPackageInfo(new ComponentsToArtifactory())); + } + } +} diff --git a/src/LCT.PackageIdentifier/NpmProcessor.cs b/src/LCT.PackageIdentifier/NpmProcessor.cs index 03ff80f9..7bf74d4d 100644 --- a/src/LCT.PackageIdentifier/NpmProcessor.cs +++ b/src/LCT.PackageIdentifier/NpmProcessor.cs @@ -199,7 +199,7 @@ private static void CheckAndAddToBundleComponents(List bundle } - private void GetComponentsForBom(string filepath, CommonAppSettings appSettings, + private static void GetComponentsForBom(string filepath, CommonAppSettings appSettings, ref List bundledComponents, ref List lstComponentForBOM, ref int noOfDevDependent, IEnumerable depencyComponentList) { diff --git a/src/LCT.PackageIdentifier/NugetProcessor.cs b/src/LCT.PackageIdentifier/NugetProcessor.cs index 1056f8f4..898da0d4 100644 --- a/src/LCT.PackageIdentifier/NugetProcessor.cs +++ b/src/LCT.PackageIdentifier/NugetProcessor.cs @@ -45,7 +45,6 @@ public Bom ParsePackageFile(CommonAppSettings appSettings) List listComponentForBOM = new List(); Bom bom = new Bom(); int totalComponentsIdentified = 0; - int noOfExcludedComponents = 0; ParsingInputFileForBOM(appSettings, ref listComponentForBOM, ref bom); totalComponentsIdentified = listComponentForBOM.Count; @@ -59,7 +58,7 @@ public Bom ParsePackageFile(CommonAppSettings appSettings) var componentsWithMultipleVersions = listComponentForBOM.GroupBy(s => s.Name) .Where(g => g.Count() > 1).SelectMany(g => g).ToList(); - CheckForMultipleVersions(appSettings, ref listComponentForBOM, ref noOfExcludedComponents, componentsWithMultipleVersions); + CheckForMultipleVersions(appSettings, componentsWithMultipleVersions); Logger.Debug($"ParsePackageFile():End"); bom.Components = listComponentForBOM; @@ -511,7 +510,7 @@ private static void ParseInputFiles(CommonAppSettings appSettings, string filepa } - private static void CheckForMultipleVersions(CommonAppSettings appSettings, ref List listComponentForBOM, ref int noOfExcludedComponents, List componentsWithMultipleVersions) + private static void CheckForMultipleVersions(CommonAppSettings appSettings, List componentsWithMultipleVersions) { if (componentsWithMultipleVersions.Count != 0) diff --git a/src/LCT.SW360PackageCreator/ComponentCreator.cs b/src/LCT.SW360PackageCreator/ComponentCreator.cs index 33888055..44ad18a0 100644 --- a/src/LCT.SW360PackageCreator/ComponentCreator.cs +++ b/src/LCT.SW360PackageCreator/ComponentCreator.cs @@ -307,7 +307,7 @@ private static async Task> GetManuallyLinkedReleasesFromProj return manuallyLinkedReleases; } - private async Task> GetAlreadyLinkedReleasesByProjectId(string projectId, ISw360ProjectService sw360ProjectService) + private static async Task> GetAlreadyLinkedReleasesByProjectId(string projectId, ISw360ProjectService sw360ProjectService) { List alreadyLinkedReleases = await sw360ProjectService.GetAlreadyLinkedReleasesByProjectId(projectId); return alreadyLinkedReleases; diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index d49541fd..7d642184 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -350,19 +350,6 @@ public async Task GetReleaseIdByName(string componentName, string compon return releaseid ?? string.Empty; } - private async Task UpdateLinkedReleaseComment(string projectId, List releaseIDList) - { - UpdateLinkedRelease updateLinkedRelease = new UpdateLinkedRelease() { Comment = Dataconstant.LinkedByCATool }; - foreach (string releaseId in releaseIDList) - { - var updateResponse = await m_SW360ApiCommunicationFacade.UpdateLinkedRelease(projectId, releaseId, updateLinkedRelease); - if (!updateResponse.IsSuccessStatusCode) - { - Logger.Debug($"UpdateLinkedReleaseComment() : Updating comment to linked release id -{releaseId} of preoject - {projectId} is failed."); - } - } - } - private static string GetReleaseIdFromResponse(string componentName, string componentVersion, string releaseid, string responseBody) { var responseData = JsonConvert.DeserializeObject(responseBody); From 0f8baff5566d38a1f99e976d696eb84094637d39 Mon Sep 17 00:00:00 2001 From: sumanthkb44 <84563853+sumanthkb44@users.noreply.github.com> Date: Wed, 17 Apr 2024 15:19:56 +0530 Subject: [PATCH 29/29] Update CA_UsageDocument.md --- doc/UsageDoc/CA_UsageDocument.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/UsageDoc/CA_UsageDocument.md b/doc/UsageDoc/CA_UsageDocument.md index c97f1240..1202a2f5 100644 --- a/doc/UsageDoc/CA_UsageDocument.md +++ b/doc/UsageDoc/CA_UsageDocument.md @@ -393,7 +393,8 @@ You can also pass the above mentioned arguments in the command line. Incase if you want to exclude a single component of the format _"@group/componentname"_ `eg : @angular/common` specify it as _"@group/componentname:version"_ i.e `@angular/common:4.2.6` - If multiple versions has to be excluded of the same component specify it as _"@group/componentname:*"_ i.e `@angular/common:*` + If multiple versions has to be excluded of the same component, specify it as _"@group/componentname:*"_ i.e `@angular/common:*` + If multiple Component has to be excluded along with version, specify it as _"@group/componentname*:*"_ i.e `@angular/comm*:*` In order to **Exclude specific folders** from the execution, It can be specified under the **Exclude section** of that specific **package type**.