From 5b7a52fb62d45962dfadc35ed82be33985399dbc Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Mon, 3 Feb 2025 17:15:56 +0530 Subject: [PATCH 01/21] Fossology url validation --- .../CreatorValidatorTest.cs | 63 ++++++++++++- .../CreatorValidator.cs | 89 +++++++++++++++++++ src/LCT.SW360PackageCreator/Program.cs | 76 +++++++++++++++- .../Interface/ISW360CreatorService.cs | 1 + src/LCT.Services/Sw360CreatorService.cs | 41 +++++++++ .../Alpine/ComponentCreatorInitialAlpine.cs | 1 + .../Conan/ComponentCreatorInitialConan.cs | 1 + .../Debian/ComponentCreatorInitialDebian.cs | 1 + .../Maven/ComponentCreatorInitialMaven.cs | 1 + .../NPM/ComponentCreatorInitial.cs | 1 + .../NPM/ComponentCreatorTestMode.cs | 1 + .../ComponentCreatorWithUpdatedComponents.cs | 1 + .../Nuget/ComponentCreatorInitialNuget.cs | 1 + .../ComponentCreatorNugetTemplate.cs | 1 + .../Python/ComponentCreatorInitialPython.cs | 1 + src/TestUtilities/TestConstant.cs | 3 +- .../appSettingsSW360IntegrationTest.json | 1 + 17 files changed, 279 insertions(+), 5 deletions(-) diff --git a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs index b41b65fa..e2dac074 100644 --- a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs +++ b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs @@ -13,16 +13,28 @@ using LCT.Common; using System.Threading.Tasks; using LCT.APICommunications.Model; +using LCT.APICommunications.Model.Foss; +using Newtonsoft.Json; +using System.Net.Http; +using LCT.Facade.Interfaces; namespace LCT.SW360PackageCreator.UTest { [TestFixture] public class CreatorValidatorTest { - public Mock mockISw360ProjectService; + public Mock mockISw360ProjectService; + public Mock mockISW360ApicommunicationFacade; + public Mock mockISW360CommonService; + public Mock mockISw360CreatorService; + public Mock mockISW360Service; public CreatorValidatorTest() { - mockISw360ProjectService = new Mock(MockBehavior.Strict); + mockISw360ProjectService = new Mock(MockBehavior.Strict); + mockISW360ApicommunicationFacade = new Mock(MockBehavior.Strict); + mockISW360CommonService = new Mock(MockBehavior.Strict); + mockISw360CreatorService = new Mock(MockBehavior.Strict); + mockISW360Service = new Mock(MockBehavior.Strict); } [TestCase] @@ -93,6 +105,53 @@ public void ValidateAppSettings_TestNegative() Assert.ThrowsAsync(() => CreatorValidator.ValidateAppSettings(CommonAppSettings, mockISw360ProjectService.Object, projectReleases)); } + [TestCase] + public async Task TriggerFossologyValidation_TestPositive() + { + // Arrange + var appSettings = new CommonAppSettings() + { + SW360 = new SW360() + { + URL = "https://sw360.example.com" + } + }; + + var responseBody = "{\"_embedded\":{\"sw360:releases\":[{\"_links\":{\"self\":{\"href\":\"https://sw360.example.com/resource/api/releases/123\"}}}]}}"; + var releasesInfo = new ReleasesInfo + { + Name = "TestRelease", + Version = "1.0", + ClearingState = "APPROVED" + }; + var fossTriggerStatus = new FossTriggerStatus + { + Links = new Links + { + Self = new Self + { + Href = "https://fossology.example.com" + } + } + }; + var triggerStatusResponse = JsonConvert.SerializeObject(fossTriggerStatus); + + mockISW360ApicommunicationFacade.Setup(x => x.GetReleases()).ReturnsAsync(responseBody); + mockISW360Service.Setup(x => x.GetReleaseDataOfComponent(It.IsAny())).ReturnsAsync(releasesInfo); + mockISw360CreatorService.Setup(x => x.TriggerFossologyProcessForValidation(It.IsAny(), It.IsAny())).ReturnsAsync(fossTriggerStatus); + mockISW360ApicommunicationFacade.Setup(x => x.GetReleaseById(It.IsAny())).ReturnsAsync(new HttpResponseMessage + { + Content = new StringContent("{\"Name\":\"TestRelease\",\"Version\":\"1.0\",\"ClearingState\":\"APPROVED\"}") + }); + mockISW360ApicommunicationFacade.Setup(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny())).ReturnsAsync(triggerStatusResponse); + + // Act + await CreatorValidator.TriggerFossologyValidation(appSettings, mockISW360ApicommunicationFacade.Object); + + // Assert + mockISW360ApicommunicationFacade.Verify(x => x.GetReleases(), Times.Once); + mockISW360ApicommunicationFacade.Verify(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny()), Times.Once); + } } } diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 5168d967..5ec34e6f 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -11,6 +11,14 @@ using LCT.APICommunications.Model; using log4net; using System.Reflection; +using LCT.APICommunications.Model.Foss; +using LCT.APICommunications; +using LCT.Facade.Interfaces; +using LCT.Services; +using log4net.Core; +using Newtonsoft.Json; +using System; +using LCT.Common.Interface; namespace LCT.SW360PackageCreator @@ -21,6 +29,7 @@ namespace LCT.SW360PackageCreator public static class CreatorValidator { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static IEnvironmentHelper environmentHelper; public static async Task ValidateAppSettings(CommonAppSettings appSettings, ISw360ProjectService sw360ProjectService, ProjectReleases projectReleases) { string sw360ProjectName = await sw360ProjectService.GetProjectNameByProjectIDFromSW360(appSettings.SW360.ProjectID, appSettings.SW360.ProjectName,projectReleases); @@ -41,5 +50,85 @@ public static async Task ValidateAppSettings(CommonAppSettings appSettings, } return 0; } + + public static async Task TriggerFossologyValidation(CommonAppSettings appSettings, ISW360ApicommunicationFacade sW360ApicommunicationFacade) + { + IEnvironmentHelper environmentHelper = new EnvironmentHelper(); + ISW360CommonService sw360CommonService = new SW360CommonService(sW360ApicommunicationFacade); + ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sW360ApicommunicationFacade, sw360CommonService); + ISW360Service sw360Service = new Sw360Service(sW360ApicommunicationFacade, sw360CommonService,environmentHelper); + ReleasesInfo releasesInfo = new ReleasesInfo(); + + try + { + + string responseBody = await sW360ApicommunicationFacade.GetReleases(); + var modelMappedObject = JsonConvert.DeserializeObject(responseBody); + var releaseId = string.Empty; + if (modelMappedObject != null && modelMappedObject.Embedded?.Sw360Releases?.Count > 0) + { + foreach (var ReleaseidList in modelMappedObject.Embedded?.Sw360Releases) + { + var releaseUrl = ReleaseidList.Links?.Self?.Href; + + releasesInfo = await CallApiAsync(releaseUrl, sw360Service); + if (releasesInfo != null) + { + releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); + break; + } + } + + } + else + { + Logger.Debug($"TriggerFossologyValidation():Trigger Fossology Process validation failed"); + Logger.Error($"Trigger Fossology Process validation failed"); + environmentHelper.CallEnvironmentExit(-1); + } + if (releasesInfo != null) + { + string sw360link = $"{releasesInfo.Name}:{releasesInfo.Version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + + $"{releaseId}#/tab-Summary"; + FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); + if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) + { + Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); + } + } + + } + catch (AggregateException ex) + { + Logger.Debug($"\tError in TriggerFossologyProcess--{ex}"); + Logger.Error($"Trigger Fossology Process failed.Please check fossology configuration in sw360"); + environmentHelper.CallEnvironmentExit(-1); + } + } + + private static async Task CallApiAsync(string endpoint, ISW360Service sw360Service) + { + try + { + ReleasesInfo releasesInfo = await sw360Service.GetReleaseDataOfComponent(endpoint); + + + var clearingState = releasesInfo.ClearingState?.ToString(); + + + if (clearingState == "APPROVED") + { + // Return the result if the clearingState is "approved" + return releasesInfo; + } + } + catch (Exception ex) + { + Logger.Debug($"CallApiAsync():{ex}"); + } + + + return null; + } } } diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index 83c977db..cc0db2b5 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -21,6 +21,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; +using System.Net.Http; using System.Reflection; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -87,7 +88,12 @@ static async Task Main(string[] args) if (appSettings.IsTestMode) Logger.Logger.Log(null, Level.Notice, $"\tMode\t\t\t --> {appSettings.Mode}\n", null); - + //Validate Fossology Url + if (appSettings.SW360.Fossology.EnableTrigger) + { + if(await FossologyUrlValidation(appSettings)) + await CreatorValidator.TriggerFossologyValidation(appSettings, sW360ApicommunicationFacade); + } await InitiatePackageCreatorProcess(appSettings, sw360ProjectService, sW360ApicommunicationFacade); Logger.Logger.Log(null, Level.Notice, $"End of Package Creator execution: {DateTime.Now}\n", null); @@ -95,6 +101,72 @@ static async Task Main(string[] args) // publish logs and bom file to pipeline artifact PipelineArtifactUploader.UploadArtifacts(); } + public static async Task FossologyUrlValidation(CommonAppSettings appSettings) + { + + string url = appSettings.SW360.Fossology.URL.ToLower(); + string prodFossUrl = "automation.fossology".ToLower(); + string stageFossUrl = "stage.fossology".ToLower(); + environmentHelper = new EnvironmentHelper(); + + if (string.IsNullOrEmpty(appSettings.SW360.Fossology.URL)) + { + + Logger.Error($"Fossology URL is not provided ,Please make sure to add Fossologyurl in appsettings.."); + Logger.Debug($"Fossologyurlcheck() : Fossology url not provided in appsettings"); + environmentHelper.CallEnvironmentExit(-1); + + } + else if (Uri.IsWellFormedUriString(appSettings.SW360.Fossology.URL, UriKind.Absolute)) + { + if (url.Contains(prodFossUrl) || url.Contains(stageFossUrl)) + { + // Send GET request to validate Fossology URL + using (HttpClient client = new HttpClient()) + { + try + { + HttpResponseMessage response = await client.GetAsync(new Uri(appSettings.SW360.Fossology.URL)); + if (response.IsSuccessStatusCode) + { + // Fossology URL is valid + return true; + } + else + { + // Fossology URL is not valid + Logger.Error($"Fossology URL is not valid ,Please make sure to add valid fossologyurl in appsettings.."); + Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid."); + environmentHelper.CallEnvironmentExit(-1); + } + } + catch (HttpRequestException ex) + { + // Fossology URL is not valid + Logger.Error($"Fossology URL is not working ,Please check once try again...."); + Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid.{ex}"); + environmentHelper.CallEnvironmentExit(-1); + } + + } + } + else + { + Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid"); + Logger.Error($"Fossology URL is not valid ,Please check once try again...."); + environmentHelper.CallEnvironmentExit(-1); + } + } + else + { + Logger.Error($"Fossology URL is not provided ,Please make sure to add fossologyurl in appsettings.."); + Logger.Debug($"Fossologyurlcheck() : Fossology url not provided in appsettings"); + environmentHelper.CallEnvironmentExit(-1); + } + + + return false; + } private static CatoolInfo GetCatoolVersionFromProjectfile() { @@ -173,6 +245,6 @@ private static string InitiateLogger(CommonAppSettings appSettings) } return FolderPath; - } + } } } diff --git a/src/LCT.Services/Interface/ISW360CreatorService.cs b/src/LCT.Services/Interface/ISW360CreatorService.cs index c53c3a32..9b44fec1 100644 --- a/src/LCT.Services/Interface/ISW360CreatorService.cs +++ b/src/LCT.Services/Interface/ISW360CreatorService.cs @@ -29,6 +29,7 @@ Task CreateReleaseForComponent( Task GetReleaseIDofComponent(string componentName, string componentVersion, string componentid); Task TriggerFossologyProcess(string releaseId,string sw360link); + Task TriggerFossologyProcessForValidation(string releaseId, string sw360link); Task CheckFossologyProcessStatus(string link); diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index cc4d2df7..7ee72460 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -9,6 +9,7 @@ using LCT.APICommunications.Model.Foss; using LCT.Common; using LCT.Common.Constants; +using LCT.Common.Interface; using LCT.Common.Model; using LCT.Facade.Interfaces; using LCT.Services.Interface; @@ -38,6 +39,7 @@ public class Sw360CreatorService : ISw360CreatorService static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); readonly ISW360ApicommunicationFacade m_SW360ApiCommunicationFacade; readonly ISW360CommonService m_SW360CommonService; + private static IEnvironmentHelper environmentHelper; public Sw360CreatorService(ISW360ApicommunicationFacade sw360ApiCommunicationFacade) { @@ -143,6 +145,45 @@ public async Task CheckFossologyProcessStatus(string link } return fossTriggerStatus; + } + public async Task TriggerFossologyProcessForValidation(string releaseId, string sw360link) + { + environmentHelper = new EnvironmentHelper(); + FossTriggerStatus fossTriggerStatus = null; + try + { + string triggerStatus = await m_SW360ApiCommunicationFacade.TriggerFossologyProcess(releaseId, sw360link); + fossTriggerStatus = JsonConvert.DeserializeObject(triggerStatus); + } + catch (HttpRequestException ex) + { + Logger.Debug($"TriggerFossologyProcessForValidation():", ex); + Logger.Error($"Fossology Process failed.Please check fossology configuration or Token in sw360"); + environmentHelper.CallEnvironmentExit(-1); + + } + catch (InvalidOperationException ex) + { + Logger.Debug($"TriggerFossologyProcessForValidation():", ex); + Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + environmentHelper.CallEnvironmentExit(-1); + } + catch (UriFormatException ex) + { + Logger.Debug($"TriggerFossologyProcessForValidation():", ex); + Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + environmentHelper.CallEnvironmentExit(-1); + + } + catch (TaskCanceledException ex) + { + Logger.Debug($"TriggerFossologyProcessForValidation():", ex); + Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + environmentHelper.CallEnvironmentExit(-1); + + } + return fossTriggerStatus; + } public async Task CreateReleaseForComponent(ComparisonBomData componentInfo, string componentId, Dictionary attachmentUrlList) diff --git a/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs b/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs index b646ce3e..f07b6676 100644 --- a/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs +++ b/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs @@ -65,6 +65,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"ALPINE", + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run component creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs b/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs index ace5be1e..8ca50c3f 100644 --- a/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs +++ b/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs @@ -55,6 +55,7 @@ public void TestComponentCreatorExe_Conan() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"" }), "Test to run Package Creator EXE execution"); diff --git a/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs b/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs index 435c1707..81264ed5 100644 --- a/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs +++ b/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs @@ -64,6 +64,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"DEBIAN", + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run component creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs b/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs index e8a6d33e..f4907ec4 100644 --- a/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs +++ b/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs @@ -65,6 +65,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs index a2b84a08..4346fa44 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs @@ -65,6 +65,7 @@ public void TestComponentCreatorExe() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.FossologyURL,testParameters.FossUrl }), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs index 8c8cc5e7..f46ec99e 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs @@ -63,6 +63,7 @@ public void TestComponentCreatorExe_TestMode() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"test" }), "Test to run Package Creator EXE execution"); diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs index a0d7f3c0..d62022f4 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs @@ -67,6 +67,7 @@ public void TestComponentCreatorExe() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"" }), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs b/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs index 0f556f27..7cb328ce 100644 --- a/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs +++ b/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs @@ -65,6 +65,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"NUGET", + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs b/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs index 236a8a30..932a6f80 100644 --- a/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs +++ b/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs @@ -67,6 +67,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"NUGET", + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}); Assert.IsTrue(value == 0 || value == 2, diff --git a/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs b/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs index 088ea1e7..32051951 100644 --- a/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs +++ b/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs @@ -63,6 +63,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}); Assert.IsTrue(returnValue == 0 || returnValue == 2, "Test to run Package Creator EXE execution"); diff --git a/src/TestUtilities/TestConstant.cs b/src/TestUtilities/TestConstant.cs index ea1b1d99..f5898d45 100644 --- a/src/TestUtilities/TestConstant.cs +++ b/src/TestUtilities/TestConstant.cs @@ -31,7 +31,8 @@ public static class TestConstant public const string Sw360Token = "--SW360:Token"; public const string BomFilePath = "--Directory:BomFilePath"; public const string SW360URL = "--SW360:URL"; - public const string FossologyURL = "--Fossology:URL"; + public const string FossologyURL = "--SW360:Fossology:URL"; + public const string EnableFossologyTrigger = "--SW360:Fossology:EnableTrigger"; public const string SW360AuthTokenType = "--SW360:AuthTokenType"; public const string SW360ProjectName = "--SW360:ProjectName"; public const string SW360ProjectID = "--SW360:ProjectID"; diff --git a/src/TestUtilities/appSettingsSW360IntegrationTest.json b/src/TestUtilities/appSettingsSW360IntegrationTest.json index 10140cf8..6554f309 100644 --- a/src/TestUtilities/appSettingsSW360IntegrationTest.json +++ b/src/TestUtilities/appSettingsSW360IntegrationTest.json @@ -1,5 +1,6 @@ { "Fossologyurl": "", + "EnableFossologyTrigger": false, "RemoveDevDependency": true, "SW360AuthTokenType": "Token", "SW360ProjectID": "036ec371847b4b199dd21c3494ccb108", From 2b81af85d7698945be3e304e632991bf691f559e Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Mon, 3 Feb 2025 17:18:48 +0530 Subject: [PATCH 02/21] Revert "Fossology url validation" This reverts commit 5b7a52fb62d45962dfadc35ed82be33985399dbc. --- .../CreatorValidatorTest.cs | 63 +------------ .../CreatorValidator.cs | 89 ------------------- src/LCT.SW360PackageCreator/Program.cs | 76 +--------------- .../Interface/ISW360CreatorService.cs | 1 - src/LCT.Services/Sw360CreatorService.cs | 41 --------- .../Alpine/ComponentCreatorInitialAlpine.cs | 1 - .../Conan/ComponentCreatorInitialConan.cs | 1 - .../Debian/ComponentCreatorInitialDebian.cs | 1 - .../Maven/ComponentCreatorInitialMaven.cs | 1 - .../NPM/ComponentCreatorInitial.cs | 1 - .../NPM/ComponentCreatorTestMode.cs | 1 - .../ComponentCreatorWithUpdatedComponents.cs | 1 - .../Nuget/ComponentCreatorInitialNuget.cs | 1 - .../ComponentCreatorNugetTemplate.cs | 1 - .../Python/ComponentCreatorInitialPython.cs | 1 - src/TestUtilities/TestConstant.cs | 3 +- .../appSettingsSW360IntegrationTest.json | 1 - 17 files changed, 5 insertions(+), 279 deletions(-) diff --git a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs index e2dac074..b41b65fa 100644 --- a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs +++ b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs @@ -13,28 +13,16 @@ using LCT.Common; using System.Threading.Tasks; using LCT.APICommunications.Model; -using LCT.APICommunications.Model.Foss; -using Newtonsoft.Json; -using System.Net.Http; -using LCT.Facade.Interfaces; namespace LCT.SW360PackageCreator.UTest { [TestFixture] public class CreatorValidatorTest { - public Mock mockISw360ProjectService; - public Mock mockISW360ApicommunicationFacade; - public Mock mockISW360CommonService; - public Mock mockISw360CreatorService; - public Mock mockISW360Service; + public Mock mockISw360ProjectService; public CreatorValidatorTest() { - mockISw360ProjectService = new Mock(MockBehavior.Strict); - mockISW360ApicommunicationFacade = new Mock(MockBehavior.Strict); - mockISW360CommonService = new Mock(MockBehavior.Strict); - mockISw360CreatorService = new Mock(MockBehavior.Strict); - mockISW360Service = new Mock(MockBehavior.Strict); + mockISw360ProjectService = new Mock(MockBehavior.Strict); } [TestCase] @@ -105,53 +93,6 @@ public void ValidateAppSettings_TestNegative() Assert.ThrowsAsync(() => CreatorValidator.ValidateAppSettings(CommonAppSettings, mockISw360ProjectService.Object, projectReleases)); } - [TestCase] - public async Task TriggerFossologyValidation_TestPositive() - { - // Arrange - var appSettings = new CommonAppSettings() - { - SW360 = new SW360() - { - URL = "https://sw360.example.com" - } - }; - - var responseBody = "{\"_embedded\":{\"sw360:releases\":[{\"_links\":{\"self\":{\"href\":\"https://sw360.example.com/resource/api/releases/123\"}}}]}}"; - var releasesInfo = new ReleasesInfo - { - Name = "TestRelease", - Version = "1.0", - ClearingState = "APPROVED" - }; - var fossTriggerStatus = new FossTriggerStatus - { - Links = new Links - { - Self = new Self - { - Href = "https://fossology.example.com" - } - } - }; - var triggerStatusResponse = JsonConvert.SerializeObject(fossTriggerStatus); - - mockISW360ApicommunicationFacade.Setup(x => x.GetReleases()).ReturnsAsync(responseBody); - mockISW360Service.Setup(x => x.GetReleaseDataOfComponent(It.IsAny())).ReturnsAsync(releasesInfo); - mockISw360CreatorService.Setup(x => x.TriggerFossologyProcessForValidation(It.IsAny(), It.IsAny())).ReturnsAsync(fossTriggerStatus); - mockISW360ApicommunicationFacade.Setup(x => x.GetReleaseById(It.IsAny())).ReturnsAsync(new HttpResponseMessage - { - Content = new StringContent("{\"Name\":\"TestRelease\",\"Version\":\"1.0\",\"ClearingState\":\"APPROVED\"}") - }); - mockISW360ApicommunicationFacade.Setup(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny())).ReturnsAsync(triggerStatusResponse); - - // Act - await CreatorValidator.TriggerFossologyValidation(appSettings, mockISW360ApicommunicationFacade.Object); - - // Assert - mockISW360ApicommunicationFacade.Verify(x => x.GetReleases(), Times.Once); - mockISW360ApicommunicationFacade.Verify(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny()), Times.Once); - } } } diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 5ec34e6f..5168d967 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -11,14 +11,6 @@ using LCT.APICommunications.Model; using log4net; using System.Reflection; -using LCT.APICommunications.Model.Foss; -using LCT.APICommunications; -using LCT.Facade.Interfaces; -using LCT.Services; -using log4net.Core; -using Newtonsoft.Json; -using System; -using LCT.Common.Interface; namespace LCT.SW360PackageCreator @@ -29,7 +21,6 @@ namespace LCT.SW360PackageCreator public static class CreatorValidator { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private static IEnvironmentHelper environmentHelper; public static async Task ValidateAppSettings(CommonAppSettings appSettings, ISw360ProjectService sw360ProjectService, ProjectReleases projectReleases) { string sw360ProjectName = await sw360ProjectService.GetProjectNameByProjectIDFromSW360(appSettings.SW360.ProjectID, appSettings.SW360.ProjectName,projectReleases); @@ -50,85 +41,5 @@ public static async Task ValidateAppSettings(CommonAppSettings appSettings, } return 0; } - - public static async Task TriggerFossologyValidation(CommonAppSettings appSettings, ISW360ApicommunicationFacade sW360ApicommunicationFacade) - { - IEnvironmentHelper environmentHelper = new EnvironmentHelper(); - ISW360CommonService sw360CommonService = new SW360CommonService(sW360ApicommunicationFacade); - ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sW360ApicommunicationFacade, sw360CommonService); - ISW360Service sw360Service = new Sw360Service(sW360ApicommunicationFacade, sw360CommonService,environmentHelper); - ReleasesInfo releasesInfo = new ReleasesInfo(); - - try - { - - string responseBody = await sW360ApicommunicationFacade.GetReleases(); - var modelMappedObject = JsonConvert.DeserializeObject(responseBody); - var releaseId = string.Empty; - if (modelMappedObject != null && modelMappedObject.Embedded?.Sw360Releases?.Count > 0) - { - foreach (var ReleaseidList in modelMappedObject.Embedded?.Sw360Releases) - { - var releaseUrl = ReleaseidList.Links?.Self?.Href; - - releasesInfo = await CallApiAsync(releaseUrl, sw360Service); - if (releasesInfo != null) - { - releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); - break; - } - } - - } - else - { - Logger.Debug($"TriggerFossologyValidation():Trigger Fossology Process validation failed"); - Logger.Error($"Trigger Fossology Process validation failed"); - environmentHelper.CallEnvironmentExit(-1); - } - if (releasesInfo != null) - { - string sw360link = $"{releasesInfo.Name}:{releasesInfo.Version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + - $"{releaseId}#/tab-Summary"; - FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); - if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) - { - Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); - } - } - - } - catch (AggregateException ex) - { - Logger.Debug($"\tError in TriggerFossologyProcess--{ex}"); - Logger.Error($"Trigger Fossology Process failed.Please check fossology configuration in sw360"); - environmentHelper.CallEnvironmentExit(-1); - } - } - - private static async Task CallApiAsync(string endpoint, ISW360Service sw360Service) - { - try - { - ReleasesInfo releasesInfo = await sw360Service.GetReleaseDataOfComponent(endpoint); - - - var clearingState = releasesInfo.ClearingState?.ToString(); - - - if (clearingState == "APPROVED") - { - // Return the result if the clearingState is "approved" - return releasesInfo; - } - } - catch (Exception ex) - { - Logger.Debug($"CallApiAsync():{ex}"); - } - - - return null; - } } } diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index cc0db2b5..83c977db 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -21,7 +21,6 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; -using System.Net.Http; using System.Reflection; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -88,12 +87,7 @@ static async Task Main(string[] args) if (appSettings.IsTestMode) Logger.Logger.Log(null, Level.Notice, $"\tMode\t\t\t --> {appSettings.Mode}\n", null); - //Validate Fossology Url - if (appSettings.SW360.Fossology.EnableTrigger) - { - if(await FossologyUrlValidation(appSettings)) - await CreatorValidator.TriggerFossologyValidation(appSettings, sW360ApicommunicationFacade); - } + await InitiatePackageCreatorProcess(appSettings, sw360ProjectService, sW360ApicommunicationFacade); Logger.Logger.Log(null, Level.Notice, $"End of Package Creator execution: {DateTime.Now}\n", null); @@ -101,72 +95,6 @@ static async Task Main(string[] args) // publish logs and bom file to pipeline artifact PipelineArtifactUploader.UploadArtifacts(); } - public static async Task FossologyUrlValidation(CommonAppSettings appSettings) - { - - string url = appSettings.SW360.Fossology.URL.ToLower(); - string prodFossUrl = "automation.fossology".ToLower(); - string stageFossUrl = "stage.fossology".ToLower(); - environmentHelper = new EnvironmentHelper(); - - if (string.IsNullOrEmpty(appSettings.SW360.Fossology.URL)) - { - - Logger.Error($"Fossology URL is not provided ,Please make sure to add Fossologyurl in appsettings.."); - Logger.Debug($"Fossologyurlcheck() : Fossology url not provided in appsettings"); - environmentHelper.CallEnvironmentExit(-1); - - } - else if (Uri.IsWellFormedUriString(appSettings.SW360.Fossology.URL, UriKind.Absolute)) - { - if (url.Contains(prodFossUrl) || url.Contains(stageFossUrl)) - { - // Send GET request to validate Fossology URL - using (HttpClient client = new HttpClient()) - { - try - { - HttpResponseMessage response = await client.GetAsync(new Uri(appSettings.SW360.Fossology.URL)); - if (response.IsSuccessStatusCode) - { - // Fossology URL is valid - return true; - } - else - { - // Fossology URL is not valid - Logger.Error($"Fossology URL is not valid ,Please make sure to add valid fossologyurl in appsettings.."); - Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid."); - environmentHelper.CallEnvironmentExit(-1); - } - } - catch (HttpRequestException ex) - { - // Fossology URL is not valid - Logger.Error($"Fossology URL is not working ,Please check once try again...."); - Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid.{ex}"); - environmentHelper.CallEnvironmentExit(-1); - } - - } - } - else - { - Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid"); - Logger.Error($"Fossology URL is not valid ,Please check once try again...."); - environmentHelper.CallEnvironmentExit(-1); - } - } - else - { - Logger.Error($"Fossology URL is not provided ,Please make sure to add fossologyurl in appsettings.."); - Logger.Debug($"Fossologyurlcheck() : Fossology url not provided in appsettings"); - environmentHelper.CallEnvironmentExit(-1); - } - - - return false; - } private static CatoolInfo GetCatoolVersionFromProjectfile() { @@ -245,6 +173,6 @@ private static string InitiateLogger(CommonAppSettings appSettings) } return FolderPath; - } + } } } diff --git a/src/LCT.Services/Interface/ISW360CreatorService.cs b/src/LCT.Services/Interface/ISW360CreatorService.cs index 9b44fec1..c53c3a32 100644 --- a/src/LCT.Services/Interface/ISW360CreatorService.cs +++ b/src/LCT.Services/Interface/ISW360CreatorService.cs @@ -29,7 +29,6 @@ Task CreateReleaseForComponent( Task GetReleaseIDofComponent(string componentName, string componentVersion, string componentid); Task TriggerFossologyProcess(string releaseId,string sw360link); - Task TriggerFossologyProcessForValidation(string releaseId, string sw360link); Task CheckFossologyProcessStatus(string link); diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index 7ee72460..cc4d2df7 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -9,7 +9,6 @@ using LCT.APICommunications.Model.Foss; using LCT.Common; using LCT.Common.Constants; -using LCT.Common.Interface; using LCT.Common.Model; using LCT.Facade.Interfaces; using LCT.Services.Interface; @@ -39,7 +38,6 @@ public class Sw360CreatorService : ISw360CreatorService static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); readonly ISW360ApicommunicationFacade m_SW360ApiCommunicationFacade; readonly ISW360CommonService m_SW360CommonService; - private static IEnvironmentHelper environmentHelper; public Sw360CreatorService(ISW360ApicommunicationFacade sw360ApiCommunicationFacade) { @@ -145,45 +143,6 @@ public async Task CheckFossologyProcessStatus(string link } return fossTriggerStatus; - } - public async Task TriggerFossologyProcessForValidation(string releaseId, string sw360link) - { - environmentHelper = new EnvironmentHelper(); - FossTriggerStatus fossTriggerStatus = null; - try - { - string triggerStatus = await m_SW360ApiCommunicationFacade.TriggerFossologyProcess(releaseId, sw360link); - fossTriggerStatus = JsonConvert.DeserializeObject(triggerStatus); - } - catch (HttpRequestException ex) - { - Logger.Debug($"TriggerFossologyProcessForValidation():", ex); - Logger.Error($"Fossology Process failed.Please check fossology configuration or Token in sw360"); - environmentHelper.CallEnvironmentExit(-1); - - } - catch (InvalidOperationException ex) - { - Logger.Debug($"TriggerFossologyProcessForValidation():", ex); - Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); - environmentHelper.CallEnvironmentExit(-1); - } - catch (UriFormatException ex) - { - Logger.Debug($"TriggerFossologyProcessForValidation():", ex); - Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); - environmentHelper.CallEnvironmentExit(-1); - - } - catch (TaskCanceledException ex) - { - Logger.Debug($"TriggerFossologyProcessForValidation():", ex); - Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); - environmentHelper.CallEnvironmentExit(-1); - - } - return fossTriggerStatus; - } public async Task CreateReleaseForComponent(ComparisonBomData componentInfo, string componentId, Dictionary attachmentUrlList) diff --git a/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs b/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs index f07b6676..b646ce3e 100644 --- a/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs +++ b/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs @@ -65,7 +65,6 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"ALPINE", - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run component creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs b/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs index 8ca50c3f..ace5be1e 100644 --- a/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs +++ b/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs @@ -55,7 +55,6 @@ public void TestComponentCreatorExe_Conan() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"" }), "Test to run Package Creator EXE execution"); diff --git a/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs b/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs index 81264ed5..435c1707 100644 --- a/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs +++ b/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs @@ -64,7 +64,6 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"DEBIAN", - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run component creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs b/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs index f4907ec4..e8a6d33e 100644 --- a/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs +++ b/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs @@ -65,7 +65,6 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs index 4346fa44..a2b84a08 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs @@ -65,7 +65,6 @@ public void TestComponentCreatorExe() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.FossologyURL,testParameters.FossUrl }), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs index f46ec99e..8c8cc5e7 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs @@ -63,7 +63,6 @@ public void TestComponentCreatorExe_TestMode() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"test" }), "Test to run Package Creator EXE execution"); diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs index d62022f4..a0d7f3c0 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs @@ -67,7 +67,6 @@ public void TestComponentCreatorExe() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"" }), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs b/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs index 7cb328ce..0f556f27 100644 --- a/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs +++ b/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs @@ -65,7 +65,6 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"NUGET", - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs b/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs index 932a6f80..236a8a30 100644 --- a/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs +++ b/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs @@ -67,7 +67,6 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"NUGET", - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}); Assert.IsTrue(value == 0 || value == 2, diff --git a/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs b/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs index 32051951..088ea1e7 100644 --- a/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs +++ b/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs @@ -63,7 +63,6 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, - TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}); Assert.IsTrue(returnValue == 0 || returnValue == 2, "Test to run Package Creator EXE execution"); diff --git a/src/TestUtilities/TestConstant.cs b/src/TestUtilities/TestConstant.cs index f5898d45..ea1b1d99 100644 --- a/src/TestUtilities/TestConstant.cs +++ b/src/TestUtilities/TestConstant.cs @@ -31,8 +31,7 @@ public static class TestConstant public const string Sw360Token = "--SW360:Token"; public const string BomFilePath = "--Directory:BomFilePath"; public const string SW360URL = "--SW360:URL"; - public const string FossologyURL = "--SW360:Fossology:URL"; - public const string EnableFossologyTrigger = "--SW360:Fossology:EnableTrigger"; + public const string FossologyURL = "--Fossology:URL"; public const string SW360AuthTokenType = "--SW360:AuthTokenType"; public const string SW360ProjectName = "--SW360:ProjectName"; public const string SW360ProjectID = "--SW360:ProjectID"; diff --git a/src/TestUtilities/appSettingsSW360IntegrationTest.json b/src/TestUtilities/appSettingsSW360IntegrationTest.json index 6554f309..10140cf8 100644 --- a/src/TestUtilities/appSettingsSW360IntegrationTest.json +++ b/src/TestUtilities/appSettingsSW360IntegrationTest.json @@ -1,6 +1,5 @@ { "Fossologyurl": "", - "EnableFossologyTrigger": false, "RemoveDevDependency": true, "SW360AuthTokenType": "Token", "SW360ProjectID": "036ec371847b4b199dd21c3494ccb108", From 6a4f9213287ccedece3b6185959ac6c478191520 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 4 Feb 2025 08:03:21 +0530 Subject: [PATCH 03/21] Fossology validation --- .../CreatorValidatorTest.cs | 55 +++++++++++++ .../CreatorValidator.cs | 78 +++++++++++++++++++ src/LCT.SW360PackageCreator/Program.cs | 67 ++++++++++++++++ .../Interface/ISW360CreatorService.cs | 1 + src/LCT.Services/Sw360CreatorService.cs | 37 +++++++++ .../Alpine/ComponentCreatorInitialAlpine.cs | 1 + .../Conan/ComponentCreatorInitialConan.cs | 1 + .../Debian/ComponentCreatorInitialDebian.cs | 1 + .../Maven/ComponentCreatorInitialMaven.cs | 1 + .../NPM/ComponentCreatorTestMode.cs | 1 + .../ComponentCreatorWithUpdatedComponents.cs | 1 + .../Nuget/ComponentCreatorInitialNuget.cs | 1 + .../ComponentCreatorNugetTemplate.cs | 1 + .../Python/ComponentCreatorInitialPython.cs | 1 + src/TestUtilities/TestConstant.cs | 3 +- .../appSettingsSW360IntegrationTest.json | 1 + 16 files changed, 250 insertions(+), 1 deletion(-) diff --git a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs index b41b65fa..edc1cec8 100644 --- a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs +++ b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs @@ -13,6 +13,10 @@ using LCT.Common; using System.Threading.Tasks; using LCT.APICommunications.Model; +using LCT.Facade.Interfaces; +using LCT.APICommunications.Model.Foss; +using Newtonsoft.Json; +using System.Net.Http; namespace LCT.SW360PackageCreator.UTest { @@ -20,9 +24,17 @@ namespace LCT.SW360PackageCreator.UTest public class CreatorValidatorTest { public Mock mockISw360ProjectService; + public Mock mockISW360ApicommunicationFacade; + public Mock mockISW360CommonService; + public Mock mockISw360CreatorService; + public Mock mockISW360Service; public CreatorValidatorTest() { mockISw360ProjectService = new Mock(MockBehavior.Strict); + mockISW360ApicommunicationFacade = new Mock(MockBehavior.Strict); + mockISW360CommonService = new Mock(MockBehavior.Strict); + mockISw360CreatorService = new Mock(MockBehavior.Strict); + mockISW360Service = new Mock(MockBehavior.Strict); } [TestCase] @@ -93,6 +105,49 @@ public void ValidateAppSettings_TestNegative() Assert.ThrowsAsync(() => CreatorValidator.ValidateAppSettings(CommonAppSettings, mockISw360ProjectService.Object, projectReleases)); } + [TestCase] + public async Task TriggerFossologyValidation_TestPositive() + { + // Arrange + var appSettings = new CommonAppSettings() + { + SW360 = new SW360() + { + URL = "https://sw360.example.com" + } + }; + var responseBody = "{\"_embedded\":{\"sw360:releases\":[{\"_links\":{\"self\":{\"href\":\"https://sw360.example.com/resource/api/releases/123\"}}}]}}"; + var releasesInfo = new ReleasesInfo + { + Name = "TestRelease", + Version = "1.0", + ClearingState = "APPROVED" + }; + var fossTriggerStatus = new FossTriggerStatus + { + Links = new Links + { + Self = new Self + { + Href = "https://fossology.example.com" + } + } + }; + var triggerStatusResponse = JsonConvert.SerializeObject(fossTriggerStatus); + mockISW360ApicommunicationFacade.Setup(x => x.GetReleases()).ReturnsAsync(responseBody); + mockISW360Service.Setup(x => x.GetReleaseDataOfComponent(It.IsAny())).ReturnsAsync(releasesInfo); + mockISw360CreatorService.Setup(x => x.TriggerFossologyProcessForValidation(It.IsAny(), It.IsAny())).ReturnsAsync(fossTriggerStatus); + mockISW360ApicommunicationFacade.Setup(x => x.GetReleaseById(It.IsAny())).ReturnsAsync(new HttpResponseMessage + { + Content = new StringContent("{\"Name\":\"TestRelease\",\"Version\":\"1.0\",\"ClearingState\":\"APPROVED\"}") + }); + mockISW360ApicommunicationFacade.Setup(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny())).ReturnsAsync(triggerStatusResponse); + // Act + await CreatorValidator.TriggerFossologyValidation(appSettings, mockISW360ApicommunicationFacade.Object); + // Assert + mockISW360ApicommunicationFacade.Verify(x => x.GetReleases(), Times.Once); + mockISW360ApicommunicationFacade.Verify(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny()), Times.Once); + } } } diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 5168d967..4dad2d97 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -11,6 +11,14 @@ using LCT.APICommunications.Model; using log4net; using System.Reflection; +using LCT.Common.Interface; +using LCT.APICommunications.Model.Foss; +using LCT.APICommunications; +using LCT.Facade.Interfaces; +using LCT.Services; +using log4net.Core; +using Newtonsoft.Json; +using System; namespace LCT.SW360PackageCreator @@ -21,6 +29,7 @@ namespace LCT.SW360PackageCreator public static class CreatorValidator { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static IEnvironmentHelper environmentHelper; public static async Task ValidateAppSettings(CommonAppSettings appSettings, ISw360ProjectService sw360ProjectService, ProjectReleases projectReleases) { string sw360ProjectName = await sw360ProjectService.GetProjectNameByProjectIDFromSW360(appSettings.SW360.ProjectID, appSettings.SW360.ProjectName,projectReleases); @@ -41,5 +50,74 @@ public static async Task ValidateAppSettings(CommonAppSettings appSettings, } return 0; } + public static async Task TriggerFossologyValidation(CommonAppSettings appSettings, ISW360ApicommunicationFacade sW360ApicommunicationFacade) + { + IEnvironmentHelper environmentHelper = new EnvironmentHelper(); + ISW360CommonService sw360CommonService = new SW360CommonService(sW360ApicommunicationFacade); + ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sW360ApicommunicationFacade, sw360CommonService); + ISW360Service sw360Service = new Sw360Service(sW360ApicommunicationFacade, sw360CommonService, environmentHelper); + ReleasesInfo releasesInfo = new ReleasesInfo(); + + try + { + string responseBody = await sW360ApicommunicationFacade.GetReleases(); + var modelMappedObject = JsonConvert.DeserializeObject(responseBody); + var releaseId = string.Empty; + if (modelMappedObject != null && modelMappedObject.Embedded?.Sw360Releases?.Count > 0) + { + foreach (var ReleaseidList in modelMappedObject.Embedded?.Sw360Releases) + { + var releaseUrl = ReleaseidList.Links?.Self?.Href; + releasesInfo = await CallApiAsync(releaseUrl, sw360Service); + if (releasesInfo != null) + { + releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); + break; + } + } + } + else + { + Logger.Debug($"TriggerFossologyValidation():Trigger Fossology Process validation failed"); + Logger.Error($"Trigger Fossology Process validation failed"); + environmentHelper.CallEnvironmentExit(-1); + } + if (releasesInfo != null) + { + string sw360link = $"{releasesInfo.Name}:{releasesInfo.Version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + + $"{releaseId}#/tab-Summary"; + FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); + if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) + { + Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); + } + } + } + catch (AggregateException ex) + { + Logger.Debug($"\tError in TriggerFossologyProcess--{ex}"); + Logger.Error($"Trigger Fossology Process failed.Please check fossology configuration in sw360"); + environmentHelper.CallEnvironmentExit(-1); + } + } + private static async Task CallApiAsync(string endpoint, ISW360Service sw360Service) + { + try + { + ReleasesInfo releasesInfo = await sw360Service.GetReleaseDataOfComponent(endpoint); + var clearingState = releasesInfo.ClearingState?.ToString(); + if (clearingState == "APPROVED") + { + // Return the result if the clearingState is "approved" + return releasesInfo; + } + } + catch (Exception ex) + { + Logger.Debug($"CallApiAsync():{ex}"); + } + + return null; + } } } diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index 83c977db..ad44903e 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -21,6 +21,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; +using System.Net.Http; using System.Reflection; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -88,6 +89,12 @@ static async Task Main(string[] args) if (appSettings.IsTestMode) Logger.Logger.Log(null, Level.Notice, $"\tMode\t\t\t --> {appSettings.Mode}\n", null); + //Validate Fossology Url + if (appSettings.SW360.Fossology.EnableTrigger) + { + if (await FossologyUrlValidation(appSettings)) + await CreatorValidator.TriggerFossologyValidation(appSettings, sW360ApicommunicationFacade); + } await InitiatePackageCreatorProcess(appSettings, sw360ProjectService, sW360ApicommunicationFacade); Logger.Logger.Log(null, Level.Notice, $"End of Package Creator execution: {DateTime.Now}\n", null); @@ -96,6 +103,66 @@ static async Task Main(string[] args) PipelineArtifactUploader.UploadArtifacts(); } + public static async Task FossologyUrlValidation(CommonAppSettings appSettings) + { + string url = appSettings.SW360.Fossology.URL.ToLower(); + string prodFossUrl = "automation.fossology".ToLower(); + string stageFossUrl = "stage.fossology".ToLower(); + environmentHelper = new EnvironmentHelper(); + + if (string.IsNullOrEmpty(appSettings.SW360.Fossology.URL)) + { + Logger.Error($"Fossology URL is not provided ,Please make sure to add Fossologyurl in appsettings.."); + Logger.Debug($"Fossologyurlcheck() : Fossology url not provided in appsettings"); + environmentHelper.CallEnvironmentExit(-1); + } + else if (Uri.IsWellFormedUriString(appSettings.SW360.Fossology.URL, UriKind.Absolute)) + { + if (url.Contains(prodFossUrl) || url.Contains(stageFossUrl)) + { + // Send GET request to validate Fossology URL + using (HttpClient client = new HttpClient()) + { + try + { + HttpResponseMessage response = await client.GetAsync(new Uri(appSettings.SW360.Fossology.URL)); + if (response.IsSuccessStatusCode) + { + // Fossology URL is valid + return true; + } + else + { + // Fossology URL is not valid + Logger.Error($"Fossology URL is not valid ,Please make sure to add valid fossologyurl in appsettings.."); + Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid."); + environmentHelper.CallEnvironmentExit(-1); + } + } + catch (HttpRequestException ex) + { + // Fossology URL is not valid + Logger.Error($"Fossology URL is not working ,Please check once try again...."); + Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid.{ex}"); + environmentHelper.CallEnvironmentExit(-1); + } + } + } + else + { + Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid"); + Logger.Error($"Fossology URL is not valid ,Please check once try again...."); + environmentHelper.CallEnvironmentExit(-1); + } + } + else + { + Logger.Error($"Fossology URL is not provided ,Please make sure to add fossologyurl in appsettings.."); + Logger.Debug($"Fossologyurlcheck() : Fossology url not provided in appsettings"); + environmentHelper.CallEnvironmentExit(-1); + } + return false; + } private static CatoolInfo GetCatoolVersionFromProjectfile() { CatoolInfo catoolInfo = new CatoolInfo(); diff --git a/src/LCT.Services/Interface/ISW360CreatorService.cs b/src/LCT.Services/Interface/ISW360CreatorService.cs index c53c3a32..0fdedede 100644 --- a/src/LCT.Services/Interface/ISW360CreatorService.cs +++ b/src/LCT.Services/Interface/ISW360CreatorService.cs @@ -44,5 +44,6 @@ Task CreateReleaseForComponent( Task UpdatePurlIdForExistingRelease(ComparisonBomData cbomData, string releaseId, ReleasesInfo releasesInfo = null); Task UdpateSW360ReleaseContent(Components component, string fossUrl); + Task TriggerFossologyProcessForValidation(string releaseId, string sw360link); } } diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index cc4d2df7..1b50bbb2 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -9,6 +9,7 @@ using LCT.APICommunications.Model.Foss; using LCT.Common; using LCT.Common.Constants; +using LCT.Common.Interface; using LCT.Common.Model; using LCT.Facade.Interfaces; using LCT.Services.Interface; @@ -38,6 +39,7 @@ public class Sw360CreatorService : ISw360CreatorService static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); readonly ISW360ApicommunicationFacade m_SW360ApiCommunicationFacade; readonly ISW360CommonService m_SW360CommonService; + private static IEnvironmentHelper environmentHelper; public Sw360CreatorService(ISW360ApicommunicationFacade sw360ApiCommunicationFacade) { @@ -779,5 +781,40 @@ private async Task GetUpdateReleaseContent(string r return updateRelease; } + public async Task TriggerFossologyProcessForValidation(string releaseId, string sw360link) + { + environmentHelper = new EnvironmentHelper(); + FossTriggerStatus fossTriggerStatus = null; + try + { + string triggerStatus = await m_SW360ApiCommunicationFacade.TriggerFossologyProcess(releaseId, sw360link); + fossTriggerStatus = JsonConvert.DeserializeObject(triggerStatus); + } + catch (HttpRequestException ex) + { + Logger.Debug($"TriggerFossologyProcessForValidation():", ex); + Logger.Error($"Fossology Process failed.Please check fossology configuration or Token in sw360"); + environmentHelper.CallEnvironmentExit(-1); + } + catch (InvalidOperationException ex) + { + Logger.Debug($"TriggerFossologyProcessForValidation():", ex); + Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + environmentHelper.CallEnvironmentExit(-1); + } + catch (UriFormatException ex) + { + Logger.Debug($"TriggerFossologyProcessForValidation():", ex); + Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + environmentHelper.CallEnvironmentExit(-1); + } + catch (TaskCanceledException ex) + { + Logger.Debug($"TriggerFossologyProcessForValidation():", ex); + Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + environmentHelper.CallEnvironmentExit(-1); + } + return fossTriggerStatus; + } } } diff --git a/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs b/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs index b646ce3e..f07b6676 100644 --- a/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs +++ b/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs @@ -65,6 +65,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"ALPINE", + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run component creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs b/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs index ace5be1e..8ca50c3f 100644 --- a/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs +++ b/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs @@ -55,6 +55,7 @@ public void TestComponentCreatorExe_Conan() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"" }), "Test to run Package Creator EXE execution"); diff --git a/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs b/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs index 435c1707..81264ed5 100644 --- a/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs +++ b/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs @@ -64,6 +64,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"DEBIAN", + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run component creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs b/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs index e8a6d33e..f4907ec4 100644 --- a/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs +++ b/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs @@ -65,6 +65,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs index 8c8cc5e7..f46ec99e 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs @@ -63,6 +63,7 @@ public void TestComponentCreatorExe_TestMode() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"test" }), "Test to run Package Creator EXE execution"); diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs index a0d7f3c0..d62022f4 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs @@ -67,6 +67,7 @@ public void TestComponentCreatorExe() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,"" }), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs b/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs index 0f556f27..7cb328ce 100644 --- a/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs +++ b/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs @@ -65,6 +65,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"NUGET", + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs b/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs index 236a8a30..932a6f80 100644 --- a/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs +++ b/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs @@ -67,6 +67,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"NUGET", + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}); Assert.IsTrue(value == 0 || value == 2, diff --git a/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs b/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs index 088ea1e7..32051951 100644 --- a/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs +++ b/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs @@ -63,6 +63,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}); Assert.IsTrue(returnValue == 0 || returnValue == 2, "Test to run Package Creator EXE execution"); diff --git a/src/TestUtilities/TestConstant.cs b/src/TestUtilities/TestConstant.cs index ea1b1d99..f5898d45 100644 --- a/src/TestUtilities/TestConstant.cs +++ b/src/TestUtilities/TestConstant.cs @@ -31,7 +31,8 @@ public static class TestConstant public const string Sw360Token = "--SW360:Token"; public const string BomFilePath = "--Directory:BomFilePath"; public const string SW360URL = "--SW360:URL"; - public const string FossologyURL = "--Fossology:URL"; + public const string FossologyURL = "--SW360:Fossology:URL"; + public const string EnableFossologyTrigger = "--SW360:Fossology:EnableTrigger"; public const string SW360AuthTokenType = "--SW360:AuthTokenType"; public const string SW360ProjectName = "--SW360:ProjectName"; public const string SW360ProjectID = "--SW360:ProjectID"; diff --git a/src/TestUtilities/appSettingsSW360IntegrationTest.json b/src/TestUtilities/appSettingsSW360IntegrationTest.json index 10140cf8..56483e8c 100644 --- a/src/TestUtilities/appSettingsSW360IntegrationTest.json +++ b/src/TestUtilities/appSettingsSW360IntegrationTest.json @@ -1,6 +1,7 @@ { "Fossologyurl": "", "RemoveDevDependency": true, + "EnableFossologyTrigger": false, "SW360AuthTokenType": "Token", "SW360ProjectID": "036ec371847b4b199dd21c3494ccb108", "SW360ProjectName": "Test", From 91d229e28f9a5b8ac13774a766984aac69a38e69 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 4 Feb 2025 09:02:05 +0530 Subject: [PATCH 04/21] updated --- src/LCT.SW360PackageCreator/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index ad44903e..f434b983 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -103,7 +103,7 @@ static async Task Main(string[] args) PipelineArtifactUploader.UploadArtifacts(); } - public static async Task FossologyUrlValidation(CommonAppSettings appSettings) + private static async Task FossologyUrlValidation(CommonAppSettings appSettings) { string url = appSettings.SW360.Fossology.URL.ToLower(); string prodFossUrl = "automation.fossology".ToLower(); From 368971556d799dc929ff84b3635ededd05232cce Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 4 Feb 2025 09:06:00 +0530 Subject: [PATCH 05/21] updated --- src/LCT.SW360PackageCreator/Program.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index f434b983..91fc93cf 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -113,7 +113,7 @@ private static async Task FossologyUrlValidation(CommonAppSettings appSett if (string.IsNullOrEmpty(appSettings.SW360.Fossology.URL)) { Logger.Error($"Fossology URL is not provided ,Please make sure to add Fossologyurl in appsettings.."); - Logger.Debug($"Fossologyurlcheck() : Fossology url not provided in appsettings"); + Logger.Debug($"FossologyUrlValidation() : Fossology url not provided in appsettings"); environmentHelper.CallEnvironmentExit(-1); } else if (Uri.IsWellFormedUriString(appSettings.SW360.Fossology.URL, UriKind.Absolute)) @@ -135,7 +135,7 @@ private static async Task FossologyUrlValidation(CommonAppSettings appSett { // Fossology URL is not valid Logger.Error($"Fossology URL is not valid ,Please make sure to add valid fossologyurl in appsettings.."); - Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid."); + Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid."); environmentHelper.CallEnvironmentExit(-1); } } @@ -143,14 +143,14 @@ private static async Task FossologyUrlValidation(CommonAppSettings appSett { // Fossology URL is not valid Logger.Error($"Fossology URL is not working ,Please check once try again...."); - Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid.{ex}"); + Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid.{ex}"); environmentHelper.CallEnvironmentExit(-1); } } } else { - Logger.Debug($"Fossologyurlcheck() : Fossology URL is not valid"); + Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid"); Logger.Error($"Fossology URL is not valid ,Please check once try again...."); environmentHelper.CallEnvironmentExit(-1); } @@ -158,7 +158,7 @@ private static async Task FossologyUrlValidation(CommonAppSettings appSett else { Logger.Error($"Fossology URL is not provided ,Please make sure to add fossologyurl in appsettings.."); - Logger.Debug($"Fossologyurlcheck() : Fossology url not provided in appsettings"); + Logger.Debug($"FossologyUrlValidation() : Fossology url not provided in appsettings"); environmentHelper.CallEnvironmentExit(-1); } return false; From de55636ff129f8680c440fe2bd6a420e095102c5 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Wed, 5 Feb 2025 17:33:24 +0530 Subject: [PATCH 06/21] updated code changes --- .../Interfaces/ISW360APICommunication.cs | 1 + .../SW360Apicommunication.cs | 7 + src/LCT.Common/CommonAppSettings.cs | 3 +- src/LCT.Common/Constants/Dataconstant.cs | 2 + .../ISW360ApicommunicationFacade.cs | 1 + src/LCT.Facade/SW360ApicommunicationFacade.cs | 4 + .../CreatorValidatorTest.cs | 169 ++++++++++++++++-- .../CreatorValidator.cs | 131 ++++++++++---- .../Model/ReleasesAllDetails.cs | 82 +++++++++ src/LCT.SW360PackageCreator/Program.cs | 72 +------- .../Alpine/ComponentCreatorInitialAlpine.cs | 1 + .../Conan/ComponentCreatorInitialConan.cs | 1 + .../Debian/ComponentCreatorInitialDebian.cs | 1 + .../Maven/ComponentCreatorInitialMaven.cs | 1 + .../NPM/ComponentCreatorInitial.cs | 1 + .../NPM/ComponentCreatorTestMode.cs | 1 + .../ComponentCreatorWithUpdatedComponents.cs | 1 + .../Nuget/ComponentCreatorInitialNuget.cs | 1 + .../ComponentCreatorNugetTemplate.cs | 1 + .../Python/ComponentCreatorInitialPython.cs | 1 + src/TestUtilities/TestParam.cs | 3 +- src/TestUtilities/TestParamAlpine.cs | 2 + src/TestUtilities/TestParamConan.cs | 3 +- src/TestUtilities/TestParamDebian.cs | 2 + src/TestUtilities/TestParamMaven.cs | 2 + src/TestUtilities/TestParamNuget.cs | 2 + 26 files changed, 375 insertions(+), 121 deletions(-) create mode 100644 src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs diff --git a/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs b/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs index 12cd45b6..28f3ef69 100644 --- a/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs +++ b/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs @@ -40,5 +40,6 @@ public interface ISw360ApiCommunication string AttachComponentSourceToSW360(AttachReport attachReport); void DownloadAttachmentUsingWebClient(string attachmentDownloadLink, string fileName); Task GetComponentDetailsByUrl(string componentLink); + Task GetAllReleasesWithAllData(string page, string pageEntries); } } diff --git a/src/LCT.APICommunications/SW360Apicommunication.cs b/src/LCT.APICommunications/SW360Apicommunication.cs index b6a631c4..1673b3a7 100644 --- a/src/LCT.APICommunications/SW360Apicommunication.cs +++ b/src/LCT.APICommunications/SW360Apicommunication.cs @@ -313,6 +313,13 @@ public async Task GetComponentUsingName(string componentNam string url = $"{sw360ComponentApi}{ApiConstant.ComponentNameUrl}{componentName}"; return await httpClient.GetAsync(url); } + public async Task GetAllReleasesWithAllData(string page, string pageEntries) + { + HttpClient httpClient = GetHttpClient(); + HttpResponseMessage httpResponseMessage=new HttpResponseMessage(); + string url = $"{sw360ReleaseApi}?page={page}&allDetails=true&page_entries={pageEntries}"; + return await httpClient.GetAsync(url); + } #endregion #region PRIVATE METHODS diff --git a/src/LCT.Common/CommonAppSettings.cs b/src/LCT.Common/CommonAppSettings.cs index d4d5eb05..e7db107e 100644 --- a/src/LCT.Common/CommonAppSettings.cs +++ b/src/LCT.Common/CommonAppSettings.cs @@ -172,7 +172,8 @@ public string URL } set { - if (AppDomain.CurrentDomain.FriendlyName.Contains("SW360PackageCreator")) + if (!AppDomain.CurrentDomain.FriendlyName.Contains("PackageIdentifier") && + !AppDomain.CurrentDomain.FriendlyName.Contains("ArtifactoryUploader")) { if (string.IsNullOrEmpty(value)) { diff --git a/src/LCT.Common/Constants/Dataconstant.cs b/src/LCT.Common/Constants/Dataconstant.cs index da50c646..946f2006 100644 --- a/src/LCT.Common/Constants/Dataconstant.cs +++ b/src/LCT.Common/Constants/Dataconstant.cs @@ -68,6 +68,8 @@ public static class Dataconstant public const string Cdx_Siemensfilename = "internal:siemens:clearing:siemens:filename"; public const string Cdx_SiemensDirect = "internal:siemens:clearing:siemens:direct"; public const string Cdx_ExcludeComponent = "internal:siemens:clearing:sw360:exclude"; + public const string Production_FossologyURL = "automation.fossology"; + public const string Stage_FossologyURL = "stage.fossology"; public static Dictionary PurlCheck() { diff --git a/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs b/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs index 9b96fd75..c4db7b9e 100644 --- a/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs +++ b/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs @@ -43,5 +43,6 @@ public interface ISW360ApicommunicationFacade Task UpdateLinkedRelease(string projectId, string releaseId, UpdateLinkedRelease updateLinkedRelease); Task GetReleaseByExternalId(string purlId,string externalIdKey = ""); Task GetComponentByExternalId(string purlId, string externalIdKey = ""); + Task GetAllReleasesWithAllData(string page, string pageEntries); } } diff --git a/src/LCT.Facade/SW360ApicommunicationFacade.cs b/src/LCT.Facade/SW360ApicommunicationFacade.cs index fdf51bf3..f1908221 100644 --- a/src/LCT.Facade/SW360ApicommunicationFacade.cs +++ b/src/LCT.Facade/SW360ApicommunicationFacade.cs @@ -195,5 +195,9 @@ public Task GetComponentByExternalId(string purlId, string { return m_sw360ApiCommunication.GetComponentByExternalId(purlId, externalIdKey); } + public Task GetAllReleasesWithAllData(string page,string pageEntries) + { + return m_sw360ApiCommunication.GetAllReleasesWithAllData(page, pageEntries); + } } } diff --git a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs index edc1cec8..00775dc3 100644 --- a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs +++ b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs @@ -17,6 +17,12 @@ using LCT.APICommunications.Model.Foss; using Newtonsoft.Json; using System.Net.Http; +using LCT.Common.Interface; +using System.Net; +using System.Threading; +using Moq.Protected; +using System.Security.Policy; +using System.Reflection; namespace LCT.SW360PackageCreator.UTest { @@ -24,17 +30,21 @@ namespace LCT.SW360PackageCreator.UTest public class CreatorValidatorTest { public Mock mockISw360ProjectService; - public Mock mockISW360ApicommunicationFacade; - public Mock mockISW360CommonService; - public Mock mockISw360CreatorService; - public Mock mockISW360Service; + private Mock mockISW360ApicommunicationFacade; + private Mock mockISW360Service; + private Mock mockISw360CreatorService; + private Mock mockEnvironmentHelper; + private Mock mockHttpMessageHandler; + private HttpClient httpClient; public CreatorValidatorTest() { mockISw360ProjectService = new Mock(MockBehavior.Strict); - mockISW360ApicommunicationFacade = new Mock(MockBehavior.Strict); - mockISW360CommonService = new Mock(MockBehavior.Strict); - mockISw360CreatorService = new Mock(MockBehavior.Strict); - mockISW360Service = new Mock(MockBehavior.Strict); + mockISW360ApicommunicationFacade = new Mock(); + mockISW360Service = new Mock(); + mockISw360CreatorService = new Mock(); + mockEnvironmentHelper = new Mock(); + mockHttpMessageHandler = new Mock(); + httpClient = new HttpClient(mockHttpMessageHandler.Object); } [TestCase] @@ -105,7 +115,7 @@ public void ValidateAppSettings_TestNegative() Assert.ThrowsAsync(() => CreatorValidator.ValidateAppSettings(CommonAppSettings, mockISw360ProjectService.Object, projectReleases)); } - [TestCase] + [Test] public async Task TriggerFossologyValidation_TestPositive() { // Arrange @@ -116,7 +126,8 @@ public async Task TriggerFossologyValidation_TestPositive() URL = "https://sw360.example.com" } }; - var responseBody = "{\"_embedded\":{\"sw360:releases\":[{\"_links\":{\"self\":{\"href\":\"https://sw360.example.com/resource/api/releases/123\"}}}]}}"; + + var responseBody = "{\"_embedded\":{\"sw360:releases\":[{\"id\":\"a3c5c9d1dd469d668433fb147c01bad2\",\"name\":\"HC-Test Pugixml\",\"version\":\"V1.2\",\"clearingState\":\"APPROVED\",\"_embedded\":{\"sw360:attachments\":[[{\"filename\":\"Protocol_Pugixml - 1.2.doc\"}]]},\"_links\":{\"self\":{\"href\":\"https://sw360.siemens.com/resource/api/releases/a3c5c9d1dd469d668433fb147c01bad2\"}}}]},\"page\":{\"totalPages\":1}}"; var releasesInfo = new ReleasesInfo { Name = "TestRelease", @@ -133,21 +144,145 @@ public async Task TriggerFossologyValidation_TestPositive() } } }; + var triggerStatusResponse = JsonConvert.SerializeObject(fossTriggerStatus); - mockISW360ApicommunicationFacade.Setup(x => x.GetReleases()).ReturnsAsync(responseBody); - mockISW360Service.Setup(x => x.GetReleaseDataOfComponent(It.IsAny())).ReturnsAsync(releasesInfo); - mockISw360CreatorService.Setup(x => x.TriggerFossologyProcessForValidation(It.IsAny(), It.IsAny())).ReturnsAsync(fossTriggerStatus); - mockISW360ApicommunicationFacade.Setup(x => x.GetReleaseById(It.IsAny())).ReturnsAsync(new HttpResponseMessage + + mockISW360ApicommunicationFacade.Setup(x => x.GetAllReleasesWithAllData(It.IsAny(), It.IsAny())).ReturnsAsync(new HttpResponseMessage { - Content = new StringContent("{\"Name\":\"TestRelease\",\"Version\":\"1.0\",\"ClearingState\":\"APPROVED\"}") + Content = new StringContent(responseBody) }); + mockISW360ApicommunicationFacade.Setup(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny())).ReturnsAsync(triggerStatusResponse); + + mockISw360CreatorService.Setup(x => x.TriggerFossologyProcessForValidation(It.IsAny(), It.IsAny())).ReturnsAsync(fossTriggerStatus); + // Act await CreatorValidator.TriggerFossologyValidation(appSettings, mockISW360ApicommunicationFacade.Object); + // Assert - mockISW360ApicommunicationFacade.Verify(x => x.GetReleases(), Times.Once); - mockISW360ApicommunicationFacade.Verify(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny()), Times.Once); + mockISW360ApicommunicationFacade.Verify(x => x.GetAllReleasesWithAllData(It.IsAny(), It.IsAny()), Times.Once); + mockISW360ApicommunicationFacade.Verify(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny()), Times.Once); } + [Test] + public async Task FossologyUrlValidation_ValidUrl_ReturnsTrue() + { + // Arrange + + + var appSettings = new CommonAppSettings() + { + SW360 = new SW360() + { + Fossology = new Fossology() + { + URL = "https://stage.fossology.url" + } + } + }; + + var responseMessage = new HttpResponseMessage(HttpStatusCode.OK); + mockHttpMessageHandler + .Protected() + .Setup>( + "SendAsync", + ItExpr.IsAny(), + ItExpr.IsAny() + ) + .ReturnsAsync(responseMessage); + + // Act + var result = await CreatorValidator.FossologyUrlValidation(appSettings, httpClient, mockEnvironmentHelper.Object); + + // Assert + Assert.IsTrue(result); + } + + [Test] + public async Task FossologyUrlValidation_InvalidUrl_ReturnsFalse() + { + // Arrange + var appSettings = new CommonAppSettings() + { + SW360 = new SW360() + { + Fossology = new Fossology() + { + URL = "https://invalid.fossology.url" + } + } + }; + + var responseMessage = new HttpResponseMessage(HttpStatusCode.NotFound); + mockHttpMessageHandler + .Protected() + .Setup>( + "SendAsync", + ItExpr.IsAny(), + ItExpr.IsAny() + ) + .ReturnsAsync(responseMessage); + + // Act + var result = await CreatorValidator.FossologyUrlValidation(appSettings, httpClient, mockEnvironmentHelper.Object); + + // Assert + Assert.IsFalse(result); + } + + + [Test] + public async Task FossologyUrlValidation_InvalidUri_ThrowsException() + { + // Arrange + var appSettings = new CommonAppSettings() + { + SW360 = new SW360() + { + Fossology = new Fossology() + { + URL = "invalid_uri" + } + } + }; + + var result = await CreatorValidator.FossologyUrlValidation(appSettings, httpClient, mockEnvironmentHelper.Object); + + // Assert + Assert.IsFalse(result); + } + + [Test] + public async Task FossologyUrlValidation_HttpRequestException_ReturnsFalse() + { + // Arrange + var appSettings = new CommonAppSettings() + { + SW360 = new SW360() + { + Fossology = new Fossology() + { + URL = "https://valid.fossology.url" + } + } + }; + + mockHttpMessageHandler + .Protected() + .Setup>( + "SendAsync", + ItExpr.IsAny(), + ItExpr.IsAny() + ) + .ThrowsAsync(new HttpRequestException()); + + // Act + var result = await CreatorValidator.FossologyUrlValidation(appSettings, httpClient, mockEnvironmentHelper.Object); + + // Assert + Assert.IsFalse(result); + } + + } } diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 4dad2d97..e37b4156 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -19,6 +19,10 @@ using log4net.Core; using Newtonsoft.Json; using System; +using System.Net.Http; +using LCT.SW360PackageCreator.Model; +using System.Linq; +using LCT.Common.Constants; namespace LCT.SW360PackageCreator @@ -56,42 +60,59 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting ISW360CommonService sw360CommonService = new SW360CommonService(sW360ApicommunicationFacade); ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sW360ApicommunicationFacade, sw360CommonService); ISW360Service sw360Service = new Sw360Service(sW360ApicommunicationFacade, sw360CommonService, environmentHelper); - ReleasesInfo releasesInfo = new ReleasesInfo(); - + try { - string responseBody = await sW360ApicommunicationFacade.GetReleases(); - var modelMappedObject = JsonConvert.DeserializeObject(responseBody); - var releaseId = string.Empty; - if (modelMappedObject != null && modelMappedObject.Embedded?.Sw360Releases?.Count > 0) + string page = "0"; + string pageEntries = "20"; + bool validReleaseFound = false; + ReleasesAllDetails.Sw360Release validRelease = null; + int pageCount = 0; + while (!validReleaseFound && pageCount < 10) { - foreach (var ReleaseidList in modelMappedObject.Embedded?.Sw360Releases) + HttpResponseMessage responseData = await sW360ApicommunicationFacade.GetAllReleasesWithAllData(page, pageEntries); + string response = responseData?.Content?.ReadAsStringAsync()?.Result ?? string.Empty; + ReleasesAllDetails releaseResponse = JsonConvert.DeserializeObject(response); + + validRelease = releaseResponse._embedded.sw360releases + .FirstOrDefault(release => release.clearingState == "APPROVED" && + release._embedded?.sw360attachments != null && + release._embedded.sw360attachments.Any(attachments => attachments.Count != 0)); + + if (validRelease != null) + { + validReleaseFound = true; + } + else { - var releaseUrl = ReleaseidList.Links?.Self?.Href; - releasesInfo = await CallApiAsync(releaseUrl, sw360Service); - if (releasesInfo != null) + // Check if there are more pages + int currentPage = int.Parse(page); + int totalPages = releaseResponse.page.totalPages; + if (currentPage < totalPages - 1) { - releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); - break; + page = (currentPage + 1).ToString(); + pageCount++; + } + else + { + break; // No more pages to check } } } - else - { - Logger.Debug($"TriggerFossologyValidation():Trigger Fossology Process validation failed"); - Logger.Error($"Trigger Fossology Process validation failed"); - environmentHelper.CallEnvironmentExit(-1); - } - if (releasesInfo != null) + + if (validReleaseFound) { - string sw360link = $"{releasesInfo.Name}:{releasesInfo.Version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + - $"{releaseId}#/tab-Summary"; - FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); + var releaseUrl = validRelease._links.self.href; + var releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); + string sw360link = $"{validRelease.name}:{validRelease.version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + + $"{releaseId}#/tab-Summary"; + FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) - { - Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); - } + { + Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); + } } + } catch (AggregateException ex) { @@ -100,24 +121,62 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting environmentHelper.CallEnvironmentExit(-1); } } - private static async Task CallApiAsync(string endpoint, ISW360Service sw360Service) + public static async Task FossologyUrlValidation(CommonAppSettings appSettings, HttpClient client, IEnvironmentHelper environmentHelper) { - try + string url = appSettings.SW360.Fossology.URL.ToLower(); + string prodFossUrl = Dataconstant.Production_FossologyURL.ToLower(); + string stageFossUrl = Dataconstant.Stage_FossologyURL.ToLower(); + + if (string.IsNullOrEmpty(appSettings.SW360.Fossology.URL)) { - ReleasesInfo releasesInfo = await sw360Service.GetReleaseDataOfComponent(endpoint); - var clearingState = releasesInfo.ClearingState?.ToString(); - if (clearingState == "APPROVED") + Logger.Error($"Fossology URL is not provided ,Please make sure to add Fossologyurl in appsettings.."); + Logger.Debug($"FossologyUrlValidation() : Fossology url not provided in appsettings"); + environmentHelper.CallEnvironmentExit(-1); + } + else if (Uri.IsWellFormedUriString(appSettings.SW360.Fossology.URL, UriKind.Absolute)) + { + if (url.Contains(prodFossUrl) || url.Contains(stageFossUrl)) + { + // Send GET request to validate Fossology URL + try + { + HttpResponseMessage response = await client.GetAsync(new Uri(appSettings.SW360.Fossology.URL)); + if (response.IsSuccessStatusCode) + { + // Fossology URL is valid + return true; + } + else + { + // Fossology URL is not valid + Logger.Error($"Fossology URL is not valid ,please make sure to add valid fossologyurl in appsettings.."); + Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid."); + environmentHelper.CallEnvironmentExit(-1); + } + } + catch (HttpRequestException ex) + { + // Fossology URL is not valid + Logger.Error($"Fossology URL is not working ,please check once try again...."); + Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid.{ex}"); + environmentHelper.CallEnvironmentExit(-1); + } + } + else { - // Return the result if the clearingState is "approved" - return releasesInfo; + Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid"); + Logger.Error($"Fossology URL is not valid ,please check once try again...."); + environmentHelper.CallEnvironmentExit(-1); } } - catch (Exception ex) + else { - Logger.Debug($"CallApiAsync():{ex}"); + Logger.Error($"Fossology URL is not provided ,Please make sure to add fossologyurl in appsettings.."); + Logger.Debug($"FossologyUrlValidation() : Fossologyurl not provided in appsettings"); + environmentHelper.CallEnvironmentExit(-1); } - - return null; + return false; } + } } diff --git a/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs b/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs new file mode 100644 index 00000000..ab0b2fc0 --- /dev/null +++ b/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs @@ -0,0 +1,82 @@ +// -------------------------------------------------------------------------------------------------------------------- +// SPDX-FileCopyrightText: 2025 Siemens AG +// +// SPDX-License-Identifier: MIT +// -------------------------------------------------------------------------------------------------------------------- + +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LCT.SW360PackageCreator.Model +{ + public class ReleasesAllDetails + { + [ExcludeFromCodeCoverage] + + public class Embedded + { + [JsonProperty("sw360:releases")] + public List sw360releases { get; set; } + + [JsonProperty("sw360:attachments")] + public List> sw360attachments { get; set; } + + } + public class Attachment + { + public string filename { get; set; } + + } + + + + + public class Links + { + + public Self self { get; set; } + + + } + + + public Embedded _embedded { get; set; } + + public Page page { get; set; } + + public class Self + { + public string href { get; set; } + } + + public class Sw360Component + { + public string href { get; set; } + } + + public class Sw360Release + { + public string name { get; set; } + public string version { get; set; } + + public string clearingState { get; set; } + + public Links _links { get; set; } + public Embedded _embedded { get; set; } + + + } + + public class Page + { + + public int totalPages { get; set; } + + } + } +} diff --git a/src/LCT.SW360PackageCreator/Program.cs b/src/LCT.SW360PackageCreator/Program.cs index 91fc93cf..80638f93 100644 --- a/src/LCT.SW360PackageCreator/Program.cs +++ b/src/LCT.SW360PackageCreator/Program.cs @@ -37,8 +37,7 @@ public class Program { public static Stopwatch CreatorStopWatch { get; set; } private static bool m_Verbose = false; - private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private static IEnvironmentHelper environmentHelper; + private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected Program() { } static async Task Main(string[] args) @@ -50,6 +49,7 @@ static async Task Main(string[] args) m_Verbose = true; ISettingsManager settingsManager = new SettingsManager(); + EnvironmentHelper environmentHelper = new EnvironmentHelper(); CommonAppSettings appSettings = settingsManager.ReadConfiguration(args, FileConstant.appSettingFileName); ISW360ApicommunicationFacade sW360ApicommunicationFacade; ISw360ProjectService sw360ProjectService= Getsw360ProjectServiceObject(appSettings, out sW360ApicommunicationFacade); @@ -57,13 +57,13 @@ static async Task Main(string[] args) // do not change the order of getting ca tool information CatoolInfo caToolInformation = GetCatoolVersionFromProjectfile(); Log4Net.CatoolCurrentDirectory = Directory.GetParent(caToolInformation.CatoolRunningLocation).FullName; - + string FolderPath = InitiateLogger(appSettings); settingsManager.CheckRequiredArgsToRun(appSettings, "Creator"); int isValid = await CreatorValidator.ValidateAppSettings(appSettings, sw360ProjectService, projectReleases); + if (isValid == -1) { - environmentHelper = new EnvironmentHelper(); environmentHelper.CallEnvironmentExit(-1); } @@ -92,7 +92,8 @@ static async Task Main(string[] args) //Validate Fossology Url if (appSettings.SW360.Fossology.EnableTrigger) { - if (await FossologyUrlValidation(appSettings)) + HttpClient client = new HttpClient(); + if (await CreatorValidator.FossologyUrlValidation(appSettings,client, environmentHelper)) await CreatorValidator.TriggerFossologyValidation(appSettings, sW360ApicommunicationFacade); } await InitiatePackageCreatorProcess(appSettings, sw360ProjectService, sW360ApicommunicationFacade); @@ -103,66 +104,7 @@ static async Task Main(string[] args) PipelineArtifactUploader.UploadArtifacts(); } - private static async Task FossologyUrlValidation(CommonAppSettings appSettings) - { - string url = appSettings.SW360.Fossology.URL.ToLower(); - string prodFossUrl = "automation.fossology".ToLower(); - string stageFossUrl = "stage.fossology".ToLower(); - environmentHelper = new EnvironmentHelper(); - - if (string.IsNullOrEmpty(appSettings.SW360.Fossology.URL)) - { - Logger.Error($"Fossology URL is not provided ,Please make sure to add Fossologyurl in appsettings.."); - Logger.Debug($"FossologyUrlValidation() : Fossology url not provided in appsettings"); - environmentHelper.CallEnvironmentExit(-1); - } - else if (Uri.IsWellFormedUriString(appSettings.SW360.Fossology.URL, UriKind.Absolute)) - { - if (url.Contains(prodFossUrl) || url.Contains(stageFossUrl)) - { - // Send GET request to validate Fossology URL - using (HttpClient client = new HttpClient()) - { - try - { - HttpResponseMessage response = await client.GetAsync(new Uri(appSettings.SW360.Fossology.URL)); - if (response.IsSuccessStatusCode) - { - // Fossology URL is valid - return true; - } - else - { - // Fossology URL is not valid - Logger.Error($"Fossology URL is not valid ,Please make sure to add valid fossologyurl in appsettings.."); - Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid."); - environmentHelper.CallEnvironmentExit(-1); - } - } - catch (HttpRequestException ex) - { - // Fossology URL is not valid - Logger.Error($"Fossology URL is not working ,Please check once try again...."); - Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid.{ex}"); - environmentHelper.CallEnvironmentExit(-1); - } - } - } - else - { - Logger.Debug($"FossologyUrlValidation() : Fossology URL is not valid"); - Logger.Error($"Fossology URL is not valid ,Please check once try again...."); - environmentHelper.CallEnvironmentExit(-1); - } - } - else - { - Logger.Error($"Fossology URL is not provided ,Please make sure to add fossologyurl in appsettings.."); - Logger.Debug($"FossologyUrlValidation() : Fossology url not provided in appsettings"); - environmentHelper.CallEnvironmentExit(-1); - } - return false; - } + private static CatoolInfo GetCatoolVersionFromProjectfile() { CatoolInfo catoolInfo = new CatoolInfo(); diff --git a/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs b/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs index f07b6676..5a56f977 100644 --- a/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs +++ b/src/SW360IntegrationTest/Alpine/ComponentCreatorInitialAlpine.cs @@ -65,6 +65,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"ALPINE", + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.FossologyURL, testParameters.FossUrl, TestConstant.Mode,""}), "Test to run component creator EXE execution"); diff --git a/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs b/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs index 8ca50c3f..bb77ff20 100644 --- a/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs +++ b/src/SW360IntegrationTest/Conan/ComponentCreatorInitialConan.cs @@ -56,6 +56,7 @@ public void TestComponentCreatorExe_Conan() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.FossologyURL, testParameters.FossUrl, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.Mode,"" }), "Test to run Package Creator EXE execution"); diff --git a/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs b/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs index 81264ed5..2e01672a 100644 --- a/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs +++ b/src/SW360IntegrationTest/Debian/ComponentCreatorInitialDebian.cs @@ -65,6 +65,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"DEBIAN", TestConstant.FossologyURL, testParameters.FossUrl, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.Mode,""}), "Test to run component creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs b/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs index f4907ec4..0a588dd5 100644 --- a/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs +++ b/src/SW360IntegrationTest/Maven/ComponentCreatorInitialMaven.cs @@ -66,6 +66,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.FossologyURL, testParameters.FossUrl, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.Mode,""}), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs index a2b84a08..aabba534 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorInitial.cs @@ -65,6 +65,7 @@ public void TestComponentCreatorExe() TestConstant.SW360AuthTokenType, testParameters.SW360AuthTokenType, TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.FossologyURL,testParameters.FossUrl }), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs index f46ec99e..a564363e 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorTestMode.cs @@ -64,6 +64,7 @@ public void TestComponentCreatorExe_TestMode() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.FossologyURL, testParameters.FossUrl, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.Mode,"test" }), "Test to run Package Creator EXE execution"); diff --git a/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs b/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs index d62022f4..c0dcdfe7 100644 --- a/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs +++ b/src/SW360IntegrationTest/NPM/ComponentCreatorWithUpdatedComponents.cs @@ -68,6 +68,7 @@ public void TestComponentCreatorExe() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.FossologyURL, testParameters.FossUrl, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.Mode,"" }), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs b/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs index 7cb328ce..e84eadad 100644 --- a/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs +++ b/src/SW360IntegrationTest/Nuget/ComponentCreatorInitialNuget.cs @@ -66,6 +66,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"NUGET", TestConstant.FossologyURL, testParameters.FossUrl, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.Mode,""}), "Test to run Package Creator EXE execution"); } diff --git a/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs b/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs index 932a6f80..6c706b68 100644 --- a/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs +++ b/src/SW360IntegrationTest/Nuget/NugetTemplate/ComponentCreatorNugetTemplate.cs @@ -68,6 +68,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.ProjectType,"NUGET", TestConstant.FossologyURL, testParameters.FossUrl, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.Mode,""}); Assert.IsTrue(value == 0 || value == 2, diff --git a/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs b/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs index 32051951..020661c8 100644 --- a/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs +++ b/src/SW360IntegrationTest/Python/ComponentCreatorInitialPython.cs @@ -64,6 +64,7 @@ public void ComponentCreatorExe_ProvidedBOMFilePath_ReturnsSuccess() TestConstant.SW360ProjectID, testParameters.SW360ProjectID, TestConstant.SW360ProjectName, testParameters.SW360ProjectName, TestConstant.FossologyURL, testParameters.FossUrl, + TestConstant.EnableFossologyTrigger,testParameters.FossologyTrigger, TestConstant.Mode,""}); Assert.IsTrue(returnValue == 0 || returnValue == 2, "Test to run Package Creator EXE execution"); diff --git a/src/TestUtilities/TestParam.cs b/src/TestUtilities/TestParam.cs index 05648096..b114a405 100644 --- a/src/TestUtilities/TestParam.cs +++ b/src/TestUtilities/TestParam.cs @@ -29,7 +29,7 @@ public class TestParam public string ThirdPartyDestinationRepoName { get; set; } public string InternalDestinationRepoName { get; set; } public string DevDestinationRepoName { get; set; } - + public string FossologyTrigger { get; set; } public TestParam() { SW360AuthTokenType = s_Config["SW360AuthTokenType"]; @@ -46,6 +46,7 @@ public TestParam() ThirdPartyDestinationRepoName = "npm-test"; InternalDestinationRepoName = "npm-test"; DevDestinationRepoName = "npm-test"; + FossologyTrigger = s_Config["EnableFossologyTrigger"]; } } } diff --git a/src/TestUtilities/TestParamAlpine.cs b/src/TestUtilities/TestParamAlpine.cs index c76a7a48..8ee53308 100644 --- a/src/TestUtilities/TestParamAlpine.cs +++ b/src/TestUtilities/TestParamAlpine.cs @@ -23,6 +23,7 @@ public class TestParamAlpine public string ArtifactoryUploadUser { get; set; } public string ArtifactoryUploadApiKey { get; set; } public string JfrogApi { get; set; } + public string FossologyTrigger { get; set; } public TestParamAlpine() { @@ -37,6 +38,7 @@ public TestParamAlpine() ArtifactoryUploadApiKey = s_Config["ArtifactoryUploadApiKey"]; JfrogApi = s_Config["JfrogApi"]; RemoveDevDependency = s_Config["RemoveDevDependency"]; + FossologyTrigger = s_Config["EnableFossologyTrigger"]; } } } diff --git a/src/TestUtilities/TestParamConan.cs b/src/TestUtilities/TestParamConan.cs index 7bd4ed14..9b15c95a 100644 --- a/src/TestUtilities/TestParamConan.cs +++ b/src/TestUtilities/TestParamConan.cs @@ -28,7 +28,7 @@ public class TestParamConan public string ThirdPartyDestinationRepoName { get; set; } public string InternalDestinationRepoName { get; set; } public string DevDestinationRepoName { get; set; } - + public string FossologyTrigger { get; set; } public TestParamConan() { SW360AuthTokenType = s_Config["SW360AuthTokenType"]; @@ -45,6 +45,7 @@ public TestParamConan() ThirdPartyDestinationRepoName = "conan-test"; InternalDestinationRepoName = "conan-test"; DevDestinationRepoName = "conan-test"; + FossologyTrigger = s_Config["EnableFossologyTrigger"]; } } } diff --git a/src/TestUtilities/TestParamDebian.cs b/src/TestUtilities/TestParamDebian.cs index 1f0d170b..e4aef5cb 100644 --- a/src/TestUtilities/TestParamDebian.cs +++ b/src/TestUtilities/TestParamDebian.cs @@ -23,6 +23,7 @@ public class TestParamDebian public string ArtifactoryUploadUser { get; set; } public string ArtifactoryUploadApiKey { get; set; } public string JfrogApi { get; set; } + public string FossologyTrigger { get; set; } public TestParamDebian() { @@ -37,6 +38,7 @@ public TestParamDebian() ArtifactoryUploadApiKey = s_Config["ArtifactoryUploadApiKey"]; JfrogApi = s_Config["JfrogApi"]; RemoveDevDependency = s_Config["RemoveDevDependency"]; + FossologyTrigger = s_Config["EnableFossologyTrigger"]; } } } diff --git a/src/TestUtilities/TestParamMaven.cs b/src/TestUtilities/TestParamMaven.cs index b268c3b3..6d72dc36 100644 --- a/src/TestUtilities/TestParamMaven.cs +++ b/src/TestUtilities/TestParamMaven.cs @@ -28,6 +28,7 @@ public class TestParamMaven public string ThirdPartyDestinationRepoName { get; set; } public string InternalDestinationRepoName { get; set; } public string DevDestinationRepoName { get; set; } + public string FossologyTrigger { get; set; } public TestParamMaven() { @@ -45,6 +46,7 @@ public TestParamMaven() ThirdPartyDestinationRepoName = "maven-test"; InternalDestinationRepoName = "maven-test"; DevDestinationRepoName = "maven-test"; + FossologyTrigger = s_Config["EnableFossologyTrigger"]; } } } diff --git a/src/TestUtilities/TestParamNuget.cs b/src/TestUtilities/TestParamNuget.cs index b8e9f958..ea3df7e7 100644 --- a/src/TestUtilities/TestParamNuget.cs +++ b/src/TestUtilities/TestParamNuget.cs @@ -32,6 +32,7 @@ public class TestParamNuget public string ThirdPartyDestinationRepoName { get; set; } public string InternalDestinationRepoName { get; set; } public string DevDestinationRepoName { get; set; } + public string FossologyTrigger { get; set; } public TestParamNuget() { @@ -49,6 +50,7 @@ public TestParamNuget() ThirdPartyDestinationRepoName = "nuget-test"; InternalDestinationRepoName = "nuget-test"; DevDestinationRepoName = "nuget-test"; + FossologyTrigger = s_Config["EnableFossologyTrigger"]; } } } From e8be609c32eab93494f6449efd722a63f77e81f3 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Wed, 5 Feb 2025 21:18:49 +0530 Subject: [PATCH 07/21] Updated requested changes --- src/LCT.Common/Constants/Dataconstant.cs | 4 +- .../CreatorValidator.cs | 4 +- .../Model/ReleasesAllDetails.cs | 48 +++++-------------- 3 files changed, 15 insertions(+), 41 deletions(-) diff --git a/src/LCT.Common/Constants/Dataconstant.cs b/src/LCT.Common/Constants/Dataconstant.cs index 946f2006..7955137e 100644 --- a/src/LCT.Common/Constants/Dataconstant.cs +++ b/src/LCT.Common/Constants/Dataconstant.cs @@ -68,8 +68,8 @@ public static class Dataconstant public const string Cdx_Siemensfilename = "internal:siemens:clearing:siemens:filename"; public const string Cdx_SiemensDirect = "internal:siemens:clearing:siemens:direct"; public const string Cdx_ExcludeComponent = "internal:siemens:clearing:sw360:exclude"; - public const string Production_FossologyURL = "automation.fossology"; - public const string Stage_FossologyURL = "stage.fossology"; + public const string Cdx_ProductionFossologyURL = "automation.fossology"; + public const string Cdx_StageFossologyURL = "stage.fossology"; public static Dictionary PurlCheck() { diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index e37b4156..12b4a20f 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -124,8 +124,8 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting public static async Task FossologyUrlValidation(CommonAppSettings appSettings, HttpClient client, IEnvironmentHelper environmentHelper) { string url = appSettings.SW360.Fossology.URL.ToLower(); - string prodFossUrl = Dataconstant.Production_FossologyURL.ToLower(); - string stageFossUrl = Dataconstant.Stage_FossologyURL.ToLower(); + string prodFossUrl = Dataconstant.Cdx_ProductionFossologyURL.ToLower(); + string stageFossUrl = Dataconstant.Cdx_StageFossologyURL.ToLower(); if (string.IsNullOrEmpty(appSettings.SW360.Fossology.URL)) { diff --git a/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs b/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs index ab0b2fc0..724d4cf7 100644 --- a/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs +++ b/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs @@ -5,19 +5,16 @@ // -------------------------------------------------------------------------------------------------------------------- using Newtonsoft.Json; -using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace LCT.SW360PackageCreator.Model { public class ReleasesAllDetails { [ExcludeFromCodeCoverage] - + public Embedded _embedded { get; set; } + public Page page { get; set; } public class Embedded { [JsonProperty("sw360:releases")] @@ -25,58 +22,35 @@ public class Embedded [JsonProperty("sw360:attachments")] public List> sw360attachments { get; set; } - + } public class Attachment { - public string filename { get; set; } - - } - - - + public string filename { get; set; } + } public class Links { - public Self self { get; set; } - - - } - - - public Embedded _embedded { get; set; } - - public Page page { get; set; } + } public class Self { public string href { get; set; } - } - - public class Sw360Component - { - public string href { get; set; } - } - + } public class Sw360Release { public string name { get; set; } - public string version { get; set; } - - public string clearingState { get; set; } - + public string version { get; set; } + public string clearingState { get; set; } public Links _links { get; set; } public Embedded _embedded { get; set; } - - - } + } public class Page { - public int totalPages { get; set; } - + } } } From 8d9f7b7ee7cf75062ebf74fbbc2986c66cc9b375 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 08:25:49 +0530 Subject: [PATCH 08/21] updated changes --- .../CreatorValidator.cs | 14 +++---- .../Model/ReleasesAllDetails.cs | 42 ++++++++++++------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 12b4a20f..250f8942 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -74,10 +74,10 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting string response = responseData?.Content?.ReadAsStringAsync()?.Result ?? string.Empty; ReleasesAllDetails releaseResponse = JsonConvert.DeserializeObject(response); - validRelease = releaseResponse._embedded.sw360releases - .FirstOrDefault(release => release.clearingState == "APPROVED" && - release._embedded?.sw360attachments != null && - release._embedded.sw360attachments.Any(attachments => attachments.Count != 0)); + validRelease = releaseResponse.Embedded.Sw360releases + .FirstOrDefault(release => release.ClearingState == "APPROVED" && + release.AllReleasesEmbedded?.Sw360attachments != null && + release.AllReleasesEmbedded.Sw360attachments.Any(attachments => attachments.Count != 0)); if (validRelease != null) { @@ -87,7 +87,7 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting { // Check if there are more pages int currentPage = int.Parse(page); - int totalPages = releaseResponse.page.totalPages; + int totalPages = releaseResponse.Page.TotalPages; if (currentPage < totalPages - 1) { page = (currentPage + 1).ToString(); @@ -102,9 +102,9 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting if (validReleaseFound) { - var releaseUrl = validRelease._links.self.href; + var releaseUrl = validRelease.Links.Self.Href; var releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); - string sw360link = $"{validRelease.name}:{validRelease.version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + + string sw360link = $"{validRelease.Name}:{validRelease.Version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + $"{releaseId}#/tab-Summary"; FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) diff --git a/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs b/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs index 724d4cf7..7b222dc2 100644 --- a/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs +++ b/src/LCT.SW360PackageCreator/Model/ReleasesAllDetails.cs @@ -7,49 +7,61 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using static LCT.SW360PackageCreator.Model.ReleasesAllDetails; namespace LCT.SW360PackageCreator.Model { public class ReleasesAllDetails { [ExcludeFromCodeCoverage] - public Embedded _embedded { get; set; } - public Page page { get; set; } - public class Embedded + [JsonProperty("_embedded")] + public AllReleasesEmbedded Embedded { get; set; } + [JsonProperty("page")] + public Pagination Page { get; set; } + public class AllReleasesEmbedded { [JsonProperty("sw360:releases")] - public List sw360releases { get; set; } + public List Sw360releases { get; set; } [JsonProperty("sw360:attachments")] - public List> sw360attachments { get; set; } + public List> Sw360attachments { get; set; } } public class Attachment { - public string filename { get; set; } + [JsonProperty("filename")] + public string Filename { get; set; } } public class Links { - public Self self { get; set; } + [JsonProperty("self")] + public Self Self { get; set; } } public class Self { - public string href { get; set; } + [JsonProperty("href")] + public string Href { get; set; } } public class Sw360Release { - public string name { get; set; } - public string version { get; set; } - public string clearingState { get; set; } - public Links _links { get; set; } - public Embedded _embedded { get; set; } + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("version")] + public string Version { get; set; } + [JsonProperty("clearingState")] + public string ClearingState { get; set; } + [JsonProperty("_links")] + public Links Links { get; set; } + [JsonProperty("_embedded")] + public AllReleasesEmbedded AllReleasesEmbedded { get; set; } } - public class Page + public class Pagination { - public int totalPages { get; set; } + [JsonProperty("totalPages")] + public int TotalPages { get; set; } } } From ec61d5f1da7f7deca2a4b6d89c511f27cc86dc91 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 09:06:31 +0530 Subject: [PATCH 09/21] Fixed test case issue --- src/LCT.Common/PipelineArtifactUploader.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/LCT.Common/PipelineArtifactUploader.cs b/src/LCT.Common/PipelineArtifactUploader.cs index 64c5320f..e3594100 100644 --- a/src/LCT.Common/PipelineArtifactUploader.cs +++ b/src/LCT.Common/PipelineArtifactUploader.cs @@ -45,6 +45,7 @@ public static void UploadLogs() public static void UploadBom() { EnvironmentType envType = RuntimeEnvironment.GetEnvironment(); + LogManager.Shutdown(); if (envType == EnvironmentType.AzurePipeline && !string.IsNullOrEmpty(FileOperations.CatoolBomFilePath) && File.Exists(FileOperations.CatoolBomFilePath)) { Console.WriteLine($"##vso[artifact.upload containerfolder={BomContainerFolderName};artifactname={BomArtifactFolderName}]{FileOperations.CatoolBomFilePath}"); From 7638944f12296912ce8017d1f42f0359c6d29fff Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 09:18:09 +0530 Subject: [PATCH 10/21] updated requested changes --- src/LCT.Common/Constants/Dataconstant.cs | 4 ++-- .../CreatorValidator.cs | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/LCT.Common/Constants/Dataconstant.cs b/src/LCT.Common/Constants/Dataconstant.cs index 7955137e..c39b680d 100644 --- a/src/LCT.Common/Constants/Dataconstant.cs +++ b/src/LCT.Common/Constants/Dataconstant.cs @@ -68,8 +68,8 @@ public static class Dataconstant public const string Cdx_Siemensfilename = "internal:siemens:clearing:siemens:filename"; public const string Cdx_SiemensDirect = "internal:siemens:clearing:siemens:direct"; public const string Cdx_ExcludeComponent = "internal:siemens:clearing:sw360:exclude"; - public const string Cdx_ProductionFossologyURL = "automation.fossology"; - public const string Cdx_StageFossologyURL = "stage.fossology"; + public const string ProductionFossologyURL = "automation.fossology"; + public const string StageFossologyURL = "stage.fossology"; public static Dictionary PurlCheck() { diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 250f8942..899b8aa4 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -36,7 +36,7 @@ public static class CreatorValidator private static IEnvironmentHelper environmentHelper; public static async Task ValidateAppSettings(CommonAppSettings appSettings, ISw360ProjectService sw360ProjectService, ProjectReleases projectReleases) { - string sw360ProjectName = await sw360ProjectService.GetProjectNameByProjectIDFromSW360(appSettings.SW360.ProjectID, appSettings.SW360.ProjectName,projectReleases); + string sw360ProjectName = await sw360ProjectService.GetProjectNameByProjectIDFromSW360(appSettings.SW360.ProjectID, appSettings.SW360.ProjectName, projectReleases); if (string.IsNullOrEmpty(sw360ProjectName)) { @@ -60,7 +60,7 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting ISW360CommonService sw360CommonService = new SW360CommonService(sW360ApicommunicationFacade); ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sW360ApicommunicationFacade, sw360CommonService); ISW360Service sw360Service = new Sw360Service(sW360ApicommunicationFacade, sw360CommonService, environmentHelper); - + try { string page = "0"; @@ -106,13 +106,13 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting var releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); string sw360link = $"{validRelease.Name}:{validRelease.Version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + $"{releaseId}#/tab-Summary"; - FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); + FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) - { - Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); - } + { + Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); + } } - + } catch (AggregateException ex) { @@ -124,8 +124,8 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting public static async Task FossologyUrlValidation(CommonAppSettings appSettings, HttpClient client, IEnvironmentHelper environmentHelper) { string url = appSettings.SW360.Fossology.URL.ToLower(); - string prodFossUrl = Dataconstant.Cdx_ProductionFossologyURL.ToLower(); - string stageFossUrl = Dataconstant.Cdx_StageFossologyURL.ToLower(); + string prodFossUrl = Dataconstant.ProductionFossologyURL.ToLower(); + string stageFossUrl = Dataconstant.StageFossologyURL.ToLower(); if (string.IsNullOrEmpty(appSettings.SW360.Fossology.URL)) { From 23137e4232e453b0531dfdfd9efd466816f5e9a9 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 13:21:48 +0530 Subject: [PATCH 11/21] updated test cases --- src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs | 4 ++-- src/LCT.Common/PipelineArtifactUploader.cs | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs b/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs index ec4e0f02..de204c1b 100644 --- a/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs +++ b/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs @@ -94,10 +94,10 @@ public void UploadBom_ShouldNotUpload_WhenInUnknownEnvironment() // Act PipelineArtifactUploader.UploadBom(); - string output = consoleOutput.ToString(); + string output = consoleOutput.ToString().Trim(); // Assert - Assert.That(output, Is.Empty); + Assert.AreEqual("Uploading of SBOM is not supported.", output); } } } diff --git a/src/LCT.Common/PipelineArtifactUploader.cs b/src/LCT.Common/PipelineArtifactUploader.cs index e3594100..44a0c732 100644 --- a/src/LCT.Common/PipelineArtifactUploader.cs +++ b/src/LCT.Common/PipelineArtifactUploader.cs @@ -44,8 +44,7 @@ public static void UploadLogs() /// public static void UploadBom() { - EnvironmentType envType = RuntimeEnvironment.GetEnvironment(); - LogManager.Shutdown(); + EnvironmentType envType = RuntimeEnvironment.GetEnvironment(); if (envType == EnvironmentType.AzurePipeline && !string.IsNullOrEmpty(FileOperations.CatoolBomFilePath) && File.Exists(FileOperations.CatoolBomFilePath)) { Console.WriteLine($"##vso[artifact.upload containerfolder={BomContainerFolderName};artifactname={BomArtifactFolderName}]{FileOperations.CatoolBomFilePath}"); From 90d2aa8735328a39c3d326968b5bb0a233a8f4c1 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 13:49:12 +0530 Subject: [PATCH 12/21] Removed unnessasary publish artifacts --- src/ArtifactoryUploader/PackageUploadHelper.cs | 3 +-- src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs | 6 +++--- src/LCT.Common/CommonHelper.cs | 6 ++---- src/LCT.Common/PipelineArtifactUploader.cs | 6 +++--- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/ArtifactoryUploader/PackageUploadHelper.cs b/src/ArtifactoryUploader/PackageUploadHelper.cs index 8c1cb786..ed60329f 100644 --- a/src/ArtifactoryUploader/PackageUploadHelper.cs +++ b/src/ArtifactoryUploader/PackageUploadHelper.cs @@ -997,8 +997,7 @@ public static async Task UploadingThePackages(List comp } if (SetWarningCode) - { - PipelineArtifactUploader.UploadArtifacts(); + { Environment.ExitCode = 2; Logger.Debug("Setting ExitCode to 2"); } diff --git a/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs b/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs index de204c1b..ffa29dc4 100644 --- a/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs +++ b/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs @@ -60,11 +60,11 @@ public void UploadLogs_ShouldNotUpload_WhenInUnknownEnvironment() Environment.SetEnvironmentVariable("Build_BuildId", null); // No pipeline detected // Act - PipelineArtifactUploader.UploadLogs(); - string output = consoleOutput.ToString(); + PipelineArtifactUploader.UploadBom(); + string output = consoleOutput.ToString().Trim(); // Assert - Assert.That(output, Is.Empty); + Assert.AreEqual("Uploading of SBOM is not supported.", output); } [Test] diff --git a/src/LCT.Common/CommonHelper.cs b/src/LCT.Common/CommonHelper.cs index 0abdbbf6..fda375b8 100644 --- a/src/LCT.Common/CommonHelper.cs +++ b/src/LCT.Common/CommonHelper.cs @@ -156,8 +156,7 @@ public static void WriteComponentsWithoutDownloadURLToKpi(List 0 || lstReleaseNotCreated.Count > 0) { - Logger.Logger.Log(null, Level.Alert, "Action Item required by the user:\n", null); - PipelineArtifactUploader.UploadArtifacts(); + Logger.Logger.Log(null, Level.Alert, "Action Item required by the user:\n", null); Environment.ExitCode = 2; } @@ -203,8 +202,7 @@ public static void WriteComponentsNotLinkedListInConsole(List compon const string Version = "Version"; if (components.Count > 0) - { - PipelineArtifactUploader.UploadArtifacts(); + { Environment.ExitCode = 2; Logger.Logger.Log(null, Level.Alert, "* Components Not linked to project :", null); Logger.Logger.Log(null, Level.Alert, " Can be linked manually OR Check the Logs AND RE-Run", null); diff --git a/src/LCT.Common/PipelineArtifactUploader.cs b/src/LCT.Common/PipelineArtifactUploader.cs index 44a0c732..184b733c 100644 --- a/src/LCT.Common/PipelineArtifactUploader.cs +++ b/src/LCT.Common/PipelineArtifactUploader.cs @@ -26,10 +26,10 @@ public static void UploadArtifacts() /// public static void UploadLogs() { - EnvironmentType envType = RuntimeEnvironment.GetEnvironment(); - LogManager.Shutdown(); + EnvironmentType envType = RuntimeEnvironment.GetEnvironment(); if (envType == EnvironmentType.AzurePipeline && !string.IsNullOrEmpty(Log4Net.CatoolLogPath) && File.Exists(Log4Net.CatoolLogPath)) - { + { + LogManager.Shutdown(); Console.WriteLine($"##vso[artifact.upload containerfolder={LogContainerFolderName};artifactname={LogArtifactFolderName}]{Log4Net.CatoolLogPath}"); } else if (envType == EnvironmentType.Unknown) From 50e50bb0f27d1bb6f4c877605e745bf6a36cbab3 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 15:20:51 +0530 Subject: [PATCH 13/21] Updated requested changes --- .../Interfaces/ISW360APICommunication.cs | 2 +- .../SW360Apicommunication.cs | 5 +-- .../ISW360ApicommunicationFacade.cs | 2 +- src/LCT.Facade/SW360ApicommunicationFacade.cs | 2 +- .../CreatorValidatorTest.cs | 24 +++++------ .../CreatorValidator.cs | 41 ++++++++++--------- 6 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs b/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs index 28f3ef69..372863b6 100644 --- a/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs +++ b/src/LCT.APICommunications/Interfaces/ISW360APICommunication.cs @@ -40,6 +40,6 @@ public interface ISw360ApiCommunication string AttachComponentSourceToSW360(AttachReport attachReport); void DownloadAttachmentUsingWebClient(string attachmentDownloadLink, string fileName); Task GetComponentDetailsByUrl(string componentLink); - Task GetAllReleasesWithAllData(string page, string pageEntries); + Task GetAllReleasesWithAllData(int page, int pageEntries); } } diff --git a/src/LCT.APICommunications/SW360Apicommunication.cs b/src/LCT.APICommunications/SW360Apicommunication.cs index 1673b3a7..8bdbf405 100644 --- a/src/LCT.APICommunications/SW360Apicommunication.cs +++ b/src/LCT.APICommunications/SW360Apicommunication.cs @@ -313,10 +313,9 @@ public async Task GetComponentUsingName(string componentNam string url = $"{sw360ComponentApi}{ApiConstant.ComponentNameUrl}{componentName}"; return await httpClient.GetAsync(url); } - public async Task GetAllReleasesWithAllData(string page, string pageEntries) + public async Task GetAllReleasesWithAllData(int page, int pageEntries) { - HttpClient httpClient = GetHttpClient(); - HttpResponseMessage httpResponseMessage=new HttpResponseMessage(); + HttpClient httpClient = GetHttpClient(); string url = $"{sw360ReleaseApi}?page={page}&allDetails=true&page_entries={pageEntries}"; return await httpClient.GetAsync(url); } diff --git a/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs b/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs index c4db7b9e..8b766303 100644 --- a/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs +++ b/src/LCT.Facade/Interfaces/ISW360ApicommunicationFacade.cs @@ -43,6 +43,6 @@ public interface ISW360ApicommunicationFacade Task UpdateLinkedRelease(string projectId, string releaseId, UpdateLinkedRelease updateLinkedRelease); Task GetReleaseByExternalId(string purlId,string externalIdKey = ""); Task GetComponentByExternalId(string purlId, string externalIdKey = ""); - Task GetAllReleasesWithAllData(string page, string pageEntries); + Task GetAllReleasesWithAllData(int page, int pageEntries); } } diff --git a/src/LCT.Facade/SW360ApicommunicationFacade.cs b/src/LCT.Facade/SW360ApicommunicationFacade.cs index f1908221..3574f3af 100644 --- a/src/LCT.Facade/SW360ApicommunicationFacade.cs +++ b/src/LCT.Facade/SW360ApicommunicationFacade.cs @@ -195,7 +195,7 @@ public Task GetComponentByExternalId(string purlId, string { return m_sw360ApiCommunication.GetComponentByExternalId(purlId, externalIdKey); } - public Task GetAllReleasesWithAllData(string page,string pageEntries) + public Task GetAllReleasesWithAllData(int page, int pageEntries) { return m_sw360ApiCommunication.GetAllReleasesWithAllData(page, pageEntries); } diff --git a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs index 00775dc3..57ea2025 100644 --- a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs +++ b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs @@ -52,7 +52,7 @@ public async Task ValidateAppSettings_TestPositive() { //Arrange string projectName = "Test"; - ProjectReleases projectReleases=new ProjectReleases(); + ProjectReleases projectReleases = new ProjectReleases(); var CommonAppSettings = new CommonAppSettings() { SW360 = new SW360() @@ -64,7 +64,7 @@ public async Task ValidateAppSettings_TestPositive() .ReturnsAsync(projectName); //Act - await CreatorValidator.ValidateAppSettings(CommonAppSettings, mockISw360ProjectService.Object,projectReleases); + await CreatorValidator.ValidateAppSettings(CommonAppSettings, mockISw360ProjectService.Object, projectReleases); //Assert mockISw360ProjectService.Verify(x => x.GetProjectNameByProjectIDFromSW360(It.IsAny(), It.IsAny(), projectReleases), Times.AtLeastOnce); @@ -81,10 +81,10 @@ public async Task ValidateAppSettings_OnClosedProject_EndsTheApplication() { SW360 = new SW360() { - ProjectName= "Test" + ProjectName = "Test" } }; - + mockISw360ProjectService.Setup(x => x.GetProjectNameByProjectIDFromSW360(It.IsAny(), It.IsAny(), projectReleases)) .ReturnsAsync(projectName); @@ -104,9 +104,9 @@ public void ValidateAppSettings_TestNegative() ProjectReleases projectReleases = new ProjectReleases(); var CommonAppSettings = new CommonAppSettings() { - SW360=new SW360() + SW360 = new SW360() }; - mockISw360ProjectService.Setup(x => x.GetProjectNameByProjectIDFromSW360(It.IsAny(), It.IsAny(),projectReleases)) + mockISw360ProjectService.Setup(x => x.GetProjectNameByProjectIDFromSW360(It.IsAny(), It.IsAny(), projectReleases)) .ReturnsAsync(projectName); //Act @@ -147,7 +147,7 @@ public async Task TriggerFossologyValidation_TestPositive() var triggerStatusResponse = JsonConvert.SerializeObject(fossTriggerStatus); - mockISW360ApicommunicationFacade.Setup(x => x.GetAllReleasesWithAllData(It.IsAny(), It.IsAny())).ReturnsAsync(new HttpResponseMessage + mockISW360ApicommunicationFacade.Setup(x => x.GetAllReleasesWithAllData(It.IsAny(), It.IsAny())).ReturnsAsync(new HttpResponseMessage { Content = new StringContent(responseBody) }); @@ -160,14 +160,14 @@ public async Task TriggerFossologyValidation_TestPositive() await CreatorValidator.TriggerFossologyValidation(appSettings, mockISW360ApicommunicationFacade.Object); // Assert - mockISW360ApicommunicationFacade.Verify(x => x.GetAllReleasesWithAllData(It.IsAny(), It.IsAny()), Times.Once); - mockISW360ApicommunicationFacade.Verify(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny()), Times.Once); + mockISW360ApicommunicationFacade.Verify(x => x.GetAllReleasesWithAllData(It.IsAny(), It.IsAny()), Times.Once); + mockISW360ApicommunicationFacade.Verify(x => x.TriggerFossologyProcess(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task FossologyUrlValidation_ValidUrl_ReturnsTrue() { // Arrange - + var appSettings = new CommonAppSettings() { @@ -228,7 +228,7 @@ public async Task FossologyUrlValidation_InvalidUrl_ReturnsFalse() // Assert Assert.IsFalse(result); } - + [Test] public async Task FossologyUrlValidation_InvalidUri_ThrowsException() @@ -282,7 +282,7 @@ public async Task FossologyUrlValidation_HttpRequestException_ReturnsFalse() Assert.IsFalse(result); } - + } } diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 899b8aa4..c26ae18f 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -63,8 +63,8 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting try { - string page = "0"; - string pageEntries = "20"; + int page = 0; + int pageEntries = 40; bool validReleaseFound = false; ReleasesAllDetails.Sw360Release validRelease = null; int pageCount = 0; @@ -74,37 +74,40 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting string response = responseData?.Content?.ReadAsStringAsync()?.Result ?? string.Empty; ReleasesAllDetails releaseResponse = JsonConvert.DeserializeObject(response); - validRelease = releaseResponse.Embedded.Sw360releases + if (releaseResponse != null) + { + validRelease = releaseResponse?.Embedded?.Sw360releases? .FirstOrDefault(release => release.ClearingState == "APPROVED" && release.AllReleasesEmbedded?.Sw360attachments != null && release.AllReleasesEmbedded.Sw360attachments.Any(attachments => attachments.Count != 0)); - if (validRelease != null) - { - validReleaseFound = true; - } - else - { - // Check if there are more pages - int currentPage = int.Parse(page); - int totalPages = releaseResponse.Page.TotalPages; - if (currentPage < totalPages - 1) + if (validRelease != null) { - page = (currentPage + 1).ToString(); - pageCount++; + validReleaseFound = true; } else { - break; // No more pages to check + int currentPage = page; + int totalPages = (int)(releaseResponse?.Page?.TotalPages); + if (currentPage < totalPages - 1) + { + page = currentPage + 1; + pageCount++; + } + else + { + break; + } } } + } if (validReleaseFound) { - var releaseUrl = validRelease.Links.Self.Href; + var releaseUrl = validRelease?.Links?.Self?.Href; var releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); - string sw360link = $"{validRelease.Name}:{validRelease.Version}:{appSettings.SW360.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + + string sw360link = $"{validRelease?.Name}:{validRelease?.Version}:{appSettings?.SW360?.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + $"{releaseId}#/tab-Summary"; FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) @@ -116,7 +119,7 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting } catch (AggregateException ex) { - Logger.Debug($"\tError in TriggerFossologyProcess--{ex}"); + Logger.Debug($"\tError in TriggerFossologyValidation--{ex}"); Logger.Error($"Trigger Fossology Process failed.Please check fossology configuration in sw360"); environmentHelper.CallEnvironmentExit(-1); } From 362723538c83f46d537e8f4eadc86582b0832186 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 15:42:43 +0530 Subject: [PATCH 14/21] updated requested changes --- src/LCT.SW360PackageCreator/CreatorValidator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index c26ae18f..d481167c 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -77,8 +77,8 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting if (releaseResponse != null) { validRelease = releaseResponse?.Embedded?.Sw360releases? - .FirstOrDefault(release => release.ClearingState == "APPROVED" && - release.AllReleasesEmbedded?.Sw360attachments != null && + .FirstOrDefault(release => release?.ClearingState == "APPROVED" && + release?.AllReleasesEmbedded?.Sw360attachments != null && release.AllReleasesEmbedded.Sw360attachments.Any(attachments => attachments.Count != 0)); if (validRelease != null) From fb0599f1fd73532ab2b5686ca9fa5191bb4383bb Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 17:12:47 +0530 Subject: [PATCH 15/21] Updated code changes --- .../CreatorValidator.cs | 50 ++++++++++++++++--- src/LCT.Services/Sw360CreatorService.cs | 8 +-- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index d481167c..07946994 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -23,6 +23,7 @@ using LCT.SW360PackageCreator.Model; using System.Linq; using LCT.Common.Constants; +using LCT.Facade; namespace LCT.SW360PackageCreator @@ -69,10 +70,8 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting ReleasesAllDetails.Sw360Release validRelease = null; int pageCount = 0; while (!validReleaseFound && pageCount < 10) - { - HttpResponseMessage responseData = await sW360ApicommunicationFacade.GetAllReleasesWithAllData(page, pageEntries); - string response = responseData?.Content?.ReadAsStringAsync()?.Result ?? string.Empty; - ReleasesAllDetails releaseResponse = JsonConvert.DeserializeObject(response); + { + ReleasesAllDetails releaseResponse = await GetAllReleasesDetails(sW360ApicommunicationFacade,page,pageEntries); if (releaseResponse != null) { @@ -100,13 +99,18 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting } } } - + else + { + Logger.Debug($"GetAllReleasesFullDetails():Fossology URl validation Failed"); + } } if (validReleaseFound) { var releaseUrl = validRelease?.Links?.Self?.Href; - var releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); + var releaseId=string.Empty; + if (releaseUrl != null) + releaseId = CommonHelper.GetSubstringOfLastOccurance(releaseUrl, "/"); string sw360link = $"{validRelease?.Name}:{validRelease?.Version}:{appSettings?.SW360?.URL}{ApiConstant.Sw360ReleaseUrlApiSuffix}" + $"{releaseId}#/tab-Summary"; FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); @@ -115,15 +119,47 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); } } + else + { + Logger.Debug($"GetAllReleasesFullDetails():Fossology URl validation Failed"); + } } catch (AggregateException ex) { Logger.Debug($"\tError in TriggerFossologyValidation--{ex}"); - Logger.Error($"Trigger Fossology Process failed.Please check fossology configuration in sw360"); + Logger.Error($"Trigger fossology process failed.Please check fossology configuration in sw360"); environmentHelper.CallEnvironmentExit(-1); } } + private static async Task GetAllReleasesDetails(ISW360ApicommunicationFacade sW360ApicommunicationFacade, int page, int pageEntries) + { + ReleasesAllDetails releaseResponse = null; + try + { + var responseData = await sW360ApicommunicationFacade.GetAllReleasesWithAllData(page, pageEntries); + string response = responseData?.Content?.ReadAsStringAsync()?.Result ?? string.Empty; + releaseResponse = JsonConvert.DeserializeObject(response); + } + catch (HttpRequestException ex) + { + Logger.Debug($"GetAllReleasesDetails():", ex); + } + catch (InvalidOperationException ex) + { + Logger.Debug($"GetAllReleasesDetails():", ex); + } + catch (UriFormatException ex) + { + Logger.Debug($"GetAllReleasesDetails():", ex); + } + catch (TaskCanceledException ex) + { + Logger.Debug($"GetAllReleasesDetails():", ex); + } + + return releaseResponse; + } public static async Task FossologyUrlValidation(CommonAppSettings appSettings, HttpClient client, IEnvironmentHelper environmentHelper) { string url = appSettings.SW360.Fossology.URL.ToLower(); diff --git a/src/LCT.Services/Sw360CreatorService.cs b/src/LCT.Services/Sw360CreatorService.cs index 1b50bbb2..30b93e1e 100644 --- a/src/LCT.Services/Sw360CreatorService.cs +++ b/src/LCT.Services/Sw360CreatorService.cs @@ -793,25 +793,25 @@ public async Task TriggerFossologyProcessForValidation(string catch (HttpRequestException ex) { Logger.Debug($"TriggerFossologyProcessForValidation():", ex); - Logger.Error($"Fossology Process failed.Please check fossology configuration or Token in sw360"); + Logger.Error($"Fossology process failed.Please check fossology configuration or Token in sw360"); environmentHelper.CallEnvironmentExit(-1); } catch (InvalidOperationException ex) { Logger.Debug($"TriggerFossologyProcessForValidation():", ex); - Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + Logger.Error($"Fossology process failed.Please check fossology configuration in sw360"); environmentHelper.CallEnvironmentExit(-1); } catch (UriFormatException ex) { Logger.Debug($"TriggerFossologyProcessForValidation():", ex); - Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + Logger.Error($"Fossology process failed.Please check fossology configuration in sw360"); environmentHelper.CallEnvironmentExit(-1); } catch (TaskCanceledException ex) { Logger.Debug($"TriggerFossologyProcessForValidation():", ex); - Logger.Error($"Fossology Process failed.Please check fossology configuration in sw360"); + Logger.Error($"Fossology process failed.Please check fossology configuration in sw360"); environmentHelper.CallEnvironmentExit(-1); } return fossTriggerStatus; From 27525548e9069cc0010de6db3ae8e0039673a1d9 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 18:09:43 +0530 Subject: [PATCH 16/21] updated changes --- src/LCT.SW360PackageCreator/CreatorValidator.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 07946994..772dbbcd 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -75,8 +75,7 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting if (releaseResponse != null) { - validRelease = releaseResponse?.Embedded?.Sw360releases? - .FirstOrDefault(release => release?.ClearingState == "APPROVED" && + validRelease = releaseResponse?.Embedded?.Sw360releases?.FirstOrDefault(release => release?.ClearingState == "APPROVED" && release?.AllReleasesEmbedded?.Sw360attachments != null && release.AllReleasesEmbedded.Sw360attachments.Any(attachments => attachments.Count != 0)); @@ -101,7 +100,7 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting } else { - Logger.Debug($"GetAllReleasesFullDetails():Fossology URl validation Failed"); + Logger.Debug($"TriggerFossologyValidation():Fossology URl validation Failed"); } } @@ -121,7 +120,7 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting } else { - Logger.Debug($"GetAllReleasesFullDetails():Fossology URl validation Failed"); + Logger.Debug($"TriggerFossologyValidation():Fossology URl validation Failed"); } } From 50d8b88b7e88615d111260954db4d347a0712fc0 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Fri, 7 Feb 2025 09:36:56 +0530 Subject: [PATCH 17/21] removed unnessasary lines --- src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs index 57ea2025..2f0593b4 100644 --- a/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs +++ b/src/LCT.SW360PackageCreator.UTest/CreatorValidatorTest.cs @@ -167,8 +167,6 @@ public async Task TriggerFossologyValidation_TestPositive() public async Task FossologyUrlValidation_ValidUrl_ReturnsTrue() { // Arrange - - var appSettings = new CommonAppSettings() { SW360 = new SW360() @@ -179,7 +177,6 @@ public async Task FossologyUrlValidation_ValidUrl_ReturnsTrue() } } }; - var responseMessage = new HttpResponseMessage(HttpStatusCode.OK); mockHttpMessageHandler .Protected() @@ -189,7 +186,6 @@ public async Task FossologyUrlValidation_ValidUrl_ReturnsTrue() ItExpr.IsAny() ) .ReturnsAsync(responseMessage); - // Act var result = await CreatorValidator.FossologyUrlValidation(appSettings, httpClient, mockEnvironmentHelper.Object); From fde108d964be58f95da9e0c5a82e4e7159b9a837 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Fri, 7 Feb 2025 14:27:10 +0530 Subject: [PATCH 18/21] Removed sucess message --- src/LCT.SW360PackageCreator/CreatorValidator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 772dbbcd..8a1dd9b4 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -114,8 +114,8 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting $"{releaseId}#/tab-Summary"; FossTriggerStatus fossResult = await sw360CreatorService.TriggerFossologyProcessForValidation(releaseId, sw360link); if (!string.IsNullOrEmpty(fossResult?.Links?.Self?.Href)) - { - Logger.Logger.Log(null, Level.Info, $"SW360 Fossology Process validation successfull!!", null); + { + Logger.Debug($"TriggerFossologyValidation():SW360 Fossology Process validation successfull!!"); } } else From badc8779bfd7b002ab32f09ae7eaf0dcbb85503d Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Fri, 7 Feb 2025 14:56:05 +0530 Subject: [PATCH 19/21] Undo Changes --- src/ArtifactoryUploader/PackageUploadHelper.cs | 3 ++- src/LCT.Common/CommonHelper.cs | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ArtifactoryUploader/PackageUploadHelper.cs b/src/ArtifactoryUploader/PackageUploadHelper.cs index ed60329f..8c1cb786 100644 --- a/src/ArtifactoryUploader/PackageUploadHelper.cs +++ b/src/ArtifactoryUploader/PackageUploadHelper.cs @@ -997,7 +997,8 @@ public static async Task UploadingThePackages(List comp } if (SetWarningCode) - { + { + PipelineArtifactUploader.UploadArtifacts(); Environment.ExitCode = 2; Logger.Debug("Setting ExitCode to 2"); } diff --git a/src/LCT.Common/CommonHelper.cs b/src/LCT.Common/CommonHelper.cs index fda375b8..0abdbbf6 100644 --- a/src/LCT.Common/CommonHelper.cs +++ b/src/LCT.Common/CommonHelper.cs @@ -156,7 +156,8 @@ public static void WriteComponentsWithoutDownloadURLToKpi(List 0 || lstReleaseNotCreated.Count > 0) { - Logger.Logger.Log(null, Level.Alert, "Action Item required by the user:\n", null); + Logger.Logger.Log(null, Level.Alert, "Action Item required by the user:\n", null); + PipelineArtifactUploader.UploadArtifacts(); Environment.ExitCode = 2; } @@ -202,7 +203,8 @@ public static void WriteComponentsNotLinkedListInConsole(List compon const string Version = "Version"; if (components.Count > 0) - { + { + PipelineArtifactUploader.UploadArtifacts(); Environment.ExitCode = 2; Logger.Logger.Log(null, Level.Alert, "* Components Not linked to project :", null); Logger.Logger.Log(null, Level.Alert, " Can be linked manually OR Check the Logs AND RE-Run", null); From 70df2cc966e27fe563b23c2c01f20316c9b4fa3e Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Fri, 7 Feb 2025 14:58:48 +0530 Subject: [PATCH 20/21] undo test case --- src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs b/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs index ffa29dc4..ec4e0f02 100644 --- a/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs +++ b/src/LCT.Common.UTests/PipelineArtifactUploaderTest.cs @@ -60,11 +60,11 @@ public void UploadLogs_ShouldNotUpload_WhenInUnknownEnvironment() Environment.SetEnvironmentVariable("Build_BuildId", null); // No pipeline detected // Act - PipelineArtifactUploader.UploadBom(); - string output = consoleOutput.ToString().Trim(); + PipelineArtifactUploader.UploadLogs(); + string output = consoleOutput.ToString(); // Assert - Assert.AreEqual("Uploading of SBOM is not supported.", output); + Assert.That(output, Is.Empty); } [Test] @@ -94,10 +94,10 @@ public void UploadBom_ShouldNotUpload_WhenInUnknownEnvironment() // Act PipelineArtifactUploader.UploadBom(); - string output = consoleOutput.ToString().Trim(); + string output = consoleOutput.ToString(); // Assert - Assert.AreEqual("Uploading of SBOM is not supported.", output); + Assert.That(output, Is.Empty); } } } From 491357f2a5173f1d90b2e1a780b3c669ea3d7422 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Sat, 8 Feb 2025 18:37:06 +0530 Subject: [PATCH 21/21] updated small correction --- src/LCT.SW360PackageCreator/CreatorValidator.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index 8a1dd9b4..fa2614b3 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -34,7 +34,7 @@ namespace LCT.SW360PackageCreator public static class CreatorValidator { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private static IEnvironmentHelper environmentHelper; + private static IEnvironmentHelper environmentHelper =new EnvironmentHelper(); public static async Task ValidateAppSettings(CommonAppSettings appSettings, ISw360ProjectService sw360ProjectService, ProjectReleases projectReleases) { string sw360ProjectName = await sw360ProjectService.GetProjectNameByProjectIDFromSW360(appSettings.SW360.ProjectID, appSettings.SW360.ProjectName, projectReleases); @@ -56,8 +56,7 @@ public static async Task ValidateAppSettings(CommonAppSettings appSettings, return 0; } public static async Task TriggerFossologyValidation(CommonAppSettings appSettings, ISW360ApicommunicationFacade sW360ApicommunicationFacade) - { - IEnvironmentHelper environmentHelper = new EnvironmentHelper(); + { ISW360CommonService sw360CommonService = new SW360CommonService(sW360ApicommunicationFacade); ISw360CreatorService sw360CreatorService = new Sw360CreatorService(sW360ApicommunicationFacade, sw360CommonService); ISW360Service sw360Service = new Sw360Service(sW360ApicommunicationFacade, sw360CommonService, environmentHelper);