From c83628016d42140c505f1a8fb4328ac30e872afd Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 4 Feb 2025 08:11:07 +0530 Subject: [PATCH 1/6] Refactor code changes --- .../ArtifactoryUploaderTest.cs | 2 +- .../PackageUploadHelperTest.cs | 191 +--- .../PackageUploadInformationTest.cs | 202 ++++ .../ArtifactoryUploader.cs | 2 +- .../PackageUploadHelper.cs | 954 +++--------------- .../PackageUploadInformation.cs | 401 ++++++++ src/ArtifactoryUploader/PackageUploader.cs | 4 +- src/LCT.PackageIdentifier/Program.cs | 146 +-- 8 files changed, 781 insertions(+), 1121 deletions(-) create mode 100644 src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs create mode 100644 src/ArtifactoryUploader/PackageUploadInformation.cs diff --git a/src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs b/src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs index 9a5da5be..f6e92936 100644 --- a/src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs +++ b/src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs @@ -48,7 +48,7 @@ public async Task UploadPackageToRepo_InputEmptyCreds_ReturnsPackgeNotFound() }; ArtfactoryUploader.jFrogService = GetJfrogService(appSettings); - DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); var componentsToArtifactory = new ComponentsToArtifactory { Name = "html5lib", diff --git a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs index 67a4c0f4..adb9f96d 100644 --- a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs +++ b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs @@ -74,7 +74,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenFewApprovedCompone List componentLists = GetComponentList(); string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string outFolder = Path.GetDirectoryName(exePath); - DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); var jFrogServiceMock = new Mock(); PackageUploadHelper.jFrogService = jFrogServiceMock.Object; @@ -119,7 +119,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenAllApprovedCompone { //Arrange List componentLists = GetComponentList(); - DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); var jFrogServiceMock = new Mock(); PackageUploadHelper.jFrogService = jFrogServiceMock.Object; @@ -176,7 +176,7 @@ public async Task GetComponentsToBeUploadedToArtifactory_GivenNotApprovedCompone { //Arrange List componentLists = GetComponentList(); - DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); foreach (var component in componentLists) { component.Properties[1].Value = "NEW_CLEARING"; @@ -257,53 +257,9 @@ public void UpdateBomArtifactoryRepoUrl_GivenBomAndComponentsUploadedToArtifacto Assert.AreNotEqual("org1-npmjs-npm-remote", repoUrl); } - [Test] - public void DisplayErrorForJfrogPackages_GivenJfrogNotFoundPackages_ResultsSucess() - { - // Arrange - ComponentsToArtifactory componentsToArtifactory = new ComponentsToArtifactory(); - componentsToArtifactory.Name = "Test"; - componentsToArtifactory.Version = "0.12.3"; - List JfrogNotFoundPackages = new() { componentsToArtifactory }; - // Act + - PackageUploadHelper.DisplayErrorForJfrogPackages(JfrogNotFoundPackages); - - // Assert - Assert.That(JfrogNotFoundPackages.Count, Is.GreaterThanOrEqualTo(1)); - } - - [Test] - public void DisplayErrorForJfrogFoundPackages_GivenJfrogNotFoundPackages_ResultsSucess() - { - // Arrange - ComponentsToArtifactory componentsToArtifactory = new ComponentsToArtifactory(); - componentsToArtifactory.Name = "Test"; - componentsToArtifactory.Version = "0.12.3"; - componentsToArtifactory.ResponseMessage = new System.Net.Http.HttpResponseMessage() - { ReasonPhrase = ApiConstant.ErrorInUpload }; - - ComponentsToArtifactory componentsToArtifactory2 = new ComponentsToArtifactory(); - componentsToArtifactory2.Name = "Test2"; - componentsToArtifactory2.Version = "0.12.32"; - componentsToArtifactory2.ResponseMessage = new System.Net.Http.HttpResponseMessage() - { ReasonPhrase = ApiConstant.PackageNotFound }; - - ComponentsToArtifactory componentsToArtifactory3 = new ComponentsToArtifactory(); - componentsToArtifactory3.Name = "Test3"; - componentsToArtifactory3.Version = "0.12.33"; - componentsToArtifactory3.ResponseMessage = new System.Net.Http.HttpResponseMessage() - { ReasonPhrase = "error" }; - - List JfrogNotFoundPackages = new() { - componentsToArtifactory, componentsToArtifactory2, componentsToArtifactory3 }; - // Act - - PackageUploadHelper.DisplayErrorForJfrogFoundPackages(JfrogNotFoundPackages); - - // Assert - Assert.That(JfrogNotFoundPackages.Count, Is.GreaterThanOrEqualTo(1)); - } + private static List GetComponentList() { @@ -644,142 +600,9 @@ public void GetJfrogApiCommInstance_GivenComponentWithUnknownType_ReturnsJfrogAp Assert.IsInstanceOf(result); } - [Test] - [TestCase("NPM")] - [TestCase("NUGET")] - [TestCase("MAVEN")] - [TestCase("POETRY")] - [TestCase("CONAN")] - [TestCase("DEBIAN")] - public async Task JfrogNotFoundPackagesAsync_CoversAllScenarios(string compType) - { - // Arrange - var item = new ComponentsToArtifactory(); - item.ComponentType = compType; - var displayPackagesInfo = new DisplayPackagesInfo(); - displayPackagesInfo.JfrogNotFoundPackagesNpm = new List(); - displayPackagesInfo.JfrogNotFoundPackagesNuget = new List(); - displayPackagesInfo.JfrogNotFoundPackagesMaven = new List(); - displayPackagesInfo.JfrogNotFoundPackagesPython = new List(); - displayPackagesInfo.JfrogNotFoundPackagesConan = new List(); - displayPackagesInfo.JfrogNotFoundPackagesDebian = new List(); - - // Act - await PackageUploadHelper.JfrogNotFoundPackagesAsync(item, displayPackagesInfo); + - // Assert - if (item.ComponentType == "NPM") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesNpm.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesNpm[0], Is.Not.Null); - } - else if (item.ComponentType == "NUGET") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesNuget.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesNuget[0], Is.Not.Null); - } - else if (item.ComponentType == "MAVEN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesMaven.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesMaven[0], Is.Not.Null); - } - else if (item.ComponentType == "POETRY") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesPython.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesPython[0], Is.Not.Null); - } - else if (item.ComponentType == "CONAN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesConan.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesConan[0], Is.Not.Null); - } - else if (item.ComponentType == "DEBIAN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesDebian.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesDebian[0], Is.Not.Null); - } - } - - [Test] - [TestCase("NPM")] - [TestCase("NUGET")] - [TestCase("MAVEN")] - [TestCase("POETRY")] - [TestCase("CONAN")] - [TestCase("DEBIAN")] - public async Task JfrogFoundPackagesAsync_CoversAllScenarios(string compType) - { - // Arrange - var item = new ComponentsToArtifactory(); - item.ComponentType = compType; - var displayPackagesInfo = new DisplayPackagesInfo(); - displayPackagesInfo.JfrogFoundPackagesNpm = new List(); - displayPackagesInfo.JfrogFoundPackagesNuget = new List(); - displayPackagesInfo.JfrogFoundPackagesMaven = new List(); - displayPackagesInfo.JfrogFoundPackagesPython = new List(); - displayPackagesInfo.JfrogFoundPackagesConan = new List(); - displayPackagesInfo.JfrogFoundPackagesDebian = new List(); - var operationType = "operationType"; - var responseMessage = new HttpResponseMessage(); - var dryRunSuffix = "dryRunSuffix"; - - // Act - await PackageUploadHelper.JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); - - // Assert - if (item.ComponentType == "NPM") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesNpm.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesNpm[0], Is.Not.Null); - } - else if (item.ComponentType == "NUGET") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesNuget.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesNuget[0], Is.Not.Null); - } - else if (item.ComponentType == "MAVEN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesMaven.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesMaven[0], Is.Not.Null); - } - else if (item.ComponentType == "POETRY") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesPython.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesPython[0], Is.Not.Null); - } - else if (item.ComponentType == "CONAN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesConan.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesConan[0], Is.Not.Null); - } - else if (item.ComponentType == "DEBIAN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesDebian.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesDebian[0], Is.Not.Null); - } - } - - [Test] - public void GetNotApprovedDebianPackages_CoversAllScenarios() - { - // Arrange - var unknownPackages = new List - { - new ComponentsToArtifactory { Name = "Package1", Version = "1.0.0" }, - new ComponentsToArtifactory { Name = "Package2", Version = "2.0.0" } - }; - var projectResponse = new ProjectResponse(); - var fileOperationsMock = new Mock(); - var filepath = ".."; - var filename = "\\testFileName.json"; - - // Act - PackageUploadHelper.GetNotApprovedDebianPackages(unknownPackages, projectResponse, fileOperationsMock.Object, filepath, filename); - - // Assert - // Add your assertions here - Assert.That(unknownPackages.Count, Is.EqualTo(2)); - } + [Test] public async Task GetJfrogRepoInfoForAllTypePackages_GivenDestRepoNames_ReturnsAqlResultList() diff --git a/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs b/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs new file mode 100644 index 00000000..f4863a13 --- /dev/null +++ b/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs @@ -0,0 +1,202 @@ +using LCT.APICommunications; +using LCT.APICommunications.Model; +using LCT.ArtifactoryUploader; +using LCT.ArtifactoryUploader.Model; +using LCT.Common.Interface; +using Moq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace AritfactoryUploader.UTest +{ + public class PackageUploadInformationTest + { + [Test] + public void DisplayErrorForJfrogPackages_GivenJfrogNotFoundPackages_ResultsSucess() + { + // Arrange + ComponentsToArtifactory componentsToArtifactory = new ComponentsToArtifactory(); + componentsToArtifactory.Name = "Test"; + componentsToArtifactory.Version = "0.12.3"; + List JfrogNotFoundPackages = new() { componentsToArtifactory }; + // Act + + PackageUploadInformation.DisplayErrorForJfrogPackages(JfrogNotFoundPackages); + + // Assert + Assert.That(JfrogNotFoundPackages.Count, Is.GreaterThanOrEqualTo(1)); + } + [Test] + public void DisplayErrorForJfrogFoundPackages_GivenJfrogNotFoundPackages_ResultsSucess() + { + // Arrange + ComponentsToArtifactory componentsToArtifactory = new ComponentsToArtifactory(); + componentsToArtifactory.Name = "Test"; + componentsToArtifactory.Version = "0.12.3"; + componentsToArtifactory.ResponseMessage = new System.Net.Http.HttpResponseMessage() + { ReasonPhrase = ApiConstant.ErrorInUpload }; + + ComponentsToArtifactory componentsToArtifactory2 = new ComponentsToArtifactory(); + componentsToArtifactory2.Name = "Test2"; + componentsToArtifactory2.Version = "0.12.32"; + componentsToArtifactory2.ResponseMessage = new System.Net.Http.HttpResponseMessage() + { ReasonPhrase = ApiConstant.PackageNotFound }; + + ComponentsToArtifactory componentsToArtifactory3 = new ComponentsToArtifactory(); + componentsToArtifactory3.Name = "Test3"; + componentsToArtifactory3.Version = "0.12.33"; + componentsToArtifactory3.ResponseMessage = new System.Net.Http.HttpResponseMessage() + { ReasonPhrase = "error" }; + + List JfrogNotFoundPackages = new() { + componentsToArtifactory, componentsToArtifactory2, componentsToArtifactory3 }; + // Act + + PackageUploadInformation.DisplayErrorForJfrogFoundPackages(JfrogNotFoundPackages); + + // Assert + Assert.That(JfrogNotFoundPackages.Count, Is.GreaterThanOrEqualTo(1)); + } + [Test] + [TestCase("NPM")] + [TestCase("NUGET")] + [TestCase("MAVEN")] + [TestCase("POETRY")] + [TestCase("CONAN")] + [TestCase("DEBIAN")] + public async Task JfrogNotFoundPackagesAsync_CoversAllScenarios(string compType) + { + // Arrange + var item = new ComponentsToArtifactory(); + item.ComponentType = compType; + var displayPackagesInfo = new DisplayPackagesInfo(); + displayPackagesInfo.JfrogNotFoundPackagesNpm = new List(); + displayPackagesInfo.JfrogNotFoundPackagesNuget = new List(); + displayPackagesInfo.JfrogNotFoundPackagesMaven = new List(); + displayPackagesInfo.JfrogNotFoundPackagesPython = new List(); + displayPackagesInfo.JfrogNotFoundPackagesConan = new List(); + displayPackagesInfo.JfrogNotFoundPackagesDebian = new List(); + + // Act + await PackageUploadInformation.JfrogNotFoundPackagesAsync(item, displayPackagesInfo); + + // Assert + if (item.ComponentType == "NPM") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesNpm.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesNpm[0], Is.Not.Null); + } + else if (item.ComponentType == "NUGET") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesNuget.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesNuget[0], Is.Not.Null); + } + else if (item.ComponentType == "MAVEN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesMaven.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesMaven[0], Is.Not.Null); + } + else if (item.ComponentType == "POETRY") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesPython.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesPython[0], Is.Not.Null); + } + else if (item.ComponentType == "CONAN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesConan.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesConan[0], Is.Not.Null); + } + else if (item.ComponentType == "DEBIAN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesDebian.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesDebian[0], Is.Not.Null); + } + } + + [Test] + [TestCase("NPM")] + [TestCase("NUGET")] + [TestCase("MAVEN")] + [TestCase("POETRY")] + [TestCase("CONAN")] + [TestCase("DEBIAN")] + public async Task JfrogFoundPackagesAsync_CoversAllScenarios(string compType) + { + // Arrange + var item = new ComponentsToArtifactory(); + item.ComponentType = compType; + var displayPackagesInfo = new DisplayPackagesInfo(); + displayPackagesInfo.JfrogFoundPackagesNpm = new List(); + displayPackagesInfo.JfrogFoundPackagesNuget = new List(); + displayPackagesInfo.JfrogFoundPackagesMaven = new List(); + displayPackagesInfo.JfrogFoundPackagesPython = new List(); + displayPackagesInfo.JfrogFoundPackagesConan = new List(); + displayPackagesInfo.JfrogFoundPackagesDebian = new List(); + var operationType = "operationType"; + var responseMessage = new HttpResponseMessage(); + var dryRunSuffix = "dryRunSuffix"; + + // Act + await PackageUploadInformation.JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); + + // Assert + if (item.ComponentType == "NPM") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesNpm.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesNpm[0], Is.Not.Null); + } + else if (item.ComponentType == "NUGET") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesNuget.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesNuget[0], Is.Not.Null); + } + else if (item.ComponentType == "MAVEN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesMaven.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesMaven[0], Is.Not.Null); + } + else if (item.ComponentType == "POETRY") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesPython.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesPython[0], Is.Not.Null); + } + else if (item.ComponentType == "CONAN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesConan.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesConan[0], Is.Not.Null); + } + else if (item.ComponentType == "DEBIAN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesDebian.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesDebian[0], Is.Not.Null); + } + } + + [Test] + public void GetNotApprovedDebianPackages_CoversAllScenarios() + { + // Arrange + var unknownPackages = new List + { + new ComponentsToArtifactory { Name = "Package1", Version = "1.0.0" }, + new ComponentsToArtifactory { Name = "Package2", Version = "2.0.0" } + }; + var projectResponse = new ProjectResponse(); + var fileOperationsMock = new Mock(); + var filepath = ".."; + var filename = "\\testFileName.json"; + + // Act + PackageUploadInformation.GetNotApprovedDebianPackages(unknownPackages, projectResponse, fileOperationsMock.Object, filepath, filename); + + // Assert + // Add your assertions here + Assert.That(unknownPackages.Count, Is.EqualTo(2)); + } + } +} diff --git a/src/ArtifactoryUploader/ArtifactoryUploader.cs b/src/ArtifactoryUploader/ArtifactoryUploader.cs index 71562302..e31a4c1f 100644 --- a/src/ArtifactoryUploader/ArtifactoryUploader.cs +++ b/src/ArtifactoryUploader/ArtifactoryUploader.cs @@ -62,7 +62,7 @@ public static async Task UploadPackageToRepo(ComponentsToAr return responsemessage; } - await PackageUploadHelper.JfrogFoundPackagesAsync(component, displayPackagesInfo, operationType, responsemessage, dryRunSuffix); + await PackageUploadInformation.JfrogFoundPackagesAsync(component, displayPackagesInfo, operationType, responsemessage, dryRunSuffix); } catch (HttpRequestException ex) diff --git a/src/ArtifactoryUploader/PackageUploadHelper.cs b/src/ArtifactoryUploader/PackageUploadHelper.cs index 8c1cb786..7a4848ab 100644 --- a/src/ArtifactoryUploader/PackageUploadHelper.cs +++ b/src/ArtifactoryUploader/PackageUploadHelper.cs @@ -13,7 +13,6 @@ using LCT.ArtifactoryUploader.Model; using LCT.Common; using LCT.Common.Constants; -using LCT.Common.Interface; using LCT.Services.Interface; using log4net; using Newtonsoft.Json; @@ -25,7 +24,6 @@ using System.Net.Http; using System.Reflection; using System.Threading.Tasks; -using Directory = System.IO.Directory; namespace LCT.ArtifactoryUploader { @@ -114,769 +112,113 @@ public async static Task> GetComponentsToBeUploade { PackageUploader.uploaderKpiData.ComponentNotApproved++; PackageUploader.uploaderKpiData.PackagesNotUploadedToJfrog++; - await AddUnknownPackagesAsync(item, displayPackagesInfo); + await PackageUploadInformation.AddUnknownPackagesAsync(item, displayPackagesInfo); } } Logger.Debug("Ending GetComponentsToBeUploadedToArtifactory() method"); return componentsToBeUploaded; } - public static DisplayPackagesInfo GetComponentsToBePackages() - { - DisplayPackagesInfo displayPackagesInfo = new DisplayPackagesInfo(); - displayPackagesInfo.UnknownPackagesNpm = new List(); - displayPackagesInfo.UnknownPackagesNuget = new List(); - displayPackagesInfo.UnknownPackagesMaven = new List(); - displayPackagesInfo.UnknownPackagesConan = new List(); - displayPackagesInfo.UnknownPackagesPython = new List(); - displayPackagesInfo.UnknownPackagesDebian = new List(); - displayPackagesInfo.JfrogNotFoundPackagesNpm = new List(); - displayPackagesInfo.JfrogNotFoundPackagesNuget = new List(); - displayPackagesInfo.JfrogNotFoundPackagesPython = new List(); - displayPackagesInfo.JfrogNotFoundPackagesMaven = new List(); - displayPackagesInfo.JfrogNotFoundPackagesConan = new List(); - displayPackagesInfo.JfrogNotFoundPackagesDebian = new List(); - displayPackagesInfo.JfrogFoundPackagesNpm = new List(); - displayPackagesInfo.JfrogFoundPackagesNuget = new List(); - displayPackagesInfo.JfrogFoundPackagesPython = new List(); - displayPackagesInfo.JfrogFoundPackagesMaven = new List(); - displayPackagesInfo.JfrogFoundPackagesConan = new List(); - displayPackagesInfo.JfrogFoundPackagesDebian = new List(); - displayPackagesInfo.SuccessfullPackagesNpm = new List(); - displayPackagesInfo.SuccessfullPackagesNuget = new List(); - displayPackagesInfo.SuccessfullPackagesPython = new List(); - displayPackagesInfo.SuccessfullPackagesMaven = new List(); - displayPackagesInfo.SuccessfullPackagesConan = new List(); - displayPackagesInfo.SuccessfullPackagesDebian = new List(); - - - return displayPackagesInfo; - - } - - private static void DisplaySortedForeachComponents(List unknownPackages, List JfrogNotFoundPackages, List SucessfullPackages, List JfrogFoundPackages, string name, string filename) - { - if (unknownPackages.Any() || JfrogNotFoundPackages.Any() || SucessfullPackages.Any() || JfrogFoundPackages.Any()) - { - Logger.Info("\n" + name + ":\n"); - DisplayErrorForUnknownPackages(unknownPackages, name, filename); - DisplayErrorForJfrogFoundPackages(JfrogFoundPackages); - DisplayErrorForJfrogPackages(JfrogNotFoundPackages); - DisplayErrorForSucessfullPackages(SucessfullPackages); - } - - } - - public static void DisplayErrorForJfrogFoundPackages(List JfrogFoundPackages) - { - - if (JfrogFoundPackages.Any()) - { - - foreach (var jfrogFoundPackage in JfrogFoundPackages) - { - - if (jfrogFoundPackage.ResponseMessage.ReasonPhrase == ApiConstant.ErrorInUpload) - { - Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} {jfrogFoundPackage.OperationType} Failed!! {jfrogFoundPackage.SrcRepoName} ---> {jfrogFoundPackage.DestRepoName}"); - } - else if (jfrogFoundPackage.ResponseMessage.ReasonPhrase == ApiConstant.PackageNotFound) - { - Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} not found in {jfrogFoundPackage.SrcRepoName}, Upload Failed!!"); - } - else - { - Logger.Info($"Successful{jfrogFoundPackage.DryRunSuffix} {jfrogFoundPackage.OperationType} package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version}" + - $" from {jfrogFoundPackage.SrcRepoName} to {jfrogFoundPackage.DestRepoName}"); - } - - } - Logger.Info("\n"); - - } - } - - public static void DisplayErrorForJfrogPackages(List JfrogNotFoundPackages) - { - - if (JfrogNotFoundPackages.Any()) - { - - foreach (var jfrogNotFoundPackage in JfrogNotFoundPackages) - { - Logger.Warn($"Package {jfrogNotFoundPackage.Name}-{jfrogNotFoundPackage.Version} is not found in jfrog"); - - } - Logger.Info("\n"); - - } - } - - private static void DisplayErrorForUnknownPackages(List unknownPackages, string name, string filepath) - { - ProjectResponse projectResponse = new ProjectResponse(); - IFileOperations fileOperations = new FileOperations(); - var filename = Path.Combine(filepath, $"Artifactory_{FileConstant.artifactoryReportNotApproved}"); - if (unknownPackages.Any()) - { - if (name.Equals("Npm")) - { - GetNotApprovedNpmPackages(unknownPackages, projectResponse, fileOperations, filepath, filename); - } - else if (name.Equals("Nuget")) - { - GetNotApprovedNugetPackages(unknownPackages, projectResponse, fileOperations, filepath, filename); - } - else if (name.Equals("Conan")) - { - GetNotApprovedConanPackages(unknownPackages, projectResponse, fileOperations, filepath, filename); - } - else if (name.Equals("Debian")) - { - GetNotApprovedDebianPackages(unknownPackages, projectResponse, fileOperations, filepath, filename); - } - else if (name.Equals("Maven")) - { - GetNotApprovedMavenPackages(unknownPackages, projectResponse, fileOperations, filepath, filename); - } - else if (name.Equals("Poetry")) - { - GetNotApprovedPythonPackages(unknownPackages, projectResponse, fileOperations, filepath, filename); - } - } - } - - private static void GetNotApprovedNpmPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) - { - if (File.Exists(filename)) - { - string json = File.ReadAllText(filename); - ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); - List npmComponents = new List(); - foreach (var npmpackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = npmpackage.Name; - jsonComponents.Version = npmpackage.Version; - npmComponents.Add(jsonComponents); - } - myDeserializedClass.Npm = npmComponents; - fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - - } - else - { - projectResponse.Npm = new List(); - foreach (var npmpackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = npmpackage.Name; - jsonComponents.Version = npmpackage.Version; - projectResponse.Npm.Add(jsonComponents); - } - fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - } - Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); - - } - private static void GetNotApprovedNugetPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) - { - if (File.Exists(filename)) - { - string json = File.ReadAllText(filename); - ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); - List nugetComponents = new List(); - foreach (var nugetpackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = nugetpackage.Name; - jsonComponents.Version = nugetpackage.Version; - nugetComponents.Add(jsonComponents); - } - myDeserializedClass.Nuget = nugetComponents; - fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - } - else - { - projectResponse.Nuget = new List(); - foreach (var nugetpackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = nugetpackage.Name; - jsonComponents.Version = nugetpackage.Version; - projectResponse.Nuget.Add(jsonComponents); - } - fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - } - Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); - } - private static void GetNotApprovedConanPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) - { - if (File.Exists(filename)) - { - string json = File.ReadAllText(filename); - - ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); - List conanComponents = new List(); - foreach (var conanpackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = conanpackage.Name; - jsonComponents.Version = conanpackage.Version; - conanComponents.Add(jsonComponents); - } - myDeserializedClass.Conan = conanComponents; - fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - - - } - else - { - projectResponse.Conan = new List(); - foreach (var conanpackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = conanpackage.Name; - jsonComponents.Version = conanpackage.Version; - projectResponse.Conan.Add(jsonComponents); - } - fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - } - Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); - - } - private static void GetNotApprovedPythonPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) - { - if (File.Exists(filename)) - { - string json = File.ReadAllText(filename); - - ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); - List pythonComponents = new List(); - foreach (var pythonPackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = pythonPackage.Name; - jsonComponents.Version = pythonPackage.Version; - pythonComponents.Add(jsonComponents); - } - myDeserializedClass.Python = pythonComponents; - fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - - - } - else - { - projectResponse.Python = new List(); - foreach (var pythonPackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = pythonPackage.Name; - jsonComponents.Version = pythonPackage.Version; - projectResponse.Python.Add(jsonComponents); - } - fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - } - Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); - } - public static void GetNotApprovedDebianPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) - { - if (File.Exists(filename)) - { - string json = File.ReadAllText(filename); - - ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); - List debianComponents = new List(); - foreach (var debianPackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = debianPackage.Name; - jsonComponents.Version = debianPackage.Version; - debianComponents.Add(jsonComponents); - } - myDeserializedClass.Debian = debianComponents; - fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - - - } - else - { - projectResponse.Debian = new List(); - foreach (var debianPackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = debianPackage.Name; - jsonComponents.Version = debianPackage.Version; - projectResponse.Debian.Add(jsonComponents); - } - fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - } - Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); - } - private static void GetNotApprovedMavenPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) - { - if (File.Exists(filename)) - { - string json = File.ReadAllText(filename); - - ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); - List mavenComponents = new List(); - foreach (var mavenPackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = mavenPackage.Name; - jsonComponents.Version = mavenPackage.Version; - mavenComponents.Add(jsonComponents); - } - myDeserializedClass.Maven = mavenComponents; - fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - - - } - else - { - projectResponse.Maven = new List(); - foreach (var mavenPackage in unknownPackages) - { - JsonComponents jsonComponents = new JsonComponents(); - jsonComponents.Name = mavenPackage.Name; - jsonComponents.Version = mavenPackage.Version; - projectResponse.Maven.Add(jsonComponents); - } - fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - } - Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); - } - public static string GettPathForArtifactoryUpload() + private static PackageType GetPackageType(Component item) { - string localPathforartifactory = string.Empty; - try - { - String Todaysdate = DateTime.Now.ToString("dd-MM-yyyy_ss"); - localPathforartifactory = $"{Directory.GetParent(Directory.GetCurrentDirectory())}\\ClearingTool\\ArtifactoryFiles\\{Todaysdate}\\"; - if (!Directory.Exists(localPathforartifactory)) - { - localPathforartifactory = Directory.CreateDirectory(localPathforartifactory).ToString(); - } - } - catch (IOException ex) - { - Logger.Error($"GettPathForArtifactoryUpload() ", ex); - } - catch (UnauthorizedAccessException ex) - { - Logger.Error($"GettPathForArtifactoryUpload() ", ex); - } + string GetPropertyValue(string propertyName) => + item.Properties + .Find(p => p.Name == propertyName)? + .Value? + .ToUpperInvariant(); - return localPathforartifactory; - } - private static void DisplayErrorForSucessfullPackages(List SucessfullPackages) - { + var propertyChecks = new Dictionary + { + { Dataconstant.Cdx_ClearingState, PackageType.ClearedThirdParty }, + { Dataconstant.Cdx_IsInternal, PackageType.Internal }, + { Dataconstant.Cdx_IsDevelopment, PackageType.Development } + }; - if (SucessfullPackages.Any()) + foreach (var check in propertyChecks) { - - foreach (var sucessfullPackage in SucessfullPackages) + if (GetPropertyValue(check.Key) == "TRUE" || (check.Key == Dataconstant.Cdx_ClearingState && GetPropertyValue(check.Key) == "APPROVED")) { - Logger.Info($"Package {sucessfullPackage.Name}-{sucessfullPackage.Version} is already uploaded"); + return check.Value; } - Logger.Info("\n"); - - } - } - public static void DisplayPackageUploadInformation(DisplayPackagesInfo displayPackagesInfo) - { - string localPathforartifactory = GettPathForArtifactoryUpload(); - - DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesNpm, displayPackagesInfo.JfrogNotFoundPackagesNpm, displayPackagesInfo.SuccessfullPackagesNpm, displayPackagesInfo.JfrogFoundPackagesNpm, "Npm", localPathforartifactory); - DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesNuget, displayPackagesInfo.JfrogNotFoundPackagesNuget, displayPackagesInfo.SuccessfullPackagesNuget, displayPackagesInfo.JfrogFoundPackagesNuget, "Nuget", localPathforartifactory); - DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesMaven, displayPackagesInfo.JfrogNotFoundPackagesMaven, displayPackagesInfo.SuccessfullPackagesMaven, displayPackagesInfo.JfrogFoundPackagesMaven, "Maven", localPathforartifactory); - DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesConan, displayPackagesInfo.JfrogNotFoundPackagesConan, displayPackagesInfo.SuccessfullPackagesConan, displayPackagesInfo.JfrogFoundPackagesConan, "Conan", localPathforartifactory); - DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesPython, displayPackagesInfo.JfrogNotFoundPackagesPython, displayPackagesInfo.SuccessfullPackagesPython, displayPackagesInfo.JfrogFoundPackagesPython, "Poetry", localPathforartifactory); - DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesDebian, displayPackagesInfo.JfrogNotFoundPackagesDebian, displayPackagesInfo.SuccessfullPackagesDebian, displayPackagesInfo.JfrogFoundPackagesDebian, "Debian", localPathforartifactory); - - } - - private static Task GetUnknownPackageinfo(Component item) - { - - ComponentsToArtifactory components = new ComponentsToArtifactory() - { - Name = item.Name, - Version = item.Version - }; - return Task.FromResult(components); - - } - - private static Task GetPackageinfo(ComponentsToArtifactory item, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) - { - - ComponentsToArtifactory components = new ComponentsToArtifactory() - { - Name = item.Name, - Version = item.Version, - SrcRepoName = item.SrcRepoName, - DestRepoName = item.DestRepoName, - OperationType = operationType, - ResponseMessage = responseMessage, - DryRunSuffix = dryRunSuffix, - ComponentType = item.ComponentType, - Purl = item.Purl, - Token = item.Token, - CopyPackageApiUrl = item.CopyPackageApiUrl, - PackageName = item.PackageName, - PackageType = item.PackageType, - - }; - return Task.FromResult(components); - - } - private static Task GetSucessFulPackageinfo(ComponentsToArtifactory item) - { - - ComponentsToArtifactory components = new ComponentsToArtifactory() - { - Name = item.Name, - Version = item.Version, - SrcRepoName = item.SrcRepoName, - DestRepoName = item.DestRepoName, - SrcRepoPathWithFullName = item.SrcRepoPathWithFullName, - Path = item.Path, - PackageType = item.PackageType, - Purl = item.Purl, - - }; - return Task.FromResult(components); - - } - - private static async Task AddUnknownPackagesAsync(Component item, DisplayPackagesInfo displayPackagesInfo) - { - string GetPropertyValue(string propertyName) => - item.Properties - .Find(p => p.Name == propertyName)? - .Value? - .ToUpperInvariant(); - - if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "NPM") - { - - ComponentsToArtifactory components = await GetUnknownPackageinfo(item); - displayPackagesInfo.UnknownPackagesNpm.Add(components); - } - else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "NUGET") - { - ComponentsToArtifactory components = await GetUnknownPackageinfo(item); - displayPackagesInfo.UnknownPackagesNuget.Add(components); - } - else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "MAVEN") - { - ComponentsToArtifactory components = await GetUnknownPackageinfo(item); - displayPackagesInfo.UnknownPackagesMaven.Add(components); - } - else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "POETRY") - { - ComponentsToArtifactory components = await GetUnknownPackageinfo(item); - displayPackagesInfo.UnknownPackagesPython.Add(components); - } - else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "CONAN") - { - ComponentsToArtifactory components = await GetUnknownPackageinfo(item); - displayPackagesInfo.UnknownPackagesConan.Add(components); - } - else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "DEBIAN") - { - ComponentsToArtifactory components = await GetUnknownPackageinfo(item); - displayPackagesInfo.UnknownPackagesDebian.Add(components); - } - - } - - public static async Task JfrogNotFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) - { - - if (item.ComponentType == "NPM") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.JfrogNotFoundPackagesNpm.Add(components); - } - else if (item.ComponentType == "NUGET") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.JfrogNotFoundPackagesNuget.Add(components); - } - else if (item.ComponentType == "MAVEN") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.JfrogNotFoundPackagesMaven.Add(components); - } - else if (item.ComponentType == "POETRY") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.JfrogNotFoundPackagesPython.Add(components); - } - else if (item.ComponentType == "CONAN") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.JfrogNotFoundPackagesConan.Add(components); - } - else if (item.ComponentType == "DEBIAN") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.JfrogNotFoundPackagesDebian.Add(components); - } - - } - - public static async Task JfrogFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) - { - - if (item.ComponentType == "NPM") - { - ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); - displayPackagesInfo.JfrogFoundPackagesNpm.Add(components); - } - else if (item.ComponentType == "NUGET") - { - ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); - displayPackagesInfo.JfrogFoundPackagesNuget.Add(components); - } - else if (item.ComponentType == "MAVEN") - { - ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); - displayPackagesInfo.JfrogFoundPackagesMaven.Add(components); - } - else if (item.ComponentType == "POETRY") - { - ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); - displayPackagesInfo.JfrogFoundPackagesPython.Add(components); - } - else if (item.ComponentType == "CONAN") - { - ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); - displayPackagesInfo.JfrogFoundPackagesConan.Add(components); - } - else if (item.ComponentType == "DEBIAN") - { - ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); - displayPackagesInfo.JfrogFoundPackagesDebian.Add(components); - } - - } - private static async Task SucessfullPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) - { - if (item.ComponentType == "NPM") - { - - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.SuccessfullPackagesNpm.Add(components); - } - else if (item.ComponentType == "NUGET") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.SuccessfullPackagesNuget.Add(components); - } - else if (item.ComponentType == "MAVEN") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.SuccessfullPackagesMaven.Add(components); - } - else if (item.ComponentType == "POETRY") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.SuccessfullPackagesPython.Add(components); - } - else if (item.ComponentType == "CONAN") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.SuccessfullPackagesConan.Add(components); - } - else if (item.ComponentType == "DEBIAN") - { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - displayPackagesInfo.SuccessfullPackagesDebian.Add(components); - } - - } - - - private static PackageType GetPackageType(Component item) - { - string GetPropertyValue(string propertyName) => - item.Properties - .Find(p => p.Name == propertyName)? - .Value? - .ToUpperInvariant(); - - if (GetPropertyValue(Dataconstant.Cdx_ClearingState) == "APPROVED") - { - return PackageType.ClearedThirdParty; - } - else if (GetPropertyValue(Dataconstant.Cdx_IsInternal) == "TRUE") - { - return PackageType.Internal; - } - else if (GetPropertyValue(Dataconstant.Cdx_IsDevelopment) == "TRUE") - { - return PackageType.Development; } return PackageType.Unknown; } - public static string GetCopyURL(ComponentsToArtifactory component) { - string url = string.Empty; - if (component.ComponentType == "NPM") + string url = component.ComponentType switch { - url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoPathWithFullName}" + - $"?to=/{component.DestRepoName}/{component.Path}/{component.PypiOrNpmCompName}"; + "NPM" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoPathWithFullName}?to=/{component.DestRepoName}/{component.Path}/{component.PypiOrNpmCompName}", + "NUGET" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.PackageName}.{component.Version}{ApiConstant.NugetExtension}?to=/{component.DestRepoName}/{component.Name}.{component.Version}{ApiConstant.NugetExtension}", + "MAVEN" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Name}/{component.Version}?to=/{component.DestRepoName}/{component.Name}/{component.Version}", + "POETRY" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoPathWithFullName}?to=/{component.DestRepoName}/{component.PypiOrNpmCompName}", + "CONAN" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Path}?to=/{component.DestRepoName}/{component.Path}", + "DEBIAN" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*?to=/{component.DestRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*", + _ => string.Empty + }; - } - else if (component.ComponentType == "NUGET") - { - url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.PackageName}.{component.Version}" + - $"{ApiConstant.NugetExtension}?to=/{component.DestRepoName}/{component.Name}.{component.Version}{ApiConstant.NugetExtension}"; - } - else if (component.ComponentType == "MAVEN") - { - url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Name}/{component.Version}" + - $"?to=/{component.DestRepoName}/{component.Name}/{component.Version}"; - } - else if (component.ComponentType == "POETRY") - { - url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoPathWithFullName}" + - $"?to=/{component.DestRepoName}/{component.PypiOrNpmCompName}"; - } - else if (component.ComponentType == "CONAN") + if (component.ComponentType == "CONAN") { - url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Path}" + - $"?to=/{component.DestRepoName}/{component.Path}"; - // Add a wild card to the path end for jFrog AQL query search component.Path = $"{component.Path}/*"; } - else if (component.ComponentType == "DEBIAN") - { - url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*" + - $"?to=/{component.DestRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*"; - } - else - { - // Do nothing - } + return component.DryRun ? $"{url}&dry=1" : url; } public static string GetMoveURL(ComponentsToArtifactory component) { - string url = string.Empty; - if (component.ComponentType == "NPM") + string url = component.ComponentType switch { - url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoPathWithFullName}" + - $"?to=/{component.DestRepoName}/{component.Path}/{component.PypiOrNpmCompName}"; + "NPM" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoPathWithFullName}?to=/{component.DestRepoName}/{component.Path}/{component.PypiOrNpmCompName}", + "NUGET" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.PackageName}.{component.Version}{ApiConstant.NugetExtension}?to=/{component.DestRepoName}/{component.Name}.{component.Version}{ApiConstant.NugetExtension}", + "MAVEN" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Name}/{component.Version}?to=/{component.DestRepoName}/{component.Name}/{component.Version}", + "POETRY" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoPathWithFullName}?to=/{component.DestRepoName}/{component.PypiOrNpmCompName}", + "CONAN" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Path}?to=/{component.DestRepoName}/{component.Path}", + "DEBIAN" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*?to=/{component.DestRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*", + _ => string.Empty + }; - } - else if (component.ComponentType == "NUGET") - { - url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.PackageName}.{component.Version}" + - $"{ApiConstant.NugetExtension}?to=/{component.DestRepoName}/{component.Name}.{component.Version}{ApiConstant.NugetExtension}"; - } - else if (component.ComponentType == "MAVEN") - { - url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Name}/{component.Version}" + - $"?to=/{component.DestRepoName}/{component.Name}/{component.Version}"; - } - else if (component.ComponentType == "POETRY") - { - url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoPathWithFullName}" + - $"?to=/{component.DestRepoName}/{component.PypiOrNpmCompName}"; - } - else if (component.ComponentType == "CONAN") + if (component.ComponentType == "CONAN") { - url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Path}" + - $"?to=/{component.DestRepoName}/{component.Path}"; - // Add a wild card to the path end for jFrog AQL query search component.Path = $"{component.Path}/*"; } - else if (component.ComponentType == "DEBIAN") - { - url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*" + - $"?to=/{component.DestRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*"; - } - else - { - // Do nothing - } + return component.DryRun ? $"{url}&dry=1" : url; } private static string GetPackagePath(ComponentsToArtifactory component, AqlResult aqlResult) { - switch (component.ComponentType) + return component.ComponentType switch { - case "NPM": - if (aqlResult != null) - { - return $"{aqlResult.Path}"; - } - else - { - return $"{component.Name}/-"; - } - - case "CONAN" when aqlResult != null: - string path = aqlResult.Path; - string package = $"{component.Name}/{component.Version}"; - - if (path.Contains(package)) - { - int index = path.IndexOf(package); - return path.Substring(0, index + package.Length); - } - else - { - return path; - } - - case "MAVEN": - return $"{component.Name}/{component.Version}"; - - case "DEBIAN": - return $"pool/main/{component.Name[0]}/{component.Name}"; - default: - return string.Empty; - } + "NPM" => aqlResult != null ? aqlResult.Path : $"{component.Name}/-", + "CONAN" when aqlResult != null => GetConanPackagePath(aqlResult.Path, component.Name, component.Version), + "MAVEN" => $"{component.Name}/{component.Version}", + "DEBIAN" => $"pool/main/{component.Name[0]}/{component.Name}", + _ => string.Empty + }; } - private static string GetJfrogPackageName(ComponentsToArtifactory component) + private static string GetConanPackagePath(string path, string name, string version) { - string packageName; - - switch (component.ComponentType) + string package = $"{name}/{version}"; + if (path.Contains(package)) { - case "NPM": - packageName = component.PypiOrNpmCompName; - break; - - case "NUGET": - packageName = $"{component.PackageName}.{component.Version}{ApiConstant.NugetExtension}"; - break; - - case "DEBIAN": - packageName = $"{component.PackageName}_{component.Version.Replace(ApiConstant.DebianExtension, "") + "*"}"; - break; - - case "POETRY": - packageName = component.PypiOrNpmCompName; - break; - - default: - packageName = string.Empty; - break; + int index = path.IndexOf(package); + return path.Substring(0, index + package.Length); } + return path; + } + private static string GetJfrogPackageName(ComponentsToArtifactory component) + { + var packageNameFormats = new Dictionary> + { + { "NPM", c => c.PypiOrNpmCompName }, + { "NUGET", c => $"{c.PackageName}.{c.Version}{ApiConstant.NugetExtension}" }, + { "DEBIAN", c => $"{c.PackageName}_{c.Version.Replace(ApiConstant.DebianExtension, "") + "*"}" }, + { "POETRY", c => c.PypiOrNpmCompName } + }; - return packageName; + return packageNameFormats.TryGetValue(component.ComponentType, out var formatFunc) ? formatFunc(component) : string.Empty; } private static string GetDestinationRepo(Component item, CommonAppSettings appSettings) @@ -884,26 +226,22 @@ private static string GetDestinationRepo(Component item, CommonAppSettings appSe var packageType = GetPackageType(item); var componentType = GetComponentType(item); - if (!string.IsNullOrEmpty(componentType)) + if (string.IsNullOrEmpty(componentType)) { - switch (componentType.ToLower()) - { - case "npm": - return GetRepoName(packageType, appSettings.Npm.ReleaseRepo, appSettings.Npm.DevDepRepo, appSettings.Npm.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); - case "nuget": - return GetRepoName(packageType, appSettings.Nuget.ReleaseRepo, appSettings.Nuget.DevDepRepo, appSettings.Nuget.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); - case "maven": - return GetRepoName(packageType, appSettings.Maven.ReleaseRepo, appSettings.Maven.DevDepRepo, appSettings.Maven.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); - case "poetry": - return GetRepoName(packageType, appSettings.Poetry.ReleaseRepo, appSettings.Poetry.DevDepRepo, appSettings.Poetry.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); - case "conan": - return GetRepoName(packageType, appSettings.Conan.ReleaseRepo, appSettings.Conan.DevDepRepo, appSettings.Conan.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); - case "debian": - return GetRepoName(packageType, appSettings.Debian.ReleaseRepo, appSettings.Debian.DevDepRepo, appSettings.Debian.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); - } + return string.Empty; } - return string.Empty; + var repoMappings = new Dictionary>(StringComparer.OrdinalIgnoreCase) + { + { "npm", () => GetRepoName(packageType, appSettings.Npm.ReleaseRepo, appSettings.Npm.DevDepRepo, appSettings.Npm.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, + { "nuget", () => GetRepoName(packageType, appSettings.Nuget.ReleaseRepo, appSettings.Nuget.DevDepRepo, appSettings.Nuget.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, + { "maven", () => GetRepoName(packageType, appSettings.Maven.ReleaseRepo, appSettings.Maven.DevDepRepo, appSettings.Maven.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, + { "poetry", () => GetRepoName(packageType, appSettings.Poetry.ReleaseRepo, appSettings.Poetry.DevDepRepo, appSettings.Poetry.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, + { "conan", () => GetRepoName(packageType, appSettings.Conan.ReleaseRepo, appSettings.Conan.DevDepRepo, appSettings.Conan.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, + { "debian", () => GetRepoName(packageType, appSettings.Debian.ReleaseRepo, appSettings.Debian.DevDepRepo, appSettings.Debian.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) } + }; + + return repoMappings.TryGetValue(componentType, out var getRepoName) ? getRepoName() : string.Empty; } private static string GetRepoName(PackageType packageType, string internalRepo, string developmentRepo, string clearedThirdPartyRepo) @@ -923,35 +261,24 @@ private static string GetRepoName(PackageType packageType, string internalRepo, private static string GetComponentType(Component item) { + var componentTypeMappings = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "npm", "NPM" }, + { "nuget", "NUGET" }, + { "maven", "MAVEN" }, + { "pypi", "POETRY" }, + { "conan", "CONAN" }, + { "pkg:deb/debian", "DEBIAN" } + }; - if (item.Purl.Contains("npm", StringComparison.OrdinalIgnoreCase)) - { - return "NPM"; - } - else if (item.Purl.Contains("nuget", StringComparison.OrdinalIgnoreCase)) - { - return "NUGET"; - } - else if (item.Purl.Contains("maven", StringComparison.OrdinalIgnoreCase)) - { - return "MAVEN"; - } - else if (item.Purl.Contains("pypi", StringComparison.OrdinalIgnoreCase)) - { - return "POETRY"; - } - else if (item.Purl.Contains("conan", StringComparison.OrdinalIgnoreCase)) + foreach (var mapping in componentTypeMappings) { - return "CONAN"; - } - else if (item.Purl.Contains("pkg:deb/debian", StringComparison.OrdinalIgnoreCase)) - { - return "DEBIAN"; - } - else - { - // Do nothing + if (item.Purl.Contains(mapping.Key, StringComparison.OrdinalIgnoreCase)) + { + return mapping.Value; + } } + return string.Empty; } @@ -1025,13 +352,13 @@ private static async Task PackageUploadToArtifactory(UploaderKpiData uploaderKpi { uploaderKpiData.PackagesNotExistingInRemoteCache++; item.DestRepoName = null; - await JfrogNotFoundPackagesAsync(item, displayPackagesInfo); + await PackageUploadInformation.JfrogNotFoundPackagesAsync(item, displayPackagesInfo); } } else { IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, true); - await SucessfullPackagesAsync(item, displayPackagesInfo); + await PackageUploadInformation.SucessfullPackagesAsync(item, displayPackagesInfo); item.DestRepoName = null; } } @@ -1050,14 +377,14 @@ private static async Task SourceRepoFoundToUploadArtifactory(PackageType package } else if (responseMessage.ReasonPhrase == ApiConstant.PackageNotFound) { - await JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); + await PackageUploadInformation.JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, false); item.DestRepoName = null; SetWarningCode = true; } else if (responseMessage.ReasonPhrase == ApiConstant.ErrorInUpload) { - await JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); + await PackageUploadInformation.JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, false); item.DestRepoName = null; var responseContent = await responseMessage.Content.ReadAsStringAsync(); @@ -1350,33 +677,17 @@ private static string GetJfrogRepoPath(AqlResult aqlResult) public static string GetPackageNameExtensionBasedOnComponentType(ComponentsToArtifactory package) { - string packageNameEXtension = string.Empty; - if (package.ComponentType.Equals("NPM", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".tgz"; - } - if (package.ComponentType.Equals("NUGET", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".nupkg"; - } - if (package.ComponentType.Equals("MAVEN", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".jar"; - } - if (package.ComponentType.Equals("DEBIAN", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".deb"; - } - if (package.ComponentType.Equals("POETRY", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".whl"; - } - if (package.ComponentType.Equals("CONAN", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = "package.tgz"; - } + var packageExtensions = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "NPM", ".tgz" }, + { "NUGET", ".nupkg" }, + { "MAVEN", ".jar" }, + { "DEBIAN", ".deb" }, + { "POETRY", ".whl" }, + { "CONAN", "package.tgz" } + }; - return packageNameEXtension; + return packageExtensions.TryGetValue(package.ComponentType, out var extension) ? extension : string.Empty; } public static async Task> GetJfrogRepoInfoForAllTypePackages(List destRepoNames) @@ -1397,51 +708,24 @@ public static List GetUploadePackageDetails(DisplayPack { List uploadedPackages = new List(); - foreach (var item in displayPackagesInfo.JfrogFoundPackagesConan) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesMaven) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesNpm) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesNuget) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesPython) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } + var allPackages = new List> + { + displayPackagesInfo.JfrogFoundPackagesConan, + displayPackagesInfo.JfrogFoundPackagesMaven, + displayPackagesInfo.JfrogFoundPackagesNpm, + displayPackagesInfo.JfrogFoundPackagesNuget, + displayPackagesInfo.JfrogFoundPackagesPython, + displayPackagesInfo.JfrogFoundPackagesDebian + }; - foreach (var item in displayPackagesInfo.JfrogFoundPackagesDebian) + foreach (var packageList in allPackages) { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + foreach (var item in packageList) { - uploadedPackages.Add(item); + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } } } diff --git a/src/ArtifactoryUploader/PackageUploadInformation.cs b/src/ArtifactoryUploader/PackageUploadInformation.cs new file mode 100644 index 00000000..d10aa3d7 --- /dev/null +++ b/src/ArtifactoryUploader/PackageUploadInformation.cs @@ -0,0 +1,401 @@ +using CycloneDX.Models; +using LCT.APICommunications; +using LCT.APICommunications.Model; +using LCT.ArtifactoryUploader.Model; +using LCT.Common; +using LCT.Common.Constants; +using LCT.Common.Interface; +using log4net; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Reflection; +using System.Threading.Tasks; +using Directory = System.IO.Directory; + +namespace LCT.ArtifactoryUploader +{ + public static class PackageUploadInformation + { + static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public static DisplayPackagesInfo GetComponentsToBePackages() + { + DisplayPackagesInfo displayPackagesInfo = new DisplayPackagesInfo(); + displayPackagesInfo.UnknownPackagesNpm = new List(); + displayPackagesInfo.UnknownPackagesNuget = new List(); + displayPackagesInfo.UnknownPackagesMaven = new List(); + displayPackagesInfo.UnknownPackagesConan = new List(); + displayPackagesInfo.UnknownPackagesPython = new List(); + displayPackagesInfo.UnknownPackagesDebian = new List(); + displayPackagesInfo.JfrogNotFoundPackagesNpm = new List(); + displayPackagesInfo.JfrogNotFoundPackagesNuget = new List(); + displayPackagesInfo.JfrogNotFoundPackagesPython = new List(); + displayPackagesInfo.JfrogNotFoundPackagesMaven = new List(); + displayPackagesInfo.JfrogNotFoundPackagesConan = new List(); + displayPackagesInfo.JfrogNotFoundPackagesDebian = new List(); + displayPackagesInfo.JfrogFoundPackagesNpm = new List(); + displayPackagesInfo.JfrogFoundPackagesNuget = new List(); + displayPackagesInfo.JfrogFoundPackagesPython = new List(); + displayPackagesInfo.JfrogFoundPackagesMaven = new List(); + displayPackagesInfo.JfrogFoundPackagesConan = new List(); + displayPackagesInfo.JfrogFoundPackagesDebian = new List(); + displayPackagesInfo.SuccessfullPackagesNpm = new List(); + displayPackagesInfo.SuccessfullPackagesNuget = new List(); + displayPackagesInfo.SuccessfullPackagesPython = new List(); + displayPackagesInfo.SuccessfullPackagesMaven = new List(); + displayPackagesInfo.SuccessfullPackagesConan = new List(); + displayPackagesInfo.SuccessfullPackagesDebian = new List(); + + + return displayPackagesInfo; + + } + public static void DisplayPackageUploadInformation(DisplayPackagesInfo displayPackagesInfo) + { + string localPathforartifactory = GettPathForArtifactoryUpload(); + + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesNpm, displayPackagesInfo.JfrogNotFoundPackagesNpm, displayPackagesInfo.SuccessfullPackagesNpm, displayPackagesInfo.JfrogFoundPackagesNpm, "Npm", localPathforartifactory); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesNuget, displayPackagesInfo.JfrogNotFoundPackagesNuget, displayPackagesInfo.SuccessfullPackagesNuget, displayPackagesInfo.JfrogFoundPackagesNuget, "Nuget", localPathforartifactory); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesMaven, displayPackagesInfo.JfrogNotFoundPackagesMaven, displayPackagesInfo.SuccessfullPackagesMaven, displayPackagesInfo.JfrogFoundPackagesMaven, "Maven", localPathforartifactory); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesConan, displayPackagesInfo.JfrogNotFoundPackagesConan, displayPackagesInfo.SuccessfullPackagesConan, displayPackagesInfo.JfrogFoundPackagesConan, "Conan", localPathforartifactory); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesPython, displayPackagesInfo.JfrogNotFoundPackagesPython, displayPackagesInfo.SuccessfullPackagesPython, displayPackagesInfo.JfrogFoundPackagesPython, "Poetry", localPathforartifactory); + DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesDebian, displayPackagesInfo.JfrogNotFoundPackagesDebian, displayPackagesInfo.SuccessfullPackagesDebian, displayPackagesInfo.JfrogFoundPackagesDebian, "Debian", localPathforartifactory); + + } + public static string GettPathForArtifactoryUpload() + { + string localPathforartifactory = string.Empty; + try + { + String Todaysdate = DateTime.Now.ToString("dd-MM-yyyy_ss"); + localPathforartifactory = $"{Directory.GetParent(Directory.GetCurrentDirectory())}\\ClearingTool\\ArtifactoryFiles\\{Todaysdate}\\"; + if (!Directory.Exists(localPathforartifactory)) + { + localPathforartifactory = Directory.CreateDirectory(localPathforartifactory).ToString(); + } + } + catch (IOException ex) + { + Logger.Error($"GettPathForArtifactoryUpload() ", ex); + } + catch (UnauthorizedAccessException ex) + { + Logger.Error($"GettPathForArtifactoryUpload() ", ex); + } + + return localPathforartifactory; + } + private static void DisplaySortedForeachComponents(List unknownPackages, List JfrogNotFoundPackages, List SucessfullPackages, List JfrogFoundPackages, string name, string filename) + { + if (unknownPackages.Any() || JfrogNotFoundPackages.Any() || SucessfullPackages.Any() || JfrogFoundPackages.Any()) + { + Logger.Info("\n" + name + ":\n"); + DisplayErrorForUnknownPackages(unknownPackages, name, filename); + DisplayErrorForJfrogFoundPackages(JfrogFoundPackages); + DisplayErrorForJfrogPackages(JfrogNotFoundPackages); + DisplayErrorForSucessfullPackages(SucessfullPackages); + } + + } + private static void DisplayErrorForUnknownPackages(List unknownPackages, string name, string filepath) + { + ProjectResponse projectResponse = new ProjectResponse(); + IFileOperations fileOperations = new FileOperations(); + var filename = Path.Combine(filepath, $"Artifactory_{FileConstant.artifactoryReportNotApproved}"); + + var packageHandlers = new Dictionary, ProjectResponse, IFileOperations, string, string>> + { + { "Npm", GetNotApprovedNpmPackages }, + { "Nuget", GetNotApprovedNugetPackages }, + { "Conan", GetNotApprovedConanPackages }, + { "Debian", GetNotApprovedDebianPackages }, + { "Maven", GetNotApprovedMavenPackages }, + { "Poetry", GetNotApprovedPythonPackages } + }; + + if (unknownPackages.Any() && packageHandlers.TryGetValue(name, out var handler)) + { + handler(unknownPackages, projectResponse, fileOperations, filepath, filename); + } + } + public static void DisplayErrorForJfrogFoundPackages(List jfrogFoundPackages) + { + if (jfrogFoundPackages.Any()) + { + foreach (var jfrogFoundPackage in jfrogFoundPackages) + { + switch (jfrogFoundPackage.ResponseMessage.ReasonPhrase) + { + case ApiConstant.ErrorInUpload: + Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} {jfrogFoundPackage.OperationType} Failed!! {jfrogFoundPackage.SrcRepoName} ---> {jfrogFoundPackage.DestRepoName}"); + break; + case ApiConstant.PackageNotFound: + Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} not found in {jfrogFoundPackage.SrcRepoName}, Upload Failed!!"); + break; + default: + Logger.Info($"Successful{jfrogFoundPackage.DryRunSuffix} {jfrogFoundPackage.OperationType} package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} from {jfrogFoundPackage.SrcRepoName} to {jfrogFoundPackage.DestRepoName}"); + break; + } + } + Logger.Info("\n"); + } + } + public static void DisplayErrorForJfrogPackages(List jfrogNotFoundPackages) + { + if (jfrogNotFoundPackages.Any()) + { + jfrogNotFoundPackages + .ForEach(pkg => Logger.Warn($"Package {pkg.Name}-{pkg.Version} is not found in jfrog")); + + Logger.Info("\n"); + } + } + private static void DisplayErrorForSucessfullPackages(List successfulPackages) + { + if (successfulPackages.Any()) + { + var packageMessages = successfulPackages + .Select(pkg => $"Package {pkg.Name}-{pkg.Version} is already uploaded") + .ToList(); + + packageMessages.ForEach(Logger.Info); + Logger.Info("\n"); + } + } + + + private static void GetNotApprovedPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, + string filepath, + string filename, + Func> getComponents, + Action> setComponents) + { + if (File.Exists(filename)) + { + string json = File.ReadAllText(filename); + ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); + List components = new List(); + foreach (var package in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents + { + Name = package.Name, + Version = package.Version + }; + components.Add(jsonComponents); + } + setComponents(myDeserializedClass, components); + fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + } + else + { + List components = new List(); + foreach (var package in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents + { + Name = package.Name, + Version = package.Version + }; + components.Add(jsonComponents); + } + setComponents(projectResponse, components); + fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + } + Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); + } + + private static void GetNotApprovedNpmPackages( + List unknownPackages, + ProjectResponse projectResponse, + IFileOperations fileOperations, + string filepath, + string filename) + { + GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Npm, (pr, components) => pr.Npm = components); + } + + private static void GetNotApprovedNugetPackages( + List unknownPackages, + ProjectResponse projectResponse, + IFileOperations fileOperations, + string filepath, + string filename) + { + GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Nuget, (pr, components) => pr.Nuget = components); + } + + private static void GetNotApprovedConanPackages( + List unknownPackages, + ProjectResponse projectResponse, + IFileOperations fileOperations, + string filepath, + string filename) + { + GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Conan, (pr, components) => pr.Conan = components); + } + + private static void GetNotApprovedPythonPackages( + List unknownPackages, + ProjectResponse projectResponse, + IFileOperations fileOperations, + string filepath, + string filename) + { + GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Python, (pr, components) => pr.Python = components); + } + + public static void GetNotApprovedDebianPackages( + List unknownPackages, + ProjectResponse projectResponse, + IFileOperations fileOperations, + string filepath, + string filename) + { + GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Debian, (pr, components) => pr.Debian = components); + } + + private static void GetNotApprovedMavenPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) + { + GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Maven, (pr, components) => pr.Maven = components); + } + public static async Task AddUnknownPackagesAsync(Component item, DisplayPackagesInfo displayPackagesInfo) + { + string GetPropertyValue(string propertyName) => + item.Properties + .Find(p => p.Name == propertyName)? + .Value? + .ToUpperInvariant(); + + var packageLists = new Dictionary> + { + { "NPM", components => displayPackagesInfo.UnknownPackagesNpm.Add(components) }, + { "NUGET", components => displayPackagesInfo.UnknownPackagesNuget.Add(components) }, + { "MAVEN", components => displayPackagesInfo.UnknownPackagesMaven.Add(components) }, + { "POETRY", components => displayPackagesInfo.UnknownPackagesPython.Add(components) }, + { "CONAN", components => displayPackagesInfo.UnknownPackagesConan.Add(components) }, + { "DEBIAN", components => displayPackagesInfo.UnknownPackagesDebian.Add(components) } + }; + + var projectType = GetPropertyValue(Dataconstant.Cdx_ProjectType); + if (packageLists.TryGetValue(projectType, out var addComponent)) + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + addComponent(components); + } + } + + public static async Task JfrogNotFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) + { + var packageLists = new Dictionary> + { + { "NPM", components => displayPackagesInfo.JfrogNotFoundPackagesNpm.Add(components) }, + { "NUGET", components => displayPackagesInfo.JfrogNotFoundPackagesNuget.Add(components) }, + { "MAVEN", components => displayPackagesInfo.JfrogNotFoundPackagesMaven.Add(components) }, + { "POETRY", components => displayPackagesInfo.JfrogNotFoundPackagesPython.Add(components) }, + { "CONAN", components => displayPackagesInfo.JfrogNotFoundPackagesConan.Add(components) }, + { "DEBIAN", components => displayPackagesInfo.JfrogNotFoundPackagesDebian.Add(components) } + }; + + if (packageLists.TryGetValue(item.ComponentType, out var addComponent)) + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + addComponent(components); + } + } + + public static async Task JfrogFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) + { + var packageLists = new Dictionary> + { + { "NPM", components => displayPackagesInfo.JfrogFoundPackagesNpm.Add(components) }, + { "NUGET", components => displayPackagesInfo.JfrogFoundPackagesNuget.Add(components) }, + { "MAVEN", components => displayPackagesInfo.JfrogFoundPackagesMaven.Add(components) }, + { "POETRY", components => displayPackagesInfo.JfrogFoundPackagesPython.Add(components) }, + { "CONAN", components => displayPackagesInfo.JfrogFoundPackagesConan.Add(components) }, + { "DEBIAN", components => displayPackagesInfo.JfrogFoundPackagesDebian.Add(components) } + }; + + if (packageLists.TryGetValue(item.ComponentType, out var addComponent)) + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + addComponent(components); + } + } + private static Task GetUnknownPackageinfo(Component item) + { + + ComponentsToArtifactory components = new ComponentsToArtifactory() + { + Name = item.Name, + Version = item.Version + }; + return Task.FromResult(components); + + } + + private static Task GetPackageinfo(ComponentsToArtifactory item, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) + { + + ComponentsToArtifactory components = new ComponentsToArtifactory() + { + Name = item.Name, + Version = item.Version, + SrcRepoName = item.SrcRepoName, + DestRepoName = item.DestRepoName, + OperationType = operationType, + ResponseMessage = responseMessage, + DryRunSuffix = dryRunSuffix, + ComponentType = item.ComponentType, + Purl = item.Purl, + Token = item.Token, + CopyPackageApiUrl = item.CopyPackageApiUrl, + PackageName = item.PackageName, + PackageType = item.PackageType, + + }; + return Task.FromResult(components); + + } + public static async Task SucessfullPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) + { + var successPackageLists = new Dictionary> + { + { "NPM", components => displayPackagesInfo.SuccessfullPackagesNpm.Add(components) }, + { "NUGET", components => displayPackagesInfo.SuccessfullPackagesNuget.Add(components) }, + { "MAVEN", components => displayPackagesInfo.SuccessfullPackagesMaven.Add(components) }, + { "POETRY", components => displayPackagesInfo.SuccessfullPackagesPython.Add(components) }, + { "CONAN", components => displayPackagesInfo.SuccessfullPackagesConan.Add(components) }, + { "DEBIAN", components => displayPackagesInfo.SuccessfullPackagesDebian.Add(components) } + }; + + if (successPackageLists.TryGetValue(item.ComponentType, out var addComponent)) + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + addComponent(components); + } + } + private static Task GetSucessFulPackageinfo(ComponentsToArtifactory item) + { + + ComponentsToArtifactory components = new ComponentsToArtifactory() + { + Name = item.Name, + Version = item.Version, + SrcRepoName = item.SrcRepoName, + DestRepoName = item.DestRepoName, + SrcRepoPathWithFullName = item.SrcRepoPathWithFullName, + Path = item.Path, + PackageType = item.PackageType, + Purl = item.Purl, + + }; + return Task.FromResult(components); + + } + + } +} diff --git a/src/ArtifactoryUploader/PackageUploader.cs b/src/ArtifactoryUploader/PackageUploader.cs index 5d66f469..70d61ee1 100644 --- a/src/ArtifactoryUploader/PackageUploader.cs +++ b/src/ArtifactoryUploader/PackageUploader.cs @@ -39,7 +39,7 @@ public static async Task UploadPackageToArtifactory(CommonAppSettings appSetting DisplayAllSettings(m_ComponentsInBOM.Components, appSettings); uploaderKpiData.ComponentInComparisonBOM = m_ComponentsInBOM.Components.Count; - DisplayPackagesInfo displayPackagesInfo = PackageUploadHelper.GetComponentsToBePackages(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); List m_ComponentsToBeUploaded = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(m_ComponentsInBOM.Components, appSettings, displayPackagesInfo); //Uploading the component to artifactory @@ -51,7 +51,7 @@ public static async Task UploadPackageToArtifactory(CommonAppSettings appSetting await PackageUploadHelper.UploadingThePackages(m_ComponentsToBeUploaded, appSettings.TimeOut, displayPackagesInfo); //Display packages information - PackageUploadHelper.DisplayPackageUploadInformation(displayPackagesInfo); + PackageUploadInformation.DisplayPackageUploadInformation(displayPackagesInfo); //Updating the component's new location diff --git a/src/LCT.PackageIdentifier/Program.cs b/src/LCT.PackageIdentifier/Program.cs index 0dfce57c..6af55588 100644 --- a/src/LCT.PackageIdentifier/Program.cs +++ b/src/LCT.PackageIdentifier/Program.cs @@ -75,8 +75,8 @@ static async Task Main(string[] args) // Validate application settings await ValidateAppsettingsFile(appSettings, projectReleases); - string listOfInlude = DisplayInclude(appSettings); - string listOfExclude = DisplayExclude(appSettings); + string listOfInlude = DisplayIncludeFiles(appSettings); + string listOfExclude = DisplayExcludeFiles(appSettings); string listOfExcludeComponents = DisplayExcludeComponents(appSettings); string listOfInternalRepoList = GetInternalRepolist(appSettings); @@ -159,112 +159,62 @@ private static async Task ValidateAppsettingsFile(CommonAppSettings appSettings, environmentHelper.CallEnvironmentExit(-1); } } - private static string DisplayInclude(CommonAppSettings appSettings) + private static string DisplayIncludeFiles(CommonAppSettings appSettings) { string totalString = string.Empty; - switch (appSettings.ProjectType.ToUpperInvariant()) + var includeMappings = new Dictionary>>(StringComparer.OrdinalIgnoreCase) + { + { "NPM", () => appSettings.Npm.Include }, + { "NUGET", () => appSettings.Nuget.Include }, + { "MAVEN", () => appSettings.Maven.Include }, + { "DEBIAN", () => appSettings.Debian.Include }, + { "POETRY", () => appSettings.Poetry.Include }, + { "CONAN", () => appSettings.Conan.Include }, + { "ALPINE", () => appSettings.Alpine.Include } + }; + + if (includeMappings.TryGetValue(appSettings.ProjectType, out var getIncludeList)) { - case "NPM": - if (appSettings.Npm.Include != null) - { - totalString = string.Join(",", appSettings.Npm.Include?.ToList()); - } - return totalString; - case "NUGET": - if (appSettings.Nuget.Include != null) - { - totalString = string.Join(",", appSettings.Nuget.Include?.ToList()); - } - return totalString; - case "MAVEN": - if (appSettings.Maven.Include != null) - { - totalString = string.Join(",", appSettings.Maven.Include?.ToList()); - } - return totalString; - case "DEBIAN": - if (appSettings.Debian.Include != null) - { - totalString = string.Join(",", appSettings.Debian.Include?.ToList()); - } - - return totalString; - case "POETRY": - if (appSettings.Poetry.Include != null) - { - totalString = string.Join(",", appSettings.Poetry.Include?.ToList()); - } - return totalString; - case "CONAN": - if (appSettings.Conan.Include != null) - { - totalString = string.Join(",", appSettings.Conan.Include?.ToList()); - } - return totalString; - case "ALPINE": - if (appSettings.Alpine.Include != null) - { - totalString = string.Join(",", appSettings.Alpine.Include?.ToList()); - } - return totalString; - default: - Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); - break; + var includeList = getIncludeList(); + if (includeList != null) + { + totalString = string.Join(",", includeList); + } } + else + { + Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); + } + return totalString; } - private static string DisplayExclude(CommonAppSettings appSettings) + private static string DisplayExcludeFiles(CommonAppSettings appSettings) { - string totalString = string.Empty; - switch (appSettings.ProjectType.ToUpperInvariant()) + var excludeMappings = new Dictionary>>(StringComparer.OrdinalIgnoreCase) + { + { "NPM", () => appSettings.Npm.Exclude }, + { "NUGET", () => appSettings.Nuget.Exclude }, + { "MAVEN", () => appSettings.Maven.Exclude }, + { "DEBIAN", () => appSettings.Debian.Exclude }, + { "POETRY", () => appSettings.Poetry.Exclude }, + { "CONAN", () => appSettings.Conan.Exclude }, + { "ALPINE", () => appSettings.Alpine.Exclude } + }; + + if (excludeMappings.TryGetValue(appSettings.ProjectType, out var getExcludeList)) + { + var excludeList = getExcludeList(); + if (excludeList != null) + { + totalString = string.Join(",", excludeList); + } + } + else { - case "NPM": - if (appSettings.Npm.Exclude != null) - { - totalString = string.Join(",", appSettings.Npm.Exclude?.ToList()); - } - return totalString; - case "NUGET": - if (appSettings.Nuget.Exclude != null) - { - totalString = string.Join(",", appSettings.Nuget.Exclude?.ToList()); - } - return totalString; - case "MAVEN": - if (appSettings.Maven.Exclude != null) - { - totalString = string.Join(",", appSettings.Maven.Exclude?.ToList()); - } - return totalString; - case "DEBIAN": - if (appSettings.Debian.Exclude != null) - { - totalString = string.Join(",", appSettings.Debian.Exclude?.ToList()); - } - return totalString; - case "POETRY": - if (appSettings.Poetry.Exclude != null) - { - totalString = string.Join(",", appSettings.Poetry.Exclude?.ToList()); - } - return totalString; - case "CONAN": - if (appSettings.Conan.Exclude != null) - { - totalString = string.Join(",", appSettings.Conan.Exclude?.ToList()); - } - return totalString; - case "ALPINE": - if (appSettings.Alpine.Include != null) - { - totalString = string.Join(",", appSettings.Alpine.Include?.ToList()); - } - return totalString; - default: - Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); - break; + Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); } + return totalString; } From e0efeea0d4d07bf4e198bf82fba818df5709561a Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Tue, 4 Feb 2025 21:17:33 +0530 Subject: [PATCH 2/6] Updated code changes as per review comments --- .../JfrogRepoUpdaterTest.cs | 137 ++++ .../PackageUploadHelperTest.cs | 676 +++--------------- .../PackageUploadInformationTest.cs | 158 +--- .../PackageUploaderTest.cs | 3 +- .../UploadToArtifactoryTest.cs | 497 +++++++++++++ .../ArtifactoryUploader.cs | 2 +- src/ArtifactoryUploader/JfrogRepoUpdater.cs | 206 ++++++ .../PackageUploadHelper.cs | 560 ++++----------- .../PackageUploadInformation.cs | 495 +++++++------ src/ArtifactoryUploader/PackageUploader.cs | 4 +- .../UploadToArtifactory.cs | 477 ++++++++++++ .../DisplayInformationTests.cs | 140 ++++ .../DisplayInformation.cs | 116 +++ src/LCT.PackageIdentifier/Program.cs | 110 +-- 14 files changed, 2057 insertions(+), 1524 deletions(-) create mode 100644 src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs create mode 100644 src/AritfactoryUploader.UTest/UploadToArtifactoryTest.cs create mode 100644 src/ArtifactoryUploader/JfrogRepoUpdater.cs create mode 100644 src/ArtifactoryUploader/UploadToArtifactory.cs create mode 100644 src/LCT.PackageIdentifier.UTest/DisplayInformationTests.cs create mode 100644 src/LCT.PackageIdentifier/DisplayInformation.cs diff --git a/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs b/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs new file mode 100644 index 00000000..bb8aed4c --- /dev/null +++ b/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs @@ -0,0 +1,137 @@ +using LCT.APICommunications.Model; +using LCT.ArtifactoryUploader.Model; +using LCT.ArtifactoryUploader; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using LCT.APICommunications.Model.AQL; +using LCT.Services.Interface; +using Moq; + +namespace AritfactoryUploader.UTest +{ + public class JfrogRepoUpdaterTest + { + [Test] + public async Task GetJfrogRepoInfoForAllTypePackages_GivenDestRepoNames_ReturnsAqlResultList() + { + // Arrange + var destRepoNames = new List { "repo1", "repo2", "repo3" }; + var expectedAqlResultList = new List + { + new AqlResult { Name = "result1" }, + new AqlResult { Name = "result2" }, + new AqlResult { Name = "result3" } + }; + + var jFrogServiceMock = new Mock(); + jFrogServiceMock.Setup(service => service.GetInternalComponentDataByRepo(It.IsAny())) + .ReturnsAsync(expectedAqlResultList); + JfrogRepoUpdater.jFrogService = jFrogServiceMock.Object; + + // Act + var actualAqlResultList = await JfrogRepoUpdater.GetJfrogRepoInfoForAllTypePackages(destRepoNames); + + + // Assert + Assert.That(actualAqlResultList.Count, Is.GreaterThan(2)); + } + + [Test] + [TestCase("NPM", ".tgz")] + [TestCase("NUGET", ".nupkg")] + [TestCase("MAVEN", ".jar")] + [TestCase("DEBIAN", ".deb")] + [TestCase("POETRY", ".whl")] + [TestCase("CONAN", "package.tgz")] + public void GetPkgeNameExtensionBasedOnComponentType_GivenType_ReturnsPkgNameExtension(string type, string extension) + { + // Arrange + var package = new ComponentsToArtifactory(); + package.ComponentType = type; + // Act + var actualExtension = JfrogRepoUpdater.GetPackageNameExtensionBasedOnComponentType(package); + // Assert + Assert.AreEqual(extension, actualExtension); + } + [Test] + public void GetUploadPackageDetails_CoversAllScenarios() + { + // Arrange + DisplayPackagesInfo displayPackagesInfo = new DisplayPackagesInfo() + { + JfrogFoundPackagesConan = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesMaven = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesNpm = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesNuget = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesPython = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesDebian = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + } + }; + + // Act + List uploadedPackages = JfrogRepoUpdater.GetUploadePackageDetails(displayPackagesInfo); + + // Assert + Assert.AreEqual(6, uploadedPackages.Count); + } + } +} diff --git a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs index adb9f96d..15ab82f8 100644 --- a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs +++ b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs @@ -67,145 +67,6 @@ public void GetComponentListFromComparisonBOM_GivenInvalidfile_ReturnsException( } - [Test] - public async Task GetComponentsToBeUploadedToArtifactory_GivenFewApprovedComponentList_ReturnsUploadList() - { - //Arrange - List componentLists = GetComponentList(); - string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; - string outFolder = Path.GetDirectoryName(exePath); - DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); - - var jFrogServiceMock = new Mock(); - PackageUploadHelper.jFrogService = jFrogServiceMock.Object; - - CommonAppSettings commonAppSettings = new CommonAppSettings(); - commonAppSettings.Jfrog = new Jfrog() - { - Token = "wfwfwfwfwegwgweg", - URL = UTParams.JFrogURL - }; - commonAppSettings.Npm = new Config() - { - Artifactory = new Artifactory() - { - ThirdPartyRepos = new List() - { - new() { Name = "npm-test" } - } - } - }; - commonAppSettings.Nuget = new Config() - { - Artifactory = new Artifactory() - { - ThirdPartyRepos = new List() - { - new() { Name = "nuget-test" } - } - } - }; - commonAppSettings.LogFolderPath = outFolder; - - //Act - List uploadList = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, commonAppSettings, displayPackagesInfo); - // Assert - Assert.That(3, Is.EqualTo(uploadList.Count), "Checks for 2 no of components to upload"); - } - - - [Test] - public async Task GetComponentsToBeUploadedToArtifactory_GivenAllApprovedComponentList_ReturnsUploadList() - { - //Arrange - List componentLists = GetComponentList(); - DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); - - var jFrogServiceMock = new Mock(); - PackageUploadHelper.jFrogService = jFrogServiceMock.Object; - - foreach (var component in componentLists) - { - if (component.Name == "@angular/core") - { - component.Properties[1].Value = "APPROVED"; - } - - } - string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; - string outFolder = Path.GetDirectoryName(exePath); - - CommonAppSettings commonAppSettings = new CommonAppSettings(); - commonAppSettings.Jfrog = new Jfrog() - { - Token = "wfwfwfwfwegwgweg", - URL = UTParams.JFrogURL - }; - commonAppSettings.Npm = new Config() - { - Artifactory = new Artifactory() - { - ThirdPartyRepos = new List() - { - new() { Name = "npm-test" } - } - } - }; - commonAppSettings.Nuget = new Config() - { - Artifactory = new Artifactory() - { - ThirdPartyRepos = new List() - { - new() { Name = "nuget-test" } - } - } - }; - commonAppSettings.LogFolderPath = outFolder; - - - //Act - List uploadList = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, commonAppSettings, displayPackagesInfo); - - // Assert - Assert.That(4, Is.EqualTo(uploadList.Count), "Checks for 3 no of components to upload"); - } - - [Test] - public async Task GetComponentsToBeUploadedToArtifactory_GivenNotApprovedComponentList_ReturnsUploadList() - { - //Arrange - List componentLists = GetComponentList(); - DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); - foreach (var component in componentLists) - { - component.Properties[1].Value = "NEW_CLEARING"; - } - - CommonAppSettings commonAppSettings = new CommonAppSettings(); - commonAppSettings.Jfrog = new Jfrog() - { - Token = "wfwfwfwfwegwgweg", - URL = UTParams.JFrogURL - }; - commonAppSettings.Npm = new Config() - { - Artifactory = new Artifactory() - { - ThirdPartyRepos = new List() - { - new() { Name = "npm-test" } - } - } - }; - - //Act - List uploadList = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(componentLists, commonAppSettings, displayPackagesInfo); - - // Assert - Assert.That(0, Is.EqualTo(uploadList.Count), "Checks for components to upload to be zero"); - } - [Test] public void UpdateBomArtifactoryRepoUrl_GivenBomAndComponentsUploadedToArtifactory_UpdatesBom() { @@ -255,290 +116,8 @@ public void UpdateBomArtifactoryRepoUrl_GivenBomAndComponentsUploadedToArtifacto //Assert var repoUrl = bom.Components.First(x => x.Properties[3].Name == "internal:siemens:clearing:jfrog-repo-name").Properties[3].Value; Assert.AreNotEqual("org1-npmjs-npm-remote", repoUrl); - } - - - - - - private static List GetComponentList() - { - List componentLists = new List(); - Property propinternal = new Property - { - Name = Dataconstant.Cdx_IsInternal, - Value = "false" - }; - Property prop = new Property - { - Name = Dataconstant.Cdx_ClearingState, - Value = "APPROVED" - }; - Component comp1 = new Component - { - Name = "@angular/animations", - Version = "11.2.3", - Purl = "pkg:npm/%40angular/animations@11.0.4", - Properties = new List() - }; - comp1.Properties.Add(propinternal); - comp1.Properties.Add(prop); - componentLists.Add(comp1); - - Property prop1 = new Property - { - Name = Dataconstant.Cdx_ClearingState, - Value = "NEW_CLEARING" - }; - Component comp2 = new Component - { - Name = "@angular/core", - Version = "11.2.3", - Purl = "pkg:npm/%40angular/core@11.0.4", - Properties = new List() - }; - comp2.Properties.Add(propinternal); - comp2.Properties.Add(prop1); - componentLists.Add(comp2); - - Property prop2 = new Property - { - Name = Dataconstant.Cdx_ClearingState, - Value = "APPROVED" - }; - Component comp3 = new Component - { - Name = "NewtonsoftJson", - Version = "11.9.3", - Purl = "pkg:nuget/NewtonsoftJson@11.9.3", - Properties = new List() - }; - comp3.Properties.Add(propinternal); - comp3.Properties.Add(prop2); - componentLists.Add(comp3); - - Property prop3 = new Property - { - Name = Dataconstant.Cdx_ClearingState, - Value = "APPROVED" - }; - Component comp4 = new Component - { - Name = "adduser", - Version = "11.9.3", - Purl = "pkg:deb/adduser@11.9.3", - Properties = new List() - }; - comp4.Properties.Add(propinternal); - comp4.Properties.Add(prop3); - componentLists.Add(comp4); - return componentLists; - } - - [Test] - public void GetUploadPackageDetails_CoversAllScenarios() - { - // Arrange - DisplayPackagesInfo displayPackagesInfo = new DisplayPackagesInfo() - { - JfrogFoundPackagesConan = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesMaven = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesNpm = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesNuget = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesPython = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesDebian = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - } - }; - - // Act - List uploadedPackages = PackageUploadHelper.GetUploadePackageDetails(displayPackagesInfo); - - // Assert - Assert.AreEqual(6, uploadedPackages.Count); - } - - [Test] - public async Task GetSrcRepoDetailsForPyPiOrConanPackages_WhenPypiRepoExists_ReturnsArtifactoryRepoName() - { - // Arrange - Property repoNameProperty = new Property - { - Name = Dataconstant.Cdx_ArtifactoryRepoName, - Value = "Reponame" - }; - List properties = new List() { repoNameProperty }; - var item = new Component - { - Purl = "pypi://example-package", - Properties = properties, - Name = "pypi component", - Version = "1.0.0" - }; - AqlProperty pypiNameProperty = new AqlProperty - { - Key = "pypi.normalized.name", - Value = "pypi component" - }; - - AqlProperty pypiVersionProperty = new AqlProperty - { - Key = "pypi.version", - Value = "1.0.0" - }; - List propertys = new List { pypiNameProperty, pypiVersionProperty }; - //GetInternalComponentDataByRepo - var aqlResultList = new List - { - new AqlResult - { - Repo = "pypi-repo", - Path = "path/to/package", - Name = "pypi component-1.0.0", - Properties=propertys, - } - }; - var jFrogServiceMock = new Mock(); - - jFrogServiceMock.Setup(x => x.GetPypiComponentDataByRepo(It.IsAny())).ReturnsAsync(aqlResultList); - - - PackageUploadHelper.jFrogService = jFrogServiceMock.Object; - - // Act - var result = await PackageUploadHelper.GetSrcRepoDetailsForComponent(item); - - // Assert - Assert.IsNotNull(result); - Assert.AreEqual("pypi-repo", result.Repo); - Assert.AreEqual("path/to/package", result.Path); - } - public async static Task GetSrcRepoDetailsForPyPiOrConanPackages_WhenConanRepoExists_ReturnsArtifactoryRepoName() - { - // Arrange - Property prop1 = new Property - { - Name = Dataconstant.Cdx_ArtifactoryRepoName, - Value = "Reponame" - }; - List properties = new List() { prop1 }; - var item = new Component - { - Purl = "conan://example-package", - Properties = properties, - Name = "conancomponent", - Version = "1.0.0" - }; - var aqlResultList = new List - { - new AqlResult - { - Repo = "conan-repo", - Path = "path/to/conancomponent/1.0.0", - Name = "conan component-1.0.0", - } - }; - - var jFrogServiceMock = new Mock(); - jFrogServiceMock.Setup(x => x.GetInternalComponentDataByRepo(It.IsAny())).ReturnsAsync(aqlResultList); - PackageUploadHelper.jFrogService = jFrogServiceMock.Object; - - // Act - var result = await PackageUploadHelper.GetSrcRepoDetailsForComponent(item); - - // Assert - Assert.IsNotNull(result); - Assert.AreEqual("conan-repo", result.Repo); - Assert.AreEqual("path/to/conancomponent/1.0.0", result.Path); - } - - [Test] - public async Task GetSrcRepoDetailsForPyPiOrConanPackages_WhenNoRepoExists_ReturnsNull() - { - // Arrange - var item = new Component - { - Purl = "unknown://example-package" - }; - var jFrogServiceMock = new Mock(); - PackageUploadHelper.jFrogService = jFrogServiceMock.Object; - - // Act - var result = await PackageUploadHelper.GetSrcRepoDetailsForComponent(item); - - // Assert - Assert.IsNull(result); - } - - [Test] - [TestCase("NPM", ".tgz")] - [TestCase("NUGET", ".nupkg")] - [TestCase("MAVEN", ".jar")] - [TestCase("DEBIAN", ".deb")] - [TestCase("POETRY", ".whl")] - [TestCase("CONAN", "package.tgz")] - public void GetPkgeNameExtensionBasedOnComponentType_GivenType_ReturnsPkgNameExtension(string type, string extension) - { - // Arrange - var package = new ComponentsToArtifactory(); - package.ComponentType = type; - // Act - var actualExtension = PackageUploadHelper.GetPackageNameExtensionBasedOnComponentType(package); - // Assert - Assert.AreEqual(extension, actualExtension); - } + } + [Test] public void GetJfrogApiCommInstance_GivenComponent_ReturnsJfrogApiCommunicationInstance() @@ -600,188 +179,121 @@ public void GetJfrogApiCommInstance_GivenComponentWithUnknownType_ReturnsJfrogAp Assert.IsInstanceOf(result); } - - - - [Test] - public async Task GetJfrogRepoInfoForAllTypePackages_GivenDestRepoNames_ReturnsAqlResultList() + [TestCase("NPM")] + [TestCase("NUGET")] + [TestCase("MAVEN")] + [TestCase("POETRY")] + [TestCase("CONAN")] + [TestCase("DEBIAN")] + public async Task JfrogNotFoundPackagesAsync_CoversAllScenarios(string compType) { // Arrange - var destRepoNames = new List { "repo1", "repo2", "repo3" }; - var expectedAqlResultList = new List - { - new AqlResult { Name = "result1" }, - new AqlResult { Name = "result2" }, - new AqlResult { Name = "result3" } - }; - - var jFrogServiceMock = new Mock(); - jFrogServiceMock.Setup(service => service.GetInternalComponentDataByRepo(It.IsAny())) - .ReturnsAsync(expectedAqlResultList); - PackageUploadHelper.jFrogService = jFrogServiceMock.Object; + var item = new ComponentsToArtifactory(); + item.ComponentType = compType; + var displayPackagesInfo = new DisplayPackagesInfo(); + displayPackagesInfo.JfrogNotFoundPackagesNpm = new List(); + displayPackagesInfo.JfrogNotFoundPackagesNuget = new List(); + displayPackagesInfo.JfrogNotFoundPackagesMaven = new List(); + displayPackagesInfo.JfrogNotFoundPackagesPython = new List(); + displayPackagesInfo.JfrogNotFoundPackagesConan = new List(); + displayPackagesInfo.JfrogNotFoundPackagesDebian = new List(); // Act - var actualAqlResultList = await PackageUploadHelper.GetJfrogRepoInfoForAllTypePackages(destRepoNames); - + await PackageUploadHelper.JfrogNotFoundPackagesAsync(item, displayPackagesInfo); // Assert - Assert.That(actualAqlResultList.Count, Is.GreaterThan(2)); - } - - [Test] - [TestCase("NPM", "?to=/destination-repo//")] - [TestCase("NUGET", "source-repo/package-name.1.0.0.nupkg?to=/destination-repo/package-name.1.0.0.nupkg")] - [TestCase("MAVEN", "source-repo/package-name/1.0.0?to=/destination-repo/package-name/1.0.0")] - [TestCase("CONAN", "source-repo/?to=/destination-repo/")] - [TestCase("POETRY", "?to=/destination-repo/")] - [TestCase("DEBIAN", "source-repo//package-name_1.0.0*?to=/destination-repo//package-name_1.0.0*")] - public void GetCopyURL_GivenComponentType_ReturnsCopyURL(string type, string pkgExtension) - { - // Arrange - var component = new ComponentsToArtifactory + if (item.ComponentType == "NPM") { - ComponentType = type, - JfrogApi = "https://example.com", - SrcRepoName = "source-repo", - Name = "package-name", - Version = "1.0.0", - PackageName = "package-name", - DestRepoName = "destination-repo", - DryRun = false - }; - var expectedUrl = $"https://example.com/api/copy/{pkgExtension}"; - - // Act - var actualUrl = PackageUploadHelper.GetCopyURL(component); - - // Assert - Assert.AreEqual(expectedUrl, actualUrl); - } - - [Test] - public void GetCopyURL_GivenInvalidComponentType_ReturnsEmptyString() - { - // Arrange - var component = new ComponentsToArtifactory + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesNpm.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesNpm[0], Is.Not.Null); + } + else if (item.ComponentType == "NUGET") { - ComponentType = "INVALID", - JfrogApi = "https://example.com/api/", - SrcRepoName = "source-repo", - Name = "package-name", - Version = "1.0.0", - PackageName = "package-name", - DestRepoName = "destination-repo", - DryRun = false - }; - - // Act - var actualUrl = PackageUploadHelper.GetCopyURL(component); - - // Assert - Assert.AreEqual(string.Empty, actualUrl); - } - - - [Test] - [TestCase("NPM", "?to=/destination-repo//")] - [TestCase("NUGET", "source-repo/package-name.1.0.0.nupkg?to=/destination-repo/package-name.1.0.0.nupkg")] - [TestCase("MAVEN", "source-repo/package-name/1.0.0?to=/destination-repo/package-name/1.0.0")] - [TestCase("CONAN", "source-repo/?to=/destination-repo/")] - [TestCase("POETRY", "?to=/destination-repo/")] - [TestCase("DEBIAN", "source-repo//package-name_1.0.0*?to=/destination-repo//package-name_1.0.0*")] - public void GetMoveURL_GivenComponentType_ReturnsMoveURL(string type, string extension) - { - // Arrange - var component = new ComponentsToArtifactory + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesNuget.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesNuget[0], Is.Not.Null); + } + else if (item.ComponentType == "MAVEN") { - ComponentType = type, - JfrogApi = "https://example.com", - SrcRepoName = "source-repo", - Name = "package-name", - PackageName = "package-name", - Version = "1.0.0", - DestRepoName = "destination-repo", - DryRun = false - }; - var expectedUrl = $"https://example.com/api/move/{extension}"; - - // Act - var result = PackageUploadHelper.GetMoveURL(component); - - // Assert - Assert.AreEqual(expectedUrl, result); + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesMaven.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesMaven[0], Is.Not.Null); + } + else if (item.ComponentType == "POETRY") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesPython.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesPython[0], Is.Not.Null); + } + else if (item.ComponentType == "CONAN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesConan.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesConan[0], Is.Not.Null); + } + else if (item.ComponentType == "DEBIAN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesDebian.Count); + Assert.That(displayPackagesInfo.JfrogNotFoundPackagesDebian[0], Is.Not.Null); + } } [Test] - public void GetMoveURL_GivenInvalidComponentType_ReturnsEmptyString() + [TestCase("NPM")] + [TestCase("NUGET")] + [TestCase("MAVEN")] + [TestCase("POETRY")] + [TestCase("CONAN")] + [TestCase("DEBIAN")] + public async Task JfrogFoundPackagesAsync_CoversAllScenarios(string compType) { // Arrange - var component = new ComponentsToArtifactory - { - ComponentType = "INVALID", - JfrogApi = "https://example.com/api/", - SrcRepoName = "source-repo", - Name = "package-name", - PackageName = "package-name", - Version = "1.0.0", - DestRepoName = "destination-repo", - DryRun = false - }; + var item = new ComponentsToArtifactory(); + item.ComponentType = compType; + var displayPackagesInfo = new DisplayPackagesInfo(); + displayPackagesInfo.JfrogFoundPackagesNpm = new List(); + displayPackagesInfo.JfrogFoundPackagesNuget = new List(); + displayPackagesInfo.JfrogFoundPackagesMaven = new List(); + displayPackagesInfo.JfrogFoundPackagesPython = new List(); + displayPackagesInfo.JfrogFoundPackagesConan = new List(); + displayPackagesInfo.JfrogFoundPackagesDebian = new List(); + var operationType = "operationType"; + var responseMessage = new HttpResponseMessage(); + var dryRunSuffix = "dryRunSuffix"; // Act - var result = PackageUploadHelper.GetMoveURL(component); + await PackageUploadHelper.JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); // Assert - Assert.AreEqual(string.Empty, result); - } - - [Test] - public async Task GetSrcRepoDetailsForPyPiOrConanPackages_WhenNpmRepoExists_ReturnsArtifactoryRepoName() - { - // Arrange - var repoNameProperty = new Property + if (item.ComponentType == "NPM") { - Name = Dataconstant.Cdx_ArtifactoryRepoName, - Value = "npm-repo" - }; - var properties = new List { repoNameProperty }; - var item = new Component + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesNpm.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesNpm[0], Is.Not.Null); + } + else if (item.ComponentType == "NUGET") { - Purl = "pkg:npm/example-package", - Properties = properties, - Name = "example-package", - Version = "1.0.0" - }; - var aqlResultList = new List - { - new AqlResult + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesNuget.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesNuget[0], Is.Not.Null); + } + else if (item.ComponentType == "MAVEN") { - Repo = "npm-repo", - Path = "path/to/package", - Name = "example-package-1.0.0", - Properties = new List - { - new AqlProperty { Key = "npm.name", Value = "example-package" }, - new AqlProperty { Key = "npm.version", Value = "1.0.0" } - } + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesMaven.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesMaven[0], Is.Not.Null); } - }; - - var jFrogServiceMock = new Mock(); - - jFrogServiceMock.Setup(x => x.GetNpmComponentDataByRepo(It.IsAny())).ReturnsAsync(aqlResultList); - - PackageUploadHelper.jFrogService = jFrogServiceMock.Object; - - - // Act - var result = await PackageUploadHelper.GetSrcRepoDetailsForComponent(item); + else if (item.ComponentType == "POETRY") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesPython.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesPython[0], Is.Not.Null); + } + else if (item.ComponentType == "CONAN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesConan.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesConan[0], Is.Not.Null); + } + else if (item.ComponentType == "DEBIAN") + { + Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesDebian.Count); + Assert.That(displayPackagesInfo.JfrogFoundPackagesDebian[0], Is.Not.Null); + } + } - // Assert - Assert.IsNotNull(result); - Assert.AreEqual("npm-repo", result.Repo); - Assert.AreEqual("path/to/package", result.Path); - } + } } diff --git a/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs b/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs index f4863a13..ffb88862 100644 --- a/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs +++ b/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs @@ -8,7 +8,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Net.Http; using System.Text; using System.Threading.Tasks; @@ -16,6 +15,27 @@ namespace AritfactoryUploader.UTest { public class PackageUploadInformationTest { + [Test] + public void GetNotApprovedDebianPackages_CoversAllScenarios() + { + // Arrange + var unknownPackages = new List + { + new ComponentsToArtifactory { Name = "Package1", Version = "1.0.0" }, + new ComponentsToArtifactory { Name = "Package2", Version = "2.0.0" } + }; + var projectResponse = new ProjectResponse(); + var fileOperationsMock = new Mock(); + var filepath = ".."; + var filename = "\\testFileName.json"; + + // Act + PackageUploadInformation.GetNotApprovedDebianPackages(unknownPackages, projectResponse, fileOperationsMock.Object, filepath, filename); + + // Assert + // Add your assertions here + Assert.That(unknownPackages.Count, Is.EqualTo(2)); + } [Test] public void DisplayErrorForJfrogPackages_GivenJfrogNotFoundPackages_ResultsSucess() { @@ -62,141 +82,5 @@ public void DisplayErrorForJfrogFoundPackages_GivenJfrogNotFoundPackages_Results // Assert Assert.That(JfrogNotFoundPackages.Count, Is.GreaterThanOrEqualTo(1)); } - [Test] - [TestCase("NPM")] - [TestCase("NUGET")] - [TestCase("MAVEN")] - [TestCase("POETRY")] - [TestCase("CONAN")] - [TestCase("DEBIAN")] - public async Task JfrogNotFoundPackagesAsync_CoversAllScenarios(string compType) - { - // Arrange - var item = new ComponentsToArtifactory(); - item.ComponentType = compType; - var displayPackagesInfo = new DisplayPackagesInfo(); - displayPackagesInfo.JfrogNotFoundPackagesNpm = new List(); - displayPackagesInfo.JfrogNotFoundPackagesNuget = new List(); - displayPackagesInfo.JfrogNotFoundPackagesMaven = new List(); - displayPackagesInfo.JfrogNotFoundPackagesPython = new List(); - displayPackagesInfo.JfrogNotFoundPackagesConan = new List(); - displayPackagesInfo.JfrogNotFoundPackagesDebian = new List(); - - // Act - await PackageUploadInformation.JfrogNotFoundPackagesAsync(item, displayPackagesInfo); - - // Assert - if (item.ComponentType == "NPM") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesNpm.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesNpm[0], Is.Not.Null); - } - else if (item.ComponentType == "NUGET") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesNuget.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesNuget[0], Is.Not.Null); - } - else if (item.ComponentType == "MAVEN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesMaven.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesMaven[0], Is.Not.Null); - } - else if (item.ComponentType == "POETRY") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesPython.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesPython[0], Is.Not.Null); - } - else if (item.ComponentType == "CONAN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesConan.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesConan[0], Is.Not.Null); - } - else if (item.ComponentType == "DEBIAN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogNotFoundPackagesDebian.Count); - Assert.That(displayPackagesInfo.JfrogNotFoundPackagesDebian[0], Is.Not.Null); - } - } - - [Test] - [TestCase("NPM")] - [TestCase("NUGET")] - [TestCase("MAVEN")] - [TestCase("POETRY")] - [TestCase("CONAN")] - [TestCase("DEBIAN")] - public async Task JfrogFoundPackagesAsync_CoversAllScenarios(string compType) - { - // Arrange - var item = new ComponentsToArtifactory(); - item.ComponentType = compType; - var displayPackagesInfo = new DisplayPackagesInfo(); - displayPackagesInfo.JfrogFoundPackagesNpm = new List(); - displayPackagesInfo.JfrogFoundPackagesNuget = new List(); - displayPackagesInfo.JfrogFoundPackagesMaven = new List(); - displayPackagesInfo.JfrogFoundPackagesPython = new List(); - displayPackagesInfo.JfrogFoundPackagesConan = new List(); - displayPackagesInfo.JfrogFoundPackagesDebian = new List(); - var operationType = "operationType"; - var responseMessage = new HttpResponseMessage(); - var dryRunSuffix = "dryRunSuffix"; - - // Act - await PackageUploadInformation.JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); - - // Assert - if (item.ComponentType == "NPM") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesNpm.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesNpm[0], Is.Not.Null); - } - else if (item.ComponentType == "NUGET") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesNuget.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesNuget[0], Is.Not.Null); - } - else if (item.ComponentType == "MAVEN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesMaven.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesMaven[0], Is.Not.Null); - } - else if (item.ComponentType == "POETRY") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesPython.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesPython[0], Is.Not.Null); - } - else if (item.ComponentType == "CONAN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesConan.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesConan[0], Is.Not.Null); - } - else if (item.ComponentType == "DEBIAN") - { - Assert.AreEqual(1, displayPackagesInfo.JfrogFoundPackagesDebian.Count); - Assert.That(displayPackagesInfo.JfrogFoundPackagesDebian[0], Is.Not.Null); - } - } - - [Test] - public void GetNotApprovedDebianPackages_CoversAllScenarios() - { - // Arrange - var unknownPackages = new List - { - new ComponentsToArtifactory { Name = "Package1", Version = "1.0.0" }, - new ComponentsToArtifactory { Name = "Package2", Version = "2.0.0" } - }; - var projectResponse = new ProjectResponse(); - var fileOperationsMock = new Mock(); - var filepath = ".."; - var filename = "\\testFileName.json"; - - // Act - PackageUploadInformation.GetNotApprovedDebianPackages(unknownPackages, projectResponse, fileOperationsMock.Object, filepath, filename); - - // Assert - // Add your assertions here - Assert.That(unknownPackages.Count, Is.EqualTo(2)); - } } } diff --git a/src/AritfactoryUploader.UTest/PackageUploaderTest.cs b/src/AritfactoryUploader.UTest/PackageUploaderTest.cs index d0c0a25e..9b1a0657 100644 --- a/src/AritfactoryUploader.UTest/PackageUploaderTest.cs +++ b/src/AritfactoryUploader.UTest/PackageUploaderTest.cs @@ -79,6 +79,8 @@ public async Task UploadPackageToArtifactory_GivenAppsettings() IJFrogService jFrogService = GetJfrogService(commonAppSettings); PackageUploadHelper.jFrogService = jFrogService; + UploadToArtifactory.jFrogService = jFrogService; + ArtfactoryUploader.jFrogService= jFrogService; Program.UploaderStopWatch = new Stopwatch(); Program.UploaderStopWatch.Start(); @@ -233,7 +235,6 @@ public void DisplayAllSettings_GivenListOfComponents_ReturnPackageSettings(strin } - private static IJFrogService GetJfrogService(CommonAppSettings appSettings) { ArtifactoryCredentials artifactoryUpload = new ArtifactoryCredentials() diff --git a/src/AritfactoryUploader.UTest/UploadToArtifactoryTest.cs b/src/AritfactoryUploader.UTest/UploadToArtifactoryTest.cs new file mode 100644 index 00000000..f3c12ca4 --- /dev/null +++ b/src/AritfactoryUploader.UTest/UploadToArtifactoryTest.cs @@ -0,0 +1,497 @@ +using LCT.APICommunications.Model; +using LCT.ArtifactoryUploader.Model; +using LCT.ArtifactoryUploader; +using LCT.Common.Model; +using LCT.Common; +using LCT.Services.Interface; +using Moq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnitTestUtilities; +using CycloneDX.Models; +using LCT.Common.Constants; +using LCT.APICommunications.Model.AQL; + +namespace AritfactoryUploader.UTest +{ + public class UploadToArtifactoryTest + { + [Test] + [TestCase("NPM", "?to=/destination-repo//")] + [TestCase("NUGET", "source-repo/package-name.1.0.0.nupkg?to=/destination-repo/package-name.1.0.0.nupkg")] + [TestCase("MAVEN", "source-repo/package-name/1.0.0?to=/destination-repo/package-name/1.0.0")] + [TestCase("CONAN", "source-repo/?to=/destination-repo/")] + [TestCase("POETRY", "?to=/destination-repo/")] + [TestCase("DEBIAN", "source-repo//package-name_1.0.0*?to=/destination-repo//package-name_1.0.0*")] + public void GetMoveURL_GivenComponentType_ReturnsMoveURL(string type, string extension) + { + // Arrange + var component = new ComponentsToArtifactory + { + ComponentType = type, + JfrogApi = "https://example.com", + SrcRepoName = "source-repo", + Name = "package-name", + PackageName = "package-name", + Version = "1.0.0", + DestRepoName = "destination-repo", + DryRun = false + }; + var expectedUrl = $"https://example.com/api/move/{extension}"; + + // Act + var result = UploadToArtifactory.GetMoveURL(component); + + // Assert + Assert.AreEqual(expectedUrl, result); + } + + [Test] + public void GetMoveURL_GivenInvalidComponentType_ReturnsEmptyString() + { + // Arrange + var component = new ComponentsToArtifactory + { + ComponentType = "INVALID", + JfrogApi = "https://example.com/api/", + SrcRepoName = "source-repo", + Name = "package-name", + PackageName = "package-name", + Version = "1.0.0", + DestRepoName = "destination-repo", + DryRun = false + }; + + // Act + var result = UploadToArtifactory.GetMoveURL(component); + + // Assert + Assert.AreEqual(string.Empty, result); + } + + [Test] + public async Task GetSrcRepoDetailsForPyPiOrConanPackages_WhenNpmRepoExists_ReturnsArtifactoryRepoName() + { + // Arrange + var repoNameProperty = new Property + { + Name = Dataconstant.Cdx_ArtifactoryRepoName, + Value = "npm-repo" + }; + var properties = new List { repoNameProperty }; + var item = new Component + { + Purl = "pkg:npm/example-package", + Properties = properties, + Name = "example-package", + Version = "1.0.0" + }; + var aqlResultList = new List + { + new AqlResult + { + Repo = "npm-repo", + Path = "path/to/package", + Name = "example-package-1.0.0", + Properties = new List + { + new AqlProperty { Key = "npm.name", Value = "example-package" }, + new AqlProperty { Key = "npm.version", Value = "1.0.0" } + } + } + }; + + var jFrogServiceMock = new Mock(); + + jFrogServiceMock.Setup(x => x.GetNpmComponentDataByRepo(It.IsAny())).ReturnsAsync(aqlResultList); + + UploadToArtifactory.jFrogService = jFrogServiceMock.Object; + + + // Act + var result = await UploadToArtifactory.GetSrcRepoDetailsForComponent(item); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual("npm-repo", result.Repo); + Assert.AreEqual("path/to/package", result.Path); + } + + [Test] + public void GetCopyURL_GivenInvalidComponentType_ReturnsEmptyString() + { + // Arrange + var component = new ComponentsToArtifactory + { + ComponentType = "INVALID", + JfrogApi = "https://example.com/api/", + SrcRepoName = "source-repo", + Name = "package-name", + Version = "1.0.0", + PackageName = "package-name", + DestRepoName = "destination-repo", + DryRun = false + }; + + // Act + var actualUrl = UploadToArtifactory.GetCopyURL(component); + + // Assert + Assert.AreEqual(string.Empty, actualUrl); + } + + [Test] + [TestCase("NPM", "?to=/destination-repo//")] + [TestCase("NUGET", "source-repo/package-name.1.0.0.nupkg?to=/destination-repo/package-name.1.0.0.nupkg")] + [TestCase("MAVEN", "source-repo/package-name/1.0.0?to=/destination-repo/package-name/1.0.0")] + [TestCase("CONAN", "source-repo/?to=/destination-repo/")] + [TestCase("POETRY", "?to=/destination-repo/")] + [TestCase("DEBIAN", "source-repo//package-name_1.0.0*?to=/destination-repo//package-name_1.0.0*")] + public void GetCopyURL_GivenComponentType_ReturnsCopyURL(string type, string pkgExtension) + { + // Arrange + var component = new ComponentsToArtifactory + { + ComponentType = type, + JfrogApi = "https://example.com", + SrcRepoName = "source-repo", + Name = "package-name", + Version = "1.0.0", + PackageName = "package-name", + DestRepoName = "destination-repo", + DryRun = false + }; + var expectedUrl = $"https://example.com/api/copy/{pkgExtension}"; + + // Act + var actualUrl = UploadToArtifactory.GetCopyURL(component); + + // Assert + Assert.AreEqual(expectedUrl, actualUrl); + } + + [Test] + public async Task GetComponentsToBeUploadedToArtifactory_GivenFewApprovedComponentList_ReturnsUploadList() + { + //Arrange + List componentLists = GetComponentList(); + string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; + string outFolder = Path.GetDirectoryName(exePath); + DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); + + var jFrogServiceMock = new Mock(); + UploadToArtifactory.jFrogService = jFrogServiceMock.Object; + + CommonAppSettings commonAppSettings = new CommonAppSettings(); + commonAppSettings.Jfrog = new Jfrog() + { + Token = "wfwfwfwfwegwgweg", + URL = UTParams.JFrogURL + }; + commonAppSettings.Npm = new Config() + { + Artifactory = new Artifactory() + { + ThirdPartyRepos = new List() + { + new() { Name = "npm-test" } + } + } + }; + commonAppSettings.Nuget = new Config() + { + Artifactory = new Artifactory() + { + ThirdPartyRepos = new List() + { + new() { Name = "nuget-test" } + } + } + }; + commonAppSettings.LogFolderPath = outFolder; + + //Act + List uploadList = await UploadToArtifactory.GetComponentsToBeUploadedToArtifactory(componentLists, commonAppSettings, displayPackagesInfo); + // Assert + Assert.That(3, Is.EqualTo(uploadList.Count), "Checks for 2 no of components to upload"); + } + [Test] + public async Task GetComponentsToBeUploadedToArtifactory_GivenNotApprovedComponentList_ReturnsUploadList() + { + //Arrange + List componentLists = GetComponentList(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); + foreach (var component in componentLists) + { + component.Properties[1].Value = "NEW_CLEARING"; + } + + CommonAppSettings commonAppSettings = new CommonAppSettings(); + commonAppSettings.Jfrog = new Jfrog() + { + Token = "wfwfwfwfwegwgweg", + URL = UTParams.JFrogURL + }; + commonAppSettings.Npm = new Config() + { + Artifactory = new Artifactory() + { + ThirdPartyRepos = new List() + { + new() { Name = "npm-test" } + } + } + }; + + //Act + List uploadList = await UploadToArtifactory.GetComponentsToBeUploadedToArtifactory(componentLists, commonAppSettings, displayPackagesInfo); + + // Assert + Assert.That(0, Is.EqualTo(uploadList.Count), "Checks for components to upload to be zero"); + } + [Test] + public async Task GetComponentsToBeUploadedToArtifactory_GivenAllApprovedComponentList_ReturnsUploadList() + { + //Arrange + List componentLists = GetComponentList(); + DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); + + var jFrogServiceMock = new Mock(); + UploadToArtifactory.jFrogService = jFrogServiceMock.Object; + + foreach (var component in componentLists) + { + if (component.Name == "@angular/core") + { + component.Properties[1].Value = "APPROVED"; + } + + } + string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; + string outFolder = Path.GetDirectoryName(exePath); + + CommonAppSettings commonAppSettings = new CommonAppSettings(); + commonAppSettings.Jfrog = new Jfrog() + { + Token = "wfwfwfwfwegwgweg", + URL = UTParams.JFrogURL + }; + commonAppSettings.Npm = new Config() + { + Artifactory = new Artifactory() + { + ThirdPartyRepos = new List() + { + new() { Name = "npm-test" } + } + } + }; + commonAppSettings.Nuget = new Config() + { + Artifactory = new Artifactory() + { + ThirdPartyRepos = new List() + { + new() { Name = "nuget-test" } + } + } + }; + commonAppSettings.LogFolderPath = outFolder; + + + //Act + List uploadList = await UploadToArtifactory.GetComponentsToBeUploadedToArtifactory(componentLists, commonAppSettings, displayPackagesInfo); + + // Assert + Assert.That(4, Is.EqualTo(uploadList.Count), "Checks for 3 no of components to upload"); + } + [Test] + public async Task GetSrcRepoDetailsForPyPiOrConanPackages_WhenPypiRepoExists_ReturnsArtifactoryRepoName() + { + // Arrange + Property repoNameProperty = new Property + { + Name = Dataconstant.Cdx_ArtifactoryRepoName, + Value = "Reponame" + }; + List properties = new List() { repoNameProperty }; + var item = new Component + { + Purl = "pypi://example-package", + Properties = properties, + Name = "pypi component", + Version = "1.0.0" + }; + AqlProperty pypiNameProperty = new AqlProperty + { + Key = "pypi.normalized.name", + Value = "pypi component" + }; + + AqlProperty pypiVersionProperty = new AqlProperty + { + Key = "pypi.version", + Value = "1.0.0" + }; + List propertys = new List { pypiNameProperty, pypiVersionProperty }; + //GetInternalComponentDataByRepo + var aqlResultList = new List + { + new AqlResult + { + Repo = "pypi-repo", + Path = "path/to/package", + Name = "pypi component-1.0.0", + Properties=propertys, + } + }; + var jFrogServiceMock = new Mock(); + + jFrogServiceMock.Setup(x => x.GetPypiComponentDataByRepo(It.IsAny())).ReturnsAsync(aqlResultList); + + + UploadToArtifactory.jFrogService = jFrogServiceMock.Object; + + // Act + var result = await UploadToArtifactory.GetSrcRepoDetailsForComponent(item); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual("pypi-repo", result.Repo); + Assert.AreEqual("path/to/package", result.Path); + } + public async static Task GetSrcRepoDetailsForPyPiOrConanPackages_WhenConanRepoExists_ReturnsArtifactoryRepoName() + { + // Arrange + Property prop1 = new Property + { + Name = Dataconstant.Cdx_ArtifactoryRepoName, + Value = "Reponame" + }; + List properties = new List() { prop1 }; + var item = new Component + { + Purl = "conan://example-package", + Properties = properties, + Name = "conancomponent", + Version = "1.0.0" + }; + var aqlResultList = new List + { + new AqlResult + { + Repo = "conan-repo", + Path = "path/to/conancomponent/1.0.0", + Name = "conan component-1.0.0", + } + }; + + var jFrogServiceMock = new Mock(); + jFrogServiceMock.Setup(x => x.GetInternalComponentDataByRepo(It.IsAny())).ReturnsAsync(aqlResultList); + UploadToArtifactory.jFrogService = jFrogServiceMock.Object; + + // Act + var result = await UploadToArtifactory.GetSrcRepoDetailsForComponent(item); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual("conan-repo", result.Repo); + Assert.AreEqual("path/to/conancomponent/1.0.0", result.Path); + } + [Test] + public async Task GetSrcRepoDetailsForPyPiOrConanPackages_WhenNoRepoExists_ReturnsNull() + { + // Arrange + var item = new Component + { + Purl = "unknown://example-package" + }; + var jFrogServiceMock = new Mock(); + UploadToArtifactory.jFrogService = jFrogServiceMock.Object; + + // Act + var result = await UploadToArtifactory.GetSrcRepoDetailsForComponent(item); + + // Assert + Assert.IsNull(result); + } + private static List GetComponentList() + { + List componentLists = new List(); + Property propinternal = new Property + { + Name = Dataconstant.Cdx_IsInternal, + Value = "false" + }; + Property prop = new Property + { + Name = Dataconstant.Cdx_ClearingState, + Value = "APPROVED" + }; + Component comp1 = new Component + { + Name = "@angular/animations", + Version = "11.2.3", + Purl = "pkg:npm/%40angular/animations@11.0.4", + Properties = new List() + }; + comp1.Properties.Add(propinternal); + comp1.Properties.Add(prop); + componentLists.Add(comp1); + + Property prop1 = new Property + { + Name = Dataconstant.Cdx_ClearingState, + Value = "NEW_CLEARING" + }; + Component comp2 = new Component + { + Name = "@angular/core", + Version = "11.2.3", + Purl = "pkg:npm/%40angular/core@11.0.4", + Properties = new List() + }; + comp2.Properties.Add(propinternal); + comp2.Properties.Add(prop1); + componentLists.Add(comp2); + + Property prop2 = new Property + { + Name = Dataconstant.Cdx_ClearingState, + Value = "APPROVED" + }; + Component comp3 = new Component + { + Name = "NewtonsoftJson", + Version = "11.9.3", + Purl = "pkg:nuget/NewtonsoftJson@11.9.3", + Properties = new List() + }; + comp3.Properties.Add(propinternal); + comp3.Properties.Add(prop2); + componentLists.Add(comp3); + + Property prop3 = new Property + { + Name = Dataconstant.Cdx_ClearingState, + Value = "APPROVED" + }; + Component comp4 = new Component + { + Name = "adduser", + Version = "11.9.3", + Purl = "pkg:deb/adduser@11.9.3", + Properties = new List() + }; + comp4.Properties.Add(propinternal); + comp4.Properties.Add(prop3); + componentLists.Add(comp4); + return componentLists; + } + } +} diff --git a/src/ArtifactoryUploader/ArtifactoryUploader.cs b/src/ArtifactoryUploader/ArtifactoryUploader.cs index e31a4c1f..71562302 100644 --- a/src/ArtifactoryUploader/ArtifactoryUploader.cs +++ b/src/ArtifactoryUploader/ArtifactoryUploader.cs @@ -62,7 +62,7 @@ public static async Task UploadPackageToRepo(ComponentsToAr return responsemessage; } - await PackageUploadInformation.JfrogFoundPackagesAsync(component, displayPackagesInfo, operationType, responsemessage, dryRunSuffix); + await PackageUploadHelper.JfrogFoundPackagesAsync(component, displayPackagesInfo, operationType, responsemessage, dryRunSuffix); } catch (HttpRequestException ex) diff --git a/src/ArtifactoryUploader/JfrogRepoUpdater.cs b/src/ArtifactoryUploader/JfrogRepoUpdater.cs new file mode 100644 index 00000000..9597a79a --- /dev/null +++ b/src/ArtifactoryUploader/JfrogRepoUpdater.cs @@ -0,0 +1,206 @@ +using CycloneDX.Models; +using LCT.APICommunications.Model.AQL; +using LCT.APICommunications.Model; +using LCT.ArtifactoryUploader.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Net; +using LCT.Services; +using LCT.Services.Interface; +using log4net; +using System.Reflection; +using LCT.Common.Constants; + +namespace LCT.ArtifactoryUploader +{ + public class JfrogRepoUpdater + { + static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public static IJFrogService jFrogService { get; set; } + private static List aqlResultList = new(); + public static async Task UpdateJfrogRepoPathForSucessfullyUploadedItems(Bom m_ComponentsInBOM, + DisplayPackagesInfo displayPackagesInfo) + { + // Get details of sucessfully uploaded packages + List uploadedPackages = GetUploadePackageDetails(displayPackagesInfo); + + // Get the details of all the dest repo names from jfrog at once + List destRepoNames = uploadedPackages.Select(x => x.DestRepoName)?.Distinct()?.ToList() ?? new List(); + List jfrogPackagesListAql = await GetJfrogRepoInfoForAllTypePackages(destRepoNames); + + // Update the repo path + List bomComponents = UpdateJfroRepoPathProperty(m_ComponentsInBOM, uploadedPackages, jfrogPackagesListAql); + m_ComponentsInBOM.Components = bomComponents; + return m_ComponentsInBOM; + + } + private static List UpdateJfroRepoPathProperty(Bom m_ComponentsInBOM, + List uploadedPackages, + List jfrogPackagesListAql) + { + List bomComponents = m_ComponentsInBOM.Components; + foreach (var component in bomComponents) + { + // check component exists in upload list + var package = uploadedPackages.FirstOrDefault(x => x.Name.Contains($"{component.Name}") + && x.Version.Contains($"{component.Version}") && x.Purl.Contains(component.Purl)); + + // if component not exists in upload list move to nect item in the loop + if (package == null) { continue; } + + // get jfrog details of a component from the aqlresult set + string packageNameEXtension = GetPackageNameExtensionBasedOnComponentType(package); + AqlResult jfrogData = GetJfrogInfoOfThePackageUploaded(jfrogPackagesListAql, package, packageNameEXtension); + + // if package not exists in jfrog list move to nect item in the loop + if (jfrogData == null) { continue; } + + // Get path and update the component with new repo path property + string newRepoPath = GetJfrogRepoPath(jfrogData) ?? Dataconstant.JfrogRepoPathNotFound; + Property repoPathProperty = new() { Name = Dataconstant.Cdx_JfrogRepoPath, Value = newRepoPath }; + if (component.Properties == null) + { + component.Properties = new List { }; + component.Properties.Add(repoPathProperty); + continue; + } + + if (component.Properties.Exists(x => x.Name.Equals(Dataconstant.Cdx_JfrogRepoPath, StringComparison.OrdinalIgnoreCase))) + { + component + .Properties + .Find(x => x.Name.Equals(Dataconstant.Cdx_JfrogRepoPath, StringComparison.OrdinalIgnoreCase)) + .Value = newRepoPath; + continue; + } + + // if repo path property not exists + component.Properties.Add(repoPathProperty); + } + + return bomComponents; + } + private static string GetJfrogRepoPath(AqlResult aqlResult) + { + if (string.IsNullOrEmpty(aqlResult.Path) || aqlResult.Path.Equals(".")) + { + return $"{aqlResult.Repo}/{aqlResult.Name}"; + } + return $"{aqlResult.Repo}/{aqlResult.Path}/{aqlResult.Name}"; + } + private static AqlResult GetJfrogInfoOfThePackageUploaded(List jfrogPackagesListAql, ComponentsToArtifactory package, string packageNameEXtension) + { + string pkgType = package.ComponentType ?? string.Empty; + if (pkgType.Equals("CONAN", StringComparison.OrdinalIgnoreCase)) + { + return jfrogPackagesListAql.FirstOrDefault(x => x.Path.Contains(package.Name) + && x.Path.Contains(package.Version) + && x.Name.Contains($"package.{packageNameEXtension}")); + } + return jfrogPackagesListAql.FirstOrDefault(x => x.Path.Contains(package.Name) + && x.Name.Contains(package.Version) + && x.Name.Contains(packageNameEXtension)); + } + public static string GetPackageNameExtensionBasedOnComponentType(ComponentsToArtifactory package) + { + string packageNameEXtension = string.Empty; + if (package.ComponentType.Equals("NPM", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".tgz"; + } + if (package.ComponentType.Equals("NUGET", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".nupkg"; + } + if (package.ComponentType.Equals("MAVEN", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".jar"; + } + if (package.ComponentType.Equals("DEBIAN", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".deb"; + } + if (package.ComponentType.Equals("POETRY", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".whl"; + } + if (package.ComponentType.Equals("CONAN", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = "package.tgz"; + } + + return packageNameEXtension; + } + + public static async Task> GetJfrogRepoInfoForAllTypePackages(List destRepoNames) + { + if (destRepoNames != null && destRepoNames.Count > 0) + { + foreach (var repo in destRepoNames) + { + var result = await jFrogService.GetInternalComponentDataByRepo(repo) ?? new List(); + aqlResultList.AddRange(result); + } + } + + return aqlResultList; + } + public static List GetUploadePackageDetails(DisplayPackagesInfo displayPackagesInfo) + { + List uploadedPackages = new List(); + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesConan) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesMaven) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesNpm) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesNuget) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesPython) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesDebian) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + return uploadedPackages; + } + } +} diff --git a/src/ArtifactoryUploader/PackageUploadHelper.cs b/src/ArtifactoryUploader/PackageUploadHelper.cs index 7a4848ab..70f34c07 100644 --- a/src/ArtifactoryUploader/PackageUploadHelper.cs +++ b/src/ArtifactoryUploader/PackageUploadHelper.cs @@ -13,6 +13,7 @@ using LCT.ArtifactoryUploader.Model; using LCT.Common; using LCT.Common.Constants; +using LCT.Common.Interface; using LCT.Services.Interface; using log4net; using Newtonsoft.Json; @@ -24,6 +25,7 @@ using System.Net.Http; using System.Reflection; using System.Threading.Tasks; +using Directory = System.IO.Directory; namespace LCT.ArtifactoryUploader { @@ -62,259 +64,158 @@ public static Bom GetComponentListFromComparisonBOM(string comparisionBomFilePat } return componentsToBoms; } - - public async static Task> GetComponentsToBeUploadedToArtifactory(List comparisonBomData, - CommonAppSettings appSettings, - DisplayPackagesInfo displayPackagesInfo) + + private static Task GetPackageinfo(ComponentsToArtifactory item, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) { - Logger.Debug("Starting GetComponentsToBeUploadedToArtifactory() method"); - List componentsToBeUploaded = new List(); - foreach (var item in comparisonBomData) + ComponentsToArtifactory components = new ComponentsToArtifactory() { - var packageType = GetPackageType(item); - if (packageType != PackageType.Unknown) - { - AqlResult aqlResult = await GetSrcRepoDetailsForComponent(item); - ComponentsToArtifactory components = new ComponentsToArtifactory() - { - Name = !string.IsNullOrEmpty(item.Group) ? $"{item.Group}/{item.Name}" : item.Name, - PackageName = item.Name, - Version = item.Version, - Purl = item.Purl, - ComponentType = GetComponentType(item), - PackageType = packageType, - DryRun = appSettings.Jfrog.DryRun, - SrcRepoName = item.Properties.Find(s => s.Name == Dataconstant.Cdx_ArtifactoryRepoName)?.Value, - DestRepoName = GetDestinationRepo(item, appSettings), - Token = appSettings.Jfrog.Token, - JfrogApi = appSettings.Jfrog.URL - }; - - if (aqlResult != null) - { - components.SrcRepoPathWithFullName = aqlResult.Repo + "/" + aqlResult.Path + "/" + aqlResult.Name; - components.PypiOrNpmCompName = aqlResult.Name; - } - else - { - components.SrcRepoPathWithFullName = string.Empty; - components.PypiOrNpmCompName = string.Empty; - } - - components.Path = GetPackagePath(components, aqlResult); - components.CopyPackageApiUrl = GetCopyURL(components); - components.MovePackageApiUrl = GetMoveURL(components); - components.JfrogPackageName = GetJfrogPackageName(components); - componentsToBeUploaded.Add(components); - } - else - { - PackageUploader.uploaderKpiData.ComponentNotApproved++; - PackageUploader.uploaderKpiData.PackagesNotUploadedToJfrog++; - await PackageUploadInformation.AddUnknownPackagesAsync(item, displayPackagesInfo); - } - } - Logger.Debug("Ending GetComponentsToBeUploadedToArtifactory() method"); - return componentsToBeUploaded; - } - - private static PackageType GetPackageType(Component item) - { - string GetPropertyValue(string propertyName) => - item.Properties - .Find(p => p.Name == propertyName)? - .Value? - .ToUpperInvariant(); - - var propertyChecks = new Dictionary - { - { Dataconstant.Cdx_ClearingState, PackageType.ClearedThirdParty }, - { Dataconstant.Cdx_IsInternal, PackageType.Internal }, - { Dataconstant.Cdx_IsDevelopment, PackageType.Development } - }; + Name = item.Name, + Version = item.Version, + SrcRepoName = item.SrcRepoName, + DestRepoName = item.DestRepoName, + OperationType = operationType, + ResponseMessage = responseMessage, + DryRunSuffix = dryRunSuffix, + ComponentType = item.ComponentType, + Purl = item.Purl, + Token = item.Token, + CopyPackageApiUrl = item.CopyPackageApiUrl, + PackageName = item.PackageName, + PackageType = item.PackageType, - foreach (var check in propertyChecks) - { - if (GetPropertyValue(check.Key) == "TRUE" || (check.Key == Dataconstant.Cdx_ClearingState && GetPropertyValue(check.Key) == "APPROVED")) - { - return check.Value; - } - } + }; + return Task.FromResult(components); - return PackageType.Unknown; } - public static string GetCopyURL(ComponentsToArtifactory component) + private static Task GetSucessFulPackageinfo(ComponentsToArtifactory item) { - string url = component.ComponentType switch - { - "NPM" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoPathWithFullName}?to=/{component.DestRepoName}/{component.Path}/{component.PypiOrNpmCompName}", - "NUGET" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.PackageName}.{component.Version}{ApiConstant.NugetExtension}?to=/{component.DestRepoName}/{component.Name}.{component.Version}{ApiConstant.NugetExtension}", - "MAVEN" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Name}/{component.Version}?to=/{component.DestRepoName}/{component.Name}/{component.Version}", - "POETRY" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoPathWithFullName}?to=/{component.DestRepoName}/{component.PypiOrNpmCompName}", - "CONAN" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Path}?to=/{component.DestRepoName}/{component.Path}", - "DEBIAN" => $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*?to=/{component.DestRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*", - _ => string.Empty - }; - if (component.ComponentType == "CONAN") + ComponentsToArtifactory components = new ComponentsToArtifactory() { - component.Path = $"{component.Path}/*"; - } + Name = item.Name, + Version = item.Version, + SrcRepoName = item.SrcRepoName, + DestRepoName = item.DestRepoName, + SrcRepoPathWithFullName = item.SrcRepoPathWithFullName, + Path = item.Path, + PackageType = item.PackageType, + Purl = item.Purl, + + }; + return Task.FromResult(components); - return component.DryRun ? $"{url}&dry=1" : url; } + - public static string GetMoveURL(ComponentsToArtifactory component) + public static async Task JfrogNotFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) { - string url = component.ComponentType switch - { - "NPM" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoPathWithFullName}?to=/{component.DestRepoName}/{component.Path}/{component.PypiOrNpmCompName}", - "NUGET" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.PackageName}.{component.Version}{ApiConstant.NugetExtension}?to=/{component.DestRepoName}/{component.Name}.{component.Version}{ApiConstant.NugetExtension}", - "MAVEN" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Name}/{component.Version}?to=/{component.DestRepoName}/{component.Name}/{component.Version}", - "POETRY" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoPathWithFullName}?to=/{component.DestRepoName}/{component.PypiOrNpmCompName}", - "CONAN" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Path}?to=/{component.DestRepoName}/{component.Path}", - "DEBIAN" => $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*?to=/{component.DestRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*", - _ => string.Empty - }; - if (component.ComponentType == "CONAN") + if (item.ComponentType == "NPM") { - component.Path = $"{component.Path}/*"; + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesNpm.Add(components); } - - return component.DryRun ? $"{url}&dry=1" : url; - } - - private static string GetPackagePath(ComponentsToArtifactory component, AqlResult aqlResult) - { - return component.ComponentType switch + else if (item.ComponentType == "NUGET") { - "NPM" => aqlResult != null ? aqlResult.Path : $"{component.Name}/-", - "CONAN" when aqlResult != null => GetConanPackagePath(aqlResult.Path, component.Name, component.Version), - "MAVEN" => $"{component.Name}/{component.Version}", - "DEBIAN" => $"pool/main/{component.Name[0]}/{component.Name}", - _ => string.Empty - }; - } - - private static string GetConanPackagePath(string path, string name, string version) - { - string package = $"{name}/{version}"; - if (path.Contains(package)) + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesNuget.Add(components); + } + else if (item.ComponentType == "MAVEN") { - int index = path.IndexOf(package); - return path.Substring(0, index + package.Length); + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesMaven.Add(components); + } + else if (item.ComponentType == "POETRY") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesPython.Add(components); + } + else if (item.ComponentType == "CONAN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesConan.Add(components); + } + else if (item.ComponentType == "DEBIAN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.JfrogNotFoundPackagesDebian.Add(components); } - return path; - } - private static string GetJfrogPackageName(ComponentsToArtifactory component) - { - var packageNameFormats = new Dictionary> - { - { "NPM", c => c.PypiOrNpmCompName }, - { "NUGET", c => $"{c.PackageName}.{c.Version}{ApiConstant.NugetExtension}" }, - { "DEBIAN", c => $"{c.PackageName}_{c.Version.Replace(ApiConstant.DebianExtension, "") + "*"}" }, - { "POETRY", c => c.PypiOrNpmCompName } - }; - return packageNameFormats.TryGetValue(component.ComponentType, out var formatFunc) ? formatFunc(component) : string.Empty; } - private static string GetDestinationRepo(Component item, CommonAppSettings appSettings) + public static async Task JfrogFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) { - var packageType = GetPackageType(item); - var componentType = GetComponentType(item); - if (string.IsNullOrEmpty(componentType)) + if (item.ComponentType == "NPM") { - return string.Empty; + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesNpm.Add(components); } - - var repoMappings = new Dictionary>(StringComparer.OrdinalIgnoreCase) - { - { "npm", () => GetRepoName(packageType, appSettings.Npm.ReleaseRepo, appSettings.Npm.DevDepRepo, appSettings.Npm.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, - { "nuget", () => GetRepoName(packageType, appSettings.Nuget.ReleaseRepo, appSettings.Nuget.DevDepRepo, appSettings.Nuget.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, - { "maven", () => GetRepoName(packageType, appSettings.Maven.ReleaseRepo, appSettings.Maven.DevDepRepo, appSettings.Maven.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, - { "poetry", () => GetRepoName(packageType, appSettings.Poetry.ReleaseRepo, appSettings.Poetry.DevDepRepo, appSettings.Poetry.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, - { "conan", () => GetRepoName(packageType, appSettings.Conan.ReleaseRepo, appSettings.Conan.DevDepRepo, appSettings.Conan.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) }, - { "debian", () => GetRepoName(packageType, appSettings.Debian.ReleaseRepo, appSettings.Debian.DevDepRepo, appSettings.Debian.Artifactory.ThirdPartyRepos.FirstOrDefault(x => x.Upload)?.Name) } - }; - - return repoMappings.TryGetValue(componentType, out var getRepoName) ? getRepoName() : string.Empty; - } - - private static string GetRepoName(PackageType packageType, string internalRepo, string developmentRepo, string clearedThirdPartyRepo) - { - switch (packageType) - { - case PackageType.Internal: - return internalRepo; - case PackageType.Development: - return developmentRepo; - case PackageType.ClearedThirdParty: - return clearedThirdPartyRepo; - default: - return string.Empty; + else if (item.ComponentType == "NUGET") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesNuget.Add(components); } - } - - private static string GetComponentType(Component item) - { - var componentTypeMappings = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - { "npm", "NPM" }, - { "nuget", "NUGET" }, - { "maven", "MAVEN" }, - { "pypi", "POETRY" }, - { "conan", "CONAN" }, - { "pkg:deb/debian", "DEBIAN" } - }; - - foreach (var mapping in componentTypeMappings) + else if (item.ComponentType == "MAVEN") { - if (item.Purl.Contains(mapping.Key, StringComparison.OrdinalIgnoreCase)) - { - return mapping.Value; - } + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesMaven.Add(components); + } + else if (item.ComponentType == "POETRY") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesPython.Add(components); + } + else if (item.ComponentType == "CONAN") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesConan.Add(components); + } + else if (item.ComponentType == "DEBIAN") + { + ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); + displayPackagesInfo.JfrogFoundPackagesDebian.Add(components); } - return string.Empty; } - - public async static Task GetSrcRepoDetailsForComponent(Component item) + private static async Task SucessfullPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) { - if (item.Purl.Contains("pypi", StringComparison.OrdinalIgnoreCase)) + if (item.ComponentType == "NPM") { - // get the component list from Jfrog for given repo - aqlResultList = await GetPypiListOfComponentsFromRepo(new string[] { item.Properties.Find(x => x.Name == Dataconstant.Cdx_ArtifactoryRepoName)?.Value }, jFrogService); - if (aqlResultList.Count > 0) - { - return GetArtifactoryRepoName(aqlResultList, item); - } + + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesNpm.Add(components); } - else if (item.Purl.Contains("conan", StringComparison.OrdinalIgnoreCase)) + else if (item.ComponentType == "NUGET") { - var aqlConanResultList = await GetListOfComponentsFromRepo(new string[] { item.Properties.Find(x => x.Name == Dataconstant.Cdx_ArtifactoryRepoName)?.Value }, jFrogService); - - if (aqlConanResultList.Count > 0) - { - return GetArtifactoryRepoNameForConan(aqlConanResultList, item); - } + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesNuget.Add(components); } - else if (item.Purl.Contains("npm", StringComparison.OrdinalIgnoreCase)) + else if (item.ComponentType == "MAVEN") { - aqlResultList = await GetNpmListOfComponentsFromRepo(new string[] { item.Properties.Find(x => x.Name == Dataconstant.Cdx_ArtifactoryRepoName)?.Value }, jFrogService); - - if (aqlResultList.Count > 0) - { - return GetNpmArtifactoryRepoName(aqlResultList, item); - } + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesMaven.Add(components); + } + else if (item.ComponentType == "POETRY") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesPython.Add(components); + } + else if (item.ComponentType == "CONAN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesConan.Add(components); + } + else if (item.ComponentType == "DEBIAN") + { + ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); + displayPackagesInfo.SuccessfullPackagesDebian.Add(components); } - return null; } + public static async Task UploadingThePackages(List componentsToUpload, int timeout, DisplayPackagesInfo displayPackagesInfo) { Logger.Debug("Starting UploadingThePackages() method"); @@ -352,13 +253,13 @@ private static async Task PackageUploadToArtifactory(UploaderKpiData uploaderKpi { uploaderKpiData.PackagesNotExistingInRemoteCache++; item.DestRepoName = null; - await PackageUploadInformation.JfrogNotFoundPackagesAsync(item, displayPackagesInfo); + await JfrogNotFoundPackagesAsync(item, displayPackagesInfo); } } else { IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, true); - await PackageUploadInformation.SucessfullPackagesAsync(item, displayPackagesInfo); + await SucessfullPackagesAsync(item, displayPackagesInfo); item.DestRepoName = null; } } @@ -377,14 +278,14 @@ private static async Task SourceRepoFoundToUploadArtifactory(PackageType package } else if (responseMessage.ReasonPhrase == ApiConstant.PackageNotFound) { - await PackageUploadInformation.JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); + await JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, false); item.DestRepoName = null; SetWarningCode = true; } else if (responseMessage.ReasonPhrase == ApiConstant.ErrorInUpload) { - await PackageUploadInformation.JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); + await JfrogFoundPackagesAsync(item, displayPackagesInfo, operationType, responseMessage, dryRunSuffix); IncrementCountersBasedOnPackageType(uploaderKpiData, packageType, false); item.DestRepoName = null; var responseContent = await responseMessage.Content.ReadAsStringAsync(); @@ -497,85 +398,7 @@ private static void IncrementCountersBasedOnPackageType(UploaderKpiData uploader } } - public static async Task> GetListOfComponentsFromRepo(string[] repoList, IJFrogService jFrogService) - { - if (repoList != null && repoList.Length > 0) - { - foreach (var repo in repoList) - { - var test = await jFrogService.GetInternalComponentDataByRepo(repo) ?? new List(); - aqlResultList.AddRange(test); - } - } - - return aqlResultList; - } - public static async Task> GetPypiListOfComponentsFromRepo(string[] repoList, IJFrogService jFrogService) - { - if (repoList != null && repoList.Length > 0) - { - foreach (var repo in repoList) - { - var componentRepoData = await jFrogService.GetPypiComponentDataByRepo(repo) ?? new List(); - aqlResultList.AddRange(componentRepoData); - } - } - - return aqlResultList; - } - - public static async Task> GetNpmListOfComponentsFromRepo(string[] repoList, IJFrogService jFrogService) - { - if (repoList != null && repoList.Length > 0) - { - foreach (var repo in repoList) - { - var componentRepoData = await jFrogService.GetNpmComponentDataByRepo(repo) ?? new List(); - aqlResultList.AddRange(componentRepoData); - } - } - - return aqlResultList; - } - - private static AqlResult GetArtifactoryRepoName(List aqlResultList, Component component) - { - string jfrogpackageName = GetFullNameOfComponent(component); - return aqlResultList.Find(x => x.Properties != null && - x.Properties.Any(p => p.Key == "pypi.normalized.name" && p.Value == jfrogpackageName) && - x.Properties.Any(p => p.Key == "pypi.version" && p.Value == component.Version)); - } - - private static AqlResult GetNpmArtifactoryRepoName(List aqlResultList, Component component) - { - string jfrogpackageName = GetFullNameOfComponent(component); - return aqlResultList.Find(x => x.Properties != null && - x.Properties.Any(p => p.Key == "npm.name" && p.Value == jfrogpackageName) && - x.Properties.Any(p => p.Key == "npm.version" && p.Value == component.Version)); - } - - - private static AqlResult GetArtifactoryRepoNameForConan(List aqlResultList, Component component) - { - string jfrogcomponentPath = $"{component.Name}/{component.Version}"; - - AqlResult repoName = aqlResultList.Find(x => x.Path.Contains( - jfrogcomponentPath, StringComparison.OrdinalIgnoreCase)); - - return repoName; - } - - private static string GetFullNameOfComponent(Component item) - { - if (!string.IsNullOrEmpty(item.Group)) - { - return $"{item.Group}/{item.Name}"; - } - else - { - return item.Name; - } - } + public static void UpdateBomArtifactoryRepoUrl(ref Bom bom, List componentsUploaded) { foreach (var component in componentsUploaded) @@ -586,151 +409,8 @@ public static void UpdateBomArtifactoryRepoUrl(ref Bom bom, List x.Name == Dataconstant.Cdx_ArtifactoryRepoName).Value = component.DestRepoName; } } - } - - internal static async Task UpdateJfrogRepoPathForSucessfullyUploadedItems(Bom m_ComponentsInBOM, - DisplayPackagesInfo displayPackagesInfo) - { - // Get details of sucessfully uploaded packages - List uploadedPackages = GetUploadePackageDetails(displayPackagesInfo); - - // Get the details of all the dest repo names from jfrog at once - List destRepoNames = uploadedPackages.Select(x => x.DestRepoName)?.Distinct()?.ToList() ?? new List(); - List jfrogPackagesListAql = await GetJfrogRepoInfoForAllTypePackages(destRepoNames); - - // Update the repo path - List bomComponents = UpdateJfroRepoPathProperty(m_ComponentsInBOM, uploadedPackages, jfrogPackagesListAql); - m_ComponentsInBOM.Components = bomComponents; - return m_ComponentsInBOM; - - } - - private static List UpdateJfroRepoPathProperty(Bom m_ComponentsInBOM, - List uploadedPackages, - List jfrogPackagesListAql) - { - List bomComponents = m_ComponentsInBOM.Components; - foreach (var component in bomComponents) - { - // check component exists in upload list - var package = uploadedPackages.FirstOrDefault(x => x.Name.Contains($"{component.Name}") - && x.Version.Contains($"{component.Version}") && x.Purl.Contains(component.Purl)); - - // if component not exists in upload list move to nect item in the loop - if (package == null) { continue; } - - // get jfrog details of a component from the aqlresult set - string packageNameEXtension = GetPackageNameExtensionBasedOnComponentType(package); - AqlResult jfrogData = GetJfrogInfoOfThePackageUploaded(jfrogPackagesListAql, package, packageNameEXtension); - - // if package not exists in jfrog list move to nect item in the loop - if (jfrogData == null) { continue; } - - // Get path and update the component with new repo path property - string newRepoPath = GetJfrogRepoPath(jfrogData) ?? Dataconstant.JfrogRepoPathNotFound; - Property repoPathProperty = new() { Name = Dataconstant.Cdx_JfrogRepoPath, Value = newRepoPath }; - if (component.Properties == null) - { - component.Properties = new List { }; - component.Properties.Add(repoPathProperty); - continue; - } - - if (component.Properties.Exists(x => x.Name.Equals(Dataconstant.Cdx_JfrogRepoPath, StringComparison.OrdinalIgnoreCase))) - { - component - .Properties - .Find(x => x.Name.Equals(Dataconstant.Cdx_JfrogRepoPath, StringComparison.OrdinalIgnoreCase)) - .Value = newRepoPath; - continue; - } - - // if repo path property not exists - component.Properties.Add(repoPathProperty); - } - - return bomComponents; - } - - private static AqlResult GetJfrogInfoOfThePackageUploaded(List jfrogPackagesListAql, ComponentsToArtifactory package, string packageNameEXtension) - { - string pkgType = package.ComponentType ?? string.Empty; - if (pkgType.Equals("CONAN", StringComparison.OrdinalIgnoreCase)) - { - return jfrogPackagesListAql.FirstOrDefault(x => x.Path.Contains(package.Name) - && x.Path.Contains(package.Version) - && x.Name.Contains($"package.{packageNameEXtension}")); - } - return jfrogPackagesListAql.FirstOrDefault(x => x.Path.Contains(package.Name) - && x.Name.Contains(package.Version) - && x.Name.Contains(packageNameEXtension)); - } - - private static string GetJfrogRepoPath(AqlResult aqlResult) - { - if (string.IsNullOrEmpty(aqlResult.Path) || aqlResult.Path.Equals(".")) - { - return $"{aqlResult.Repo}/{aqlResult.Name}"; - } - return $"{aqlResult.Repo}/{aqlResult.Path}/{aqlResult.Name}"; - } - - public static string GetPackageNameExtensionBasedOnComponentType(ComponentsToArtifactory package) - { - var packageExtensions = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - { "NPM", ".tgz" }, - { "NUGET", ".nupkg" }, - { "MAVEN", ".jar" }, - { "DEBIAN", ".deb" }, - { "POETRY", ".whl" }, - { "CONAN", "package.tgz" } - }; - - return packageExtensions.TryGetValue(package.ComponentType, out var extension) ? extension : string.Empty; - } - - public static async Task> GetJfrogRepoInfoForAllTypePackages(List destRepoNames) - { - if (destRepoNames != null && destRepoNames.Count > 0) - { - foreach (var repo in destRepoNames) - { - var result = await jFrogService.GetInternalComponentDataByRepo(repo) ?? new List(); - aqlResultList.AddRange(result); - } - } - - return aqlResultList; - } - - public static List GetUploadePackageDetails(DisplayPackagesInfo displayPackagesInfo) - { - List uploadedPackages = new List(); - - var allPackages = new List> - { - displayPackagesInfo.JfrogFoundPackagesConan, - displayPackagesInfo.JfrogFoundPackagesMaven, - displayPackagesInfo.JfrogFoundPackagesNpm, - displayPackagesInfo.JfrogFoundPackagesNuget, - displayPackagesInfo.JfrogFoundPackagesPython, - displayPackagesInfo.JfrogFoundPackagesDebian - }; - - foreach (var packageList in allPackages) - { - foreach (var item in packageList) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - } - - return uploadedPackages; - } + } + } } diff --git a/src/ArtifactoryUploader/PackageUploadInformation.cs b/src/ArtifactoryUploader/PackageUploadInformation.cs index d10aa3d7..a5cb78e7 100644 --- a/src/ArtifactoryUploader/PackageUploadInformation.cs +++ b/src/ArtifactoryUploader/PackageUploadInformation.cs @@ -1,24 +1,21 @@ -using CycloneDX.Models; -using LCT.APICommunications; -using LCT.APICommunications.Model; +using LCT.APICommunications.Model; using LCT.ArtifactoryUploader.Model; -using LCT.Common; using LCT.Common.Constants; using LCT.Common.Interface; +using LCT.Common; using log4net; -using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net.Http; using System.Reflection; -using System.Threading.Tasks; +using LCT.APICommunications; using Directory = System.IO.Directory; +using Newtonsoft.Json; namespace LCT.ArtifactoryUploader { - public static class PackageUploadInformation + public class PackageUploadInformation { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public static DisplayPackagesInfo GetComponentsToBePackages() @@ -65,29 +62,6 @@ public static void DisplayPackageUploadInformation(DisplayPackagesInfo displayPa DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesDebian, displayPackagesInfo.JfrogNotFoundPackagesDebian, displayPackagesInfo.SuccessfullPackagesDebian, displayPackagesInfo.JfrogFoundPackagesDebian, "Debian", localPathforartifactory); } - public static string GettPathForArtifactoryUpload() - { - string localPathforartifactory = string.Empty; - try - { - String Todaysdate = DateTime.Now.ToString("dd-MM-yyyy_ss"); - localPathforartifactory = $"{Directory.GetParent(Directory.GetCurrentDirectory())}\\ClearingTool\\ArtifactoryFiles\\{Todaysdate}\\"; - if (!Directory.Exists(localPathforartifactory)) - { - localPathforartifactory = Directory.CreateDirectory(localPathforartifactory).ToString(); - } - } - catch (IOException ex) - { - Logger.Error($"GettPathForArtifactoryUpload() ", ex); - } - catch (UnauthorizedAccessException ex) - { - Logger.Error($"GettPathForArtifactoryUpload() ", ex); - } - - return localPathforartifactory; - } private static void DisplaySortedForeachComponents(List unknownPackages, List JfrogNotFoundPackages, List SucessfullPackages, List JfrogFoundPackages, string name, string filename) { if (unknownPackages.Any() || JfrogNotFoundPackages.Any() || SucessfullPackages.Any() || JfrogFoundPackages.Any()) @@ -100,302 +74,311 @@ private static void DisplaySortedForeachComponents(List } } - private static void DisplayErrorForUnknownPackages(List unknownPackages, string name, string filepath) + public static void DisplayErrorForJfrogFoundPackages(List JfrogFoundPackages) { - ProjectResponse projectResponse = new ProjectResponse(); - IFileOperations fileOperations = new FileOperations(); - var filename = Path.Combine(filepath, $"Artifactory_{FileConstant.artifactoryReportNotApproved}"); - var packageHandlers = new Dictionary, ProjectResponse, IFileOperations, string, string>> - { - { "Npm", GetNotApprovedNpmPackages }, - { "Nuget", GetNotApprovedNugetPackages }, - { "Conan", GetNotApprovedConanPackages }, - { "Debian", GetNotApprovedDebianPackages }, - { "Maven", GetNotApprovedMavenPackages }, - { "Poetry", GetNotApprovedPythonPackages } - }; - - if (unknownPackages.Any() && packageHandlers.TryGetValue(name, out var handler)) - { - handler(unknownPackages, projectResponse, fileOperations, filepath, filename); - } - } - public static void DisplayErrorForJfrogFoundPackages(List jfrogFoundPackages) - { - if (jfrogFoundPackages.Any()) + if (JfrogFoundPackages.Any()) { - foreach (var jfrogFoundPackage in jfrogFoundPackages) + + foreach (var jfrogFoundPackage in JfrogFoundPackages) { - switch (jfrogFoundPackage.ResponseMessage.ReasonPhrase) + + if (jfrogFoundPackage.ResponseMessage.ReasonPhrase == ApiConstant.ErrorInUpload) + { + Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} {jfrogFoundPackage.OperationType} Failed!! {jfrogFoundPackage.SrcRepoName} ---> {jfrogFoundPackage.DestRepoName}"); + } + else if (jfrogFoundPackage.ResponseMessage.ReasonPhrase == ApiConstant.PackageNotFound) { - case ApiConstant.ErrorInUpload: - Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} {jfrogFoundPackage.OperationType} Failed!! {jfrogFoundPackage.SrcRepoName} ---> {jfrogFoundPackage.DestRepoName}"); - break; - case ApiConstant.PackageNotFound: - Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} not found in {jfrogFoundPackage.SrcRepoName}, Upload Failed!!"); - break; - default: - Logger.Info($"Successful{jfrogFoundPackage.DryRunSuffix} {jfrogFoundPackage.OperationType} package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} from {jfrogFoundPackage.SrcRepoName} to {jfrogFoundPackage.DestRepoName}"); - break; + Logger.Error($"Package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version} not found in {jfrogFoundPackage.SrcRepoName}, Upload Failed!!"); } + else + { + Logger.Info($"Successful{jfrogFoundPackage.DryRunSuffix} {jfrogFoundPackage.OperationType} package {jfrogFoundPackage.Name}-{jfrogFoundPackage.Version}" + + $" from {jfrogFoundPackage.SrcRepoName} to {jfrogFoundPackage.DestRepoName}"); + } + } Logger.Info("\n"); + } } - public static void DisplayErrorForJfrogPackages(List jfrogNotFoundPackages) + + public static void DisplayErrorForJfrogPackages(List JfrogNotFoundPackages) { - if (jfrogNotFoundPackages.Any()) + + if (JfrogNotFoundPackages.Any()) { - jfrogNotFoundPackages - .ForEach(pkg => Logger.Warn($"Package {pkg.Name}-{pkg.Version} is not found in jfrog")); + foreach (var jfrogNotFoundPackage in JfrogNotFoundPackages) + { + Logger.Warn($"Package {jfrogNotFoundPackage.Name}-{jfrogNotFoundPackage.Version} is not found in jfrog"); + + } Logger.Info("\n"); + } } - private static void DisplayErrorForSucessfullPackages(List successfulPackages) + private static void DisplayErrorForSucessfullPackages(List SucessfullPackages) { - if (successfulPackages.Any()) + + if (SucessfullPackages.Any()) { - var packageMessages = successfulPackages - .Select(pkg => $"Package {pkg.Name}-{pkg.Version} is already uploaded") - .ToList(); - packageMessages.ForEach(Logger.Info); + foreach (var sucessfullPackage in SucessfullPackages) + { + Logger.Info($"Package {sucessfullPackage.Name}-{sucessfullPackage.Version} is already uploaded"); + } Logger.Info("\n"); + } } + private static void DisplayErrorForUnknownPackages(List unknownPackages, string name, string filepath) + { + ProjectResponse projectResponse = new ProjectResponse(); + IFileOperations fileOperations = new FileOperations(); + var filename = Path.Combine(filepath, $"Artifactory_{FileConstant.artifactoryReportNotApproved}"); - - private static void GetNotApprovedPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, - string filepath, - string filename, - Func> getComponents, - Action> setComponents) + if (unknownPackages.Any()) + { + var packageHandlers = new Dictionary, ProjectResponse, IFileOperations, string, string>> + { + { "Npm", GetNotApprovedNpmPackages }, + { "Nuget", GetNotApprovedNugetPackages }, + { "Conan", GetNotApprovedConanPackages }, + { "Debian", GetNotApprovedDebianPackages }, + { "Maven", GetNotApprovedMavenPackages }, + { "Poetry", GetNotApprovedPythonPackages } + }; + + if (packageHandlers.TryGetValue(name, out var handler)) + { + handler(unknownPackages, projectResponse, fileOperations, filepath, filename); + } + } + } + private static void GetNotApprovedNpmPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) { if (File.Exists(filename)) { string json = File.ReadAllText(filename); ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); - List components = new List(); - foreach (var package in unknownPackages) + List npmComponents = new List(); + foreach (var npmpackage in unknownPackages) { - JsonComponents jsonComponents = new JsonComponents - { - Name = package.Name, - Version = package.Version - }; - components.Add(jsonComponents); + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = npmpackage.Name; + jsonComponents.Version = npmpackage.Version; + npmComponents.Add(jsonComponents); } - setComponents(myDeserializedClass, components); + myDeserializedClass.Npm = npmComponents; fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + } else { - List components = new List(); - foreach (var package in unknownPackages) + projectResponse.Npm = new List(); + foreach (var npmpackage in unknownPackages) { - JsonComponents jsonComponents = new JsonComponents - { - Name = package.Name, - Version = package.Version - }; - components.Add(jsonComponents); + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = npmpackage.Name; + jsonComponents.Version = npmpackage.Version; + projectResponse.Npm.Add(jsonComponents); } - setComponents(projectResponse, components); fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); } Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); - } - private static void GetNotApprovedNpmPackages( - List unknownPackages, - ProjectResponse projectResponse, - IFileOperations fileOperations, - string filepath, - string filename) - { - GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Npm, (pr, components) => pr.Npm = components); } - - private static void GetNotApprovedNugetPackages( - List unknownPackages, - ProjectResponse projectResponse, - IFileOperations fileOperations, - string filepath, - string filename) + private static void GetNotApprovedNugetPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) { - GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Nuget, (pr, components) => pr.Nuget = components); + if (File.Exists(filename)) + { + string json = File.ReadAllText(filename); + ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); + List nugetComponents = new List(); + foreach (var nugetpackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = nugetpackage.Name; + jsonComponents.Version = nugetpackage.Version; + nugetComponents.Add(jsonComponents); + } + myDeserializedClass.Nuget = nugetComponents; + fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + } + else + { + projectResponse.Nuget = new List(); + foreach (var nugetpackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = nugetpackage.Name; + jsonComponents.Version = nugetpackage.Version; + projectResponse.Nuget.Add(jsonComponents); + } + fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + } + Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); } - - private static void GetNotApprovedConanPackages( - List unknownPackages, - ProjectResponse projectResponse, - IFileOperations fileOperations, - string filepath, - string filename) + private static void GetNotApprovedConanPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) { - GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Conan, (pr, components) => pr.Conan = components); - } + if (File.Exists(filename)) + { + string json = File.ReadAllText(filename); - private static void GetNotApprovedPythonPackages( - List unknownPackages, - ProjectResponse projectResponse, - IFileOperations fileOperations, - string filepath, - string filename) - { - GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Python, (pr, components) => pr.Python = components); - } + ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); + List conanComponents = new List(); + foreach (var conanpackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = conanpackage.Name; + jsonComponents.Version = conanpackage.Version; + conanComponents.Add(jsonComponents); + } + myDeserializedClass.Conan = conanComponents; + fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - public static void GetNotApprovedDebianPackages( - List unknownPackages, - ProjectResponse projectResponse, - IFileOperations fileOperations, - string filepath, - string filename) - { - GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Debian, (pr, components) => pr.Debian = components); - } - private static void GetNotApprovedMavenPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) - { - GetNotApprovedPackages(unknownPackages, projectResponse, fileOperations, filepath, filename, pr => pr.Maven, (pr, components) => pr.Maven = components); + } + else + { + projectResponse.Conan = new List(); + foreach (var conanpackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = conanpackage.Name; + jsonComponents.Version = conanpackage.Version; + projectResponse.Conan.Add(jsonComponents); + } + fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + } + Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); + } - public static async Task AddUnknownPackagesAsync(Component item, DisplayPackagesInfo displayPackagesInfo) + private static void GetNotApprovedPythonPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) { - string GetPropertyValue(string propertyName) => - item.Properties - .Find(p => p.Name == propertyName)? - .Value? - .ToUpperInvariant(); + if (File.Exists(filename)) + { + string json = File.ReadAllText(filename); - var packageLists = new Dictionary> - { - { "NPM", components => displayPackagesInfo.UnknownPackagesNpm.Add(components) }, - { "NUGET", components => displayPackagesInfo.UnknownPackagesNuget.Add(components) }, - { "MAVEN", components => displayPackagesInfo.UnknownPackagesMaven.Add(components) }, - { "POETRY", components => displayPackagesInfo.UnknownPackagesPython.Add(components) }, - { "CONAN", components => displayPackagesInfo.UnknownPackagesConan.Add(components) }, - { "DEBIAN", components => displayPackagesInfo.UnknownPackagesDebian.Add(components) } - }; - - var projectType = GetPropertyValue(Dataconstant.Cdx_ProjectType); - if (packageLists.TryGetValue(projectType, out var addComponent)) + ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); + List pythonComponents = new List(); + foreach (var pythonPackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = pythonPackage.Name; + jsonComponents.Version = pythonPackage.Version; + pythonComponents.Add(jsonComponents); + } + myDeserializedClass.Python = pythonComponents; + fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + + + } + else { - ComponentsToArtifactory components = await GetUnknownPackageinfo(item); - addComponent(components); + projectResponse.Python = new List(); + foreach (var pythonPackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = pythonPackage.Name; + jsonComponents.Version = pythonPackage.Version; + projectResponse.Python.Add(jsonComponents); + } + fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); } + Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); } - - public static async Task JfrogNotFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) + public static void GetNotApprovedDebianPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) { - var packageLists = new Dictionary> - { - { "NPM", components => displayPackagesInfo.JfrogNotFoundPackagesNpm.Add(components) }, - { "NUGET", components => displayPackagesInfo.JfrogNotFoundPackagesNuget.Add(components) }, - { "MAVEN", components => displayPackagesInfo.JfrogNotFoundPackagesMaven.Add(components) }, - { "POETRY", components => displayPackagesInfo.JfrogNotFoundPackagesPython.Add(components) }, - { "CONAN", components => displayPackagesInfo.JfrogNotFoundPackagesConan.Add(components) }, - { "DEBIAN", components => displayPackagesInfo.JfrogNotFoundPackagesDebian.Add(components) } - }; - - if (packageLists.TryGetValue(item.ComponentType, out var addComponent)) + if (File.Exists(filename)) { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - addComponent(components); - } - } + string json = File.ReadAllText(filename); - public static async Task JfrogFoundPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) - { - var packageLists = new Dictionary> - { - { "NPM", components => displayPackagesInfo.JfrogFoundPackagesNpm.Add(components) }, - { "NUGET", components => displayPackagesInfo.JfrogFoundPackagesNuget.Add(components) }, - { "MAVEN", components => displayPackagesInfo.JfrogFoundPackagesMaven.Add(components) }, - { "POETRY", components => displayPackagesInfo.JfrogFoundPackagesPython.Add(components) }, - { "CONAN", components => displayPackagesInfo.JfrogFoundPackagesConan.Add(components) }, - { "DEBIAN", components => displayPackagesInfo.JfrogFoundPackagesDebian.Add(components) } - }; - - if (packageLists.TryGetValue(item.ComponentType, out var addComponent)) + ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); + List debianComponents = new List(); + foreach (var debianPackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = debianPackage.Name; + jsonComponents.Version = debianPackage.Version; + debianComponents.Add(jsonComponents); + } + myDeserializedClass.Debian = debianComponents; + fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + + + } + else { - ComponentsToArtifactory components = await GetPackageinfo(item, operationType, responseMessage, dryRunSuffix); - addComponent(components); + projectResponse.Debian = new List(); + foreach (var debianPackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = debianPackage.Name; + jsonComponents.Version = debianPackage.Version; + projectResponse.Debian.Add(jsonComponents); + } + fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); } + Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); } - private static Task GetUnknownPackageinfo(Component item) + private static void GetNotApprovedMavenPackages(List unknownPackages, ProjectResponse projectResponse, IFileOperations fileOperations, string filepath, string filename) { - - ComponentsToArtifactory components = new ComponentsToArtifactory() + if (File.Exists(filename)) { - Name = item.Name, - Version = item.Version - }; - return Task.FromResult(components); + string json = File.ReadAllText(filename); - } + ProjectResponse myDeserializedClass = JsonConvert.DeserializeObject(json); + List mavenComponents = new List(); + foreach (var mavenPackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = mavenPackage.Name; + jsonComponents.Version = mavenPackage.Version; + mavenComponents.Add(jsonComponents); + } + myDeserializedClass.Maven = mavenComponents; + fileOperations.WriteContentToReportNotApprovedFile(myDeserializedClass, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); - private static Task GetPackageinfo(ComponentsToArtifactory item, string operationType, HttpResponseMessage responseMessage, string dryRunSuffix) - { - ComponentsToArtifactory components = new ComponentsToArtifactory() + } + else { - Name = item.Name, - Version = item.Version, - SrcRepoName = item.SrcRepoName, - DestRepoName = item.DestRepoName, - OperationType = operationType, - ResponseMessage = responseMessage, - DryRunSuffix = dryRunSuffix, - ComponentType = item.ComponentType, - Purl = item.Purl, - Token = item.Token, - CopyPackageApiUrl = item.CopyPackageApiUrl, - PackageName = item.PackageName, - PackageType = item.PackageType, - - }; - return Task.FromResult(components); - + projectResponse.Maven = new List(); + foreach (var mavenPackage in unknownPackages) + { + JsonComponents jsonComponents = new JsonComponents(); + jsonComponents.Name = mavenPackage.Name; + jsonComponents.Version = mavenPackage.Version; + projectResponse.Maven.Add(jsonComponents); + } + fileOperations.WriteContentToReportNotApprovedFile(projectResponse, filepath, FileConstant.artifactoryReportNotApproved, "Artifactory"); + } + Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); } - public static async Task SucessfullPackagesAsync(ComponentsToArtifactory item, DisplayPackagesInfo displayPackagesInfo) + public static string GettPathForArtifactoryUpload() { - var successPackageLists = new Dictionary> - { - { "NPM", components => displayPackagesInfo.SuccessfullPackagesNpm.Add(components) }, - { "NUGET", components => displayPackagesInfo.SuccessfullPackagesNuget.Add(components) }, - { "MAVEN", components => displayPackagesInfo.SuccessfullPackagesMaven.Add(components) }, - { "POETRY", components => displayPackagesInfo.SuccessfullPackagesPython.Add(components) }, - { "CONAN", components => displayPackagesInfo.SuccessfullPackagesConan.Add(components) }, - { "DEBIAN", components => displayPackagesInfo.SuccessfullPackagesDebian.Add(components) } - }; - - if (successPackageLists.TryGetValue(item.ComponentType, out var addComponent)) + string localPathforartifactory = string.Empty; + try { - ComponentsToArtifactory components = await GetSucessFulPackageinfo(item); - addComponent(components); + String Todaysdate = DateTime.Now.ToString("dd-MM-yyyy_ss"); + localPathforartifactory = $"{Directory.GetParent(Directory.GetCurrentDirectory())}\\ClearingTool\\ArtifactoryFiles\\{Todaysdate}\\"; + if (!Directory.Exists(localPathforartifactory)) + { + localPathforartifactory = Directory.CreateDirectory(localPathforartifactory).ToString(); + } } - } - private static Task GetSucessFulPackageinfo(ComponentsToArtifactory item) - { - - ComponentsToArtifactory components = new ComponentsToArtifactory() + catch (IOException ex) { - Name = item.Name, - Version = item.Version, - SrcRepoName = item.SrcRepoName, - DestRepoName = item.DestRepoName, - SrcRepoPathWithFullName = item.SrcRepoPathWithFullName, - Path = item.Path, - PackageType = item.PackageType, - Purl = item.Purl, - - }; - return Task.FromResult(components); + Logger.Error($"GettPathForArtifactoryUpload() ", ex); + } + catch (UnauthorizedAccessException ex) + { + Logger.Error($"GettPathForArtifactoryUpload() ", ex); + } + return localPathforartifactory; } - } } diff --git a/src/ArtifactoryUploader/PackageUploader.cs b/src/ArtifactoryUploader/PackageUploader.cs index 70d61ee1..6452801f 100644 --- a/src/ArtifactoryUploader/PackageUploader.cs +++ b/src/ArtifactoryUploader/PackageUploader.cs @@ -41,7 +41,7 @@ public static async Task UploadPackageToArtifactory(CommonAppSettings appSetting DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages(); - List m_ComponentsToBeUploaded = await PackageUploadHelper.GetComponentsToBeUploadedToArtifactory(m_ComponentsInBOM.Components, appSettings, displayPackagesInfo); + List m_ComponentsToBeUploaded = await UploadToArtifactory.GetComponentsToBeUploadedToArtifactory(m_ComponentsInBOM.Components, appSettings, displayPackagesInfo); //Uploading the component to artifactory uploaderKpiData.PackagesToBeUploaded = m_ComponentsToBeUploaded.Count(x => x.PackageType == PackageType.ClearedThirdParty); @@ -60,7 +60,7 @@ public static async Task UploadPackageToArtifactory(CommonAppSettings appSetting PackageUploadHelper.UpdateBomArtifactoryRepoUrl(ref m_ComponentsInBOM, m_ComponentsToBeUploaded); //update Jfrog Repository Path For Successfully Uploaded Items - m_ComponentsInBOM = await PackageUploadHelper.UpdateJfrogRepoPathForSucessfullyUploadedItems(m_ComponentsInBOM, displayPackagesInfo); + m_ComponentsInBOM = await JfrogRepoUpdater.UpdateJfrogRepoPathForSucessfullyUploadedItems(m_ComponentsInBOM, displayPackagesInfo); var formattedString = CycloneDX.Json.Serializer.Serialize(m_ComponentsInBOM); diff --git a/src/ArtifactoryUploader/UploadToArtifactory.cs b/src/ArtifactoryUploader/UploadToArtifactory.cs new file mode 100644 index 00000000..27944d9e --- /dev/null +++ b/src/ArtifactoryUploader/UploadToArtifactory.cs @@ -0,0 +1,477 @@ +using LCT.APICommunications.Model.AQL; +using LCT.APICommunications.Model; +using LCT.ArtifactoryUploader.Model; +using LCT.Common; +using CycloneDX.Models; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using log4net; +using System.Reflection; +using LCT.Common.Constants; +using LCT.Services; +using System; +using LCT.Services.Interface; +using LCT.APICommunications; + +namespace LCT.ArtifactoryUploader +{ + public class UploadToArtifactory + { + static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public static IJFrogService jFrogService { get; set; } + private static List aqlResultList = new(); + public async static Task> GetComponentsToBeUploadedToArtifactory(List comparisonBomData, + CommonAppSettings appSettings, + DisplayPackagesInfo displayPackagesInfo) + { + Logger.Debug("Starting GetComponentsToBeUploadedToArtifactory() method"); + List componentsToBeUploaded = new List(); + + foreach (var item in comparisonBomData) + { + var packageType = GetPackageType(item); + if (packageType != PackageType.Unknown) + { + AqlResult aqlResult = await GetSrcRepoDetailsForComponent(item); + ComponentsToArtifactory components = new ComponentsToArtifactory() + { + Name = !string.IsNullOrEmpty(item.Group) ? $"{item.Group}/{item.Name}" : item.Name, + PackageName = item.Name, + Version = item.Version, + Purl = item.Purl, + ComponentType = GetComponentType(item), + PackageType = packageType, + DryRun = appSettings.Jfrog.DryRun, + SrcRepoName = item.Properties.Find(s => s.Name == Dataconstant.Cdx_ArtifactoryRepoName)?.Value, + DestRepoName = GetDestinationRepo(item, appSettings), + Token = appSettings.Jfrog.Token, + JfrogApi = appSettings.Jfrog.URL + }; + + if (aqlResult != null) + { + components.SrcRepoPathWithFullName = aqlResult.Repo + "/" + aqlResult.Path + "/" + aqlResult.Name; + components.PypiOrNpmCompName = aqlResult.Name; + } + else + { + components.SrcRepoPathWithFullName = string.Empty; + components.PypiOrNpmCompName = string.Empty; + } + + components.Path = GetPackagePath(components, aqlResult); + components.CopyPackageApiUrl = GetCopyURL(components); + components.MovePackageApiUrl = GetMoveURL(components); + components.JfrogPackageName = GetJfrogPackageName(components); + componentsToBeUploaded.Add(components); + } + else + { + PackageUploader.uploaderKpiData.ComponentNotApproved++; + PackageUploader.uploaderKpiData.PackagesNotUploadedToJfrog++; + await AddUnknownPackagesAsync(item, displayPackagesInfo); + } + } + Logger.Debug("Ending GetComponentsToBeUploadedToArtifactory() method"); + return componentsToBeUploaded; + } + private static string GetComponentType(Component item) + { + + if (item.Purl.Contains("npm", StringComparison.OrdinalIgnoreCase)) + { + return "NPM"; + } + else if (item.Purl.Contains("nuget", StringComparison.OrdinalIgnoreCase)) + { + return "NUGET"; + } + else if (item.Purl.Contains("maven", StringComparison.OrdinalIgnoreCase)) + { + return "MAVEN"; + } + else if (item.Purl.Contains("pypi", StringComparison.OrdinalIgnoreCase)) + { + return "POETRY"; + } + else if (item.Purl.Contains("conan", StringComparison.OrdinalIgnoreCase)) + { + return "CONAN"; + } + else if (item.Purl.Contains("pkg:deb/debian", StringComparison.OrdinalIgnoreCase)) + { + return "DEBIAN"; + } + else + { + // Do nothing + } + return string.Empty; + } + + private static string GetDestinationRepo(Component item, CommonAppSettings appSettings) + { + var packageType = GetPackageType(item); + var componentType = GetComponentType(item); + + if (!string.IsNullOrEmpty(componentType)) + { + switch (componentType.ToLower()) + { + case "npm": + return GetRepoName(packageType, appSettings.Npm.ReleaseRepo, appSettings.Npm.DevDepRepo, appSettings.Npm.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); + case "nuget": + return GetRepoName(packageType, appSettings.Nuget.ReleaseRepo, appSettings.Nuget.DevDepRepo, appSettings.Nuget.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); + case "maven": + return GetRepoName(packageType, appSettings.Maven.ReleaseRepo, appSettings.Maven.DevDepRepo, appSettings.Maven.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); + case "poetry": + return GetRepoName(packageType, appSettings.Poetry.ReleaseRepo, appSettings.Poetry.DevDepRepo, appSettings.Poetry.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); + case "conan": + return GetRepoName(packageType, appSettings.Conan.ReleaseRepo, appSettings.Conan.DevDepRepo, appSettings.Conan.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); + case "debian": + return GetRepoName(packageType, appSettings.Debian.ReleaseRepo, appSettings.Debian.DevDepRepo, appSettings.Debian.Artifactory.ThirdPartyRepos.Where(x => x.Upload.Equals(true)).FirstOrDefault()?.Name); + } + } + + return string.Empty; + } + + private static string GetPackagePath(ComponentsToArtifactory component, AqlResult aqlResult) + { + switch (component.ComponentType) + { + case "NPM": + if (aqlResult != null) + { + return $"{aqlResult.Path}"; + } + else + { + return $"{component.Name}/-"; + } + + case "CONAN" when aqlResult != null: + string path = aqlResult.Path; + string package = $"{component.Name}/{component.Version}"; + + if (path.Contains(package)) + { + int index = path.IndexOf(package); + return path.Substring(0, index + package.Length); + } + else + { + return path; + } + + case "MAVEN": + return $"{component.Name}/{component.Version}"; + + case "DEBIAN": + return $"pool/main/{component.Name[0]}/{component.Name}"; + default: + return string.Empty; + } + } + public static string GetCopyURL(ComponentsToArtifactory component) + { + string url = string.Empty; + if (component.ComponentType == "NPM") + { + url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoPathWithFullName}" + + $"?to=/{component.DestRepoName}/{component.Path}/{component.PypiOrNpmCompName}"; + + } + else if (component.ComponentType == "NUGET") + { + url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.PackageName}.{component.Version}" + + $"{ApiConstant.NugetExtension}?to=/{component.DestRepoName}/{component.Name}.{component.Version}{ApiConstant.NugetExtension}"; + } + else if (component.ComponentType == "MAVEN") + { + url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Name}/{component.Version}" + + $"?to=/{component.DestRepoName}/{component.Name}/{component.Version}"; + } + else if (component.ComponentType == "POETRY") + { + url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoPathWithFullName}" + + $"?to=/{component.DestRepoName}/{component.PypiOrNpmCompName}"; + } + else if (component.ComponentType == "CONAN") + { + url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Path}" + + $"?to=/{component.DestRepoName}/{component.Path}"; + // Add a wild card to the path end for jFrog AQL query search + component.Path = $"{component.Path}/*"; + } + else if (component.ComponentType == "DEBIAN") + { + url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*" + + $"?to=/{component.DestRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*"; + } + else + { + // Do nothing + } + return component.DryRun ? $"{url}&dry=1" : url; + } + + public static string GetMoveURL(ComponentsToArtifactory component) + { + string url = string.Empty; + if (component.ComponentType == "NPM") + { + url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoPathWithFullName}" + + $"?to=/{component.DestRepoName}/{component.Path}/{component.PypiOrNpmCompName}"; + + } + else if (component.ComponentType == "NUGET") + { + url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.PackageName}.{component.Version}" + + $"{ApiConstant.NugetExtension}?to=/{component.DestRepoName}/{component.Name}.{component.Version}{ApiConstant.NugetExtension}"; + } + else if (component.ComponentType == "MAVEN") + { + url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Name}/{component.Version}" + + $"?to=/{component.DestRepoName}/{component.Name}/{component.Version}"; + } + else if (component.ComponentType == "POETRY") + { + url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoPathWithFullName}" + + $"?to=/{component.DestRepoName}/{component.PypiOrNpmCompName}"; + } + else if (component.ComponentType == "CONAN") + { + url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Path}" + + $"?to=/{component.DestRepoName}/{component.Path}"; + // Add a wild card to the path end for jFrog AQL query search + component.Path = $"{component.Path}/*"; + } + else if (component.ComponentType == "DEBIAN") + { + url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*" + + $"?to=/{component.DestRepoName}/{component.Path}/{component.Name}_{component.Version.Replace(ApiConstant.DebianExtension, "")}*"; + } + else + { + // Do nothing + } + return component.DryRun ? $"{url}&dry=1" : url; + } + + private static string GetJfrogPackageName(ComponentsToArtifactory component) + { + return component.ComponentType switch + { + "NPM" => component.PypiOrNpmCompName, + "NUGET" => $"{component.PackageName}.{component.Version}{ApiConstant.NugetExtension}", + "DEBIAN" => $"{component.PackageName}_{component.Version.Replace(ApiConstant.DebianExtension, "") + "*"}", + "POETRY" => component.PypiOrNpmCompName, + _ => string.Empty, + }; + } + + private static async Task AddUnknownPackagesAsync(Component item, DisplayPackagesInfo displayPackagesInfo) + { + string GetPropertyValue(string propertyName) => + item.Properties + .Find(p => p.Name == propertyName)? + .Value? + .ToUpperInvariant(); + + if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "NPM") + { + + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesNpm.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "NUGET") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesNuget.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "MAVEN") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesMaven.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "POETRY") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesPython.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "CONAN") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesConan.Add(components); + } + else if (GetPropertyValue(Dataconstant.Cdx_ProjectType) == "DEBIAN") + { + ComponentsToArtifactory components = await GetUnknownPackageinfo(item); + displayPackagesInfo.UnknownPackagesDebian.Add(components); + } + + } + + private static Task GetUnknownPackageinfo(Component item) + { + + ComponentsToArtifactory components = new ComponentsToArtifactory() + { + Name = item.Name, + Version = item.Version + }; + return Task.FromResult(components); + + } + + private static string GetRepoName(PackageType packageType, string internalRepo, string developmentRepo, string clearedThirdPartyRepo) + { + switch (packageType) + { + case PackageType.Internal: + return internalRepo; + case PackageType.Development: + return developmentRepo; + case PackageType.ClearedThirdParty: + return clearedThirdPartyRepo; + default: + return string.Empty; + } + } + public async static Task GetSrcRepoDetailsForComponent(Component item) + { + if (item.Purl.Contains("pypi", StringComparison.OrdinalIgnoreCase)) + { + // get the component list from Jfrog for given repo + aqlResultList = await GetPypiListOfComponentsFromRepo(new string[] { item.Properties.Find(x => x.Name == Dataconstant.Cdx_ArtifactoryRepoName)?.Value }, jFrogService); + if (aqlResultList.Count > 0) + { + return GetArtifactoryRepoName(aqlResultList, item); + } + } + else if (item.Purl.Contains("conan", StringComparison.OrdinalIgnoreCase)) + { + var aqlConanResultList = await GetListOfComponentsFromRepo(new string[] { item.Properties.Find(x => x.Name == Dataconstant.Cdx_ArtifactoryRepoName)?.Value }, jFrogService); + + if (aqlConanResultList.Count > 0) + { + return GetArtifactoryRepoNameForConan(aqlConanResultList, item); + } + } + else if (item.Purl.Contains("npm", StringComparison.OrdinalIgnoreCase)) + { + aqlResultList = await GetNpmListOfComponentsFromRepo(new string[] { item.Properties.Find(x => x.Name == Dataconstant.Cdx_ArtifactoryRepoName)?.Value }, jFrogService); + + if (aqlResultList.Count > 0) + { + return GetNpmArtifactoryRepoName(aqlResultList, item); + } + } + + return null; + } + public static async Task> GetNpmListOfComponentsFromRepo(string[] repoList, IJFrogService jFrogService) + { + if (repoList != null && repoList.Length > 0) + { + foreach (var repo in repoList) + { + var componentRepoData = await jFrogService.GetNpmComponentDataByRepo(repo) ?? new List(); + aqlResultList.AddRange(componentRepoData); + } + } + + return aqlResultList; + } + public static async Task> GetListOfComponentsFromRepo(string[] repoList, IJFrogService jFrogService) + { + if (repoList != null && repoList.Length > 0) + { + foreach (var repo in repoList) + { + var test = await jFrogService.GetInternalComponentDataByRepo(repo) ?? new List(); + aqlResultList.AddRange(test); + } + } + + return aqlResultList; + } + private static AqlResult GetArtifactoryRepoName(List aqlResultList, Component component) + { + string jfrogpackageName = GetFullNameOfComponent(component); + return aqlResultList.Find(x => x.Properties != null && + x.Properties.Any(p => p.Key == "pypi.normalized.name" && p.Value == jfrogpackageName) && + x.Properties.Any(p => p.Key == "pypi.version" && p.Value == component.Version)); + } + + private static AqlResult GetNpmArtifactoryRepoName(List aqlResultList, Component component) + { + string jfrogpackageName = GetFullNameOfComponent(component); + return aqlResultList.Find(x => x.Properties != null && + x.Properties.Any(p => p.Key == "npm.name" && p.Value == jfrogpackageName) && + x.Properties.Any(p => p.Key == "npm.version" && p.Value == component.Version)); + } + private static string GetFullNameOfComponent(Component item) + { + if (!string.IsNullOrEmpty(item.Group)) + { + return $"{item.Group}/{item.Name}"; + } + else + { + return item.Name; + } + } + + private static AqlResult GetArtifactoryRepoNameForConan(List aqlResultList, Component component) + { + string jfrogcomponentPath = $"{component.Name}/{component.Version}"; + + AqlResult repoName = aqlResultList.Find(x => x.Path.Contains( + jfrogcomponentPath, StringComparison.OrdinalIgnoreCase)); + + return repoName; + } + + public static async Task> GetPypiListOfComponentsFromRepo(string[] repoList, IJFrogService jFrogService) + { + if (repoList != null && repoList.Length > 0) + { + foreach (var repo in repoList) + { + var componentRepoData = await jFrogService.GetPypiComponentDataByRepo(repo) ?? new List(); + aqlResultList.AddRange(componentRepoData); + } + } + + return aqlResultList; + } + private static PackageType GetPackageType(Component item) + { + string GetPropertyValue(string propertyName) => + item.Properties + .Find(p => p.Name == propertyName)? + .Value? + .ToUpperInvariant(); + + if (GetPropertyValue(Dataconstant.Cdx_ClearingState) == "APPROVED") + { + return PackageType.ClearedThirdParty; + } + else if (GetPropertyValue(Dataconstant.Cdx_IsInternal) == "TRUE") + { + return PackageType.Internal; + } + else if (GetPropertyValue(Dataconstant.Cdx_IsDevelopment) == "TRUE") + { + return PackageType.Development; + } + + return PackageType.Unknown; + } + + } +} diff --git a/src/LCT.PackageIdentifier.UTest/DisplayInformationTests.cs b/src/LCT.PackageIdentifier.UTest/DisplayInformationTests.cs new file mode 100644 index 00000000..8cc0aec5 --- /dev/null +++ b/src/LCT.PackageIdentifier.UTest/DisplayInformationTests.cs @@ -0,0 +1,140 @@ +using LCT.Common; +using LCT.Common.Model; +using NUnit.Framework; +using System.Collections.Generic; + +namespace LCT.PackageIdentifier.Tests +{ + [TestFixture] + public class DisplayInformationTests + { + private CommonAppSettings appSettings; + + [SetUp] + public void Setup() + { + appSettings = new CommonAppSettings(); + } + + [TestCase("NPM", "p*-lock.json,*.cdx.json", "node_modules,Test", "Npm-Test")] + [TestCase("NUGET", "p*-lock.json,*.cdx.json", "package,Test", "Nuget-Test")] + [TestCase("MAVEN", "*.cdx.json", "package,Test", "Maven-Test")] + [TestCase("DEBIAN", "*.cdx.json", "package,Test", "Debian-Test")] + [TestCase("POETRY", "Poetry.lock,*.cdx.json", "package,Test", "Poetry-Test")] + [TestCase("CONAN", "conan.lock,*.cdx.json", "package,Test", "Conan-Test")] + [TestCase("ALPINE", "*.cdx.json", "package,Test", "Alpine-Test")] + public void DisplayIncludeFiles_ValidProjectType_ReturnsIncludeFiles(string projectType, string expectedInclude, string expectedExclude, string expectedRepos) + { + SetupAppSettings(projectType, expectedInclude, expectedExclude, expectedRepos); + string result = DisplayInformation.DisplayIncludeFiles(appSettings); + Assert.AreEqual(expectedInclude, result); + } + + [TestCase("NPM", "p*-lock.json,*.cdx.json", "node_modules,Test", "Npm-Test")] + [TestCase("NUGET", "p*-lock.json,*.cdx.json", "package,Test", "Nuget-Test")] + [TestCase("MAVEN", "*.cdx.json", "package,Test", "Maven-Test")] + [TestCase("DEBIAN", "*.cdx.json", "package,Test", "Debian-Test")] + [TestCase("POETRY", "Poetry.lock,*.cdx.json", "package,Test", "Poetry-Test")] + [TestCase("CONAN", "conan.lock,*.cdx.json", "package,Test", "Conan-Test")] + [TestCase("ALPINE", "*.cdx.json", "package,Test", "Alpine-Test")] + public void DisplayExcludeFiles_ValidProjectType_ReturnsExcludeFiles(string projectType, string expectedInclude, string expectedExclude, string expectedRepos) + { + SetupAppSettings(projectType, expectedInclude, expectedExclude, expectedRepos); + string result = DisplayInformation.DisplayExcludeFiles(appSettings); + Assert.AreEqual(expectedExclude, result); + } + + [TestCase("NPM", "p*-lock.json,*.cdx.json", "node_modules,Test", "Npm-Test")] + [TestCase("NUGET", "p*-lock.json,*.cdx.json", "package,Test", "Nuget-Test")] + [TestCase("MAVEN", "*.cdx.json", "package,Test", "Maven-Test")] + [TestCase("DEBIAN", "*.cdx.json", "package,Test", "Debian-Test")] + [TestCase("POETRY", "Poetry.lock,*.cdx.json", "package,Test", "Poetry-Test")] + [TestCase("CONAN", "conan.lock,*.cdx.json", "package,Test", "Conan-Test")] + [TestCase("ALPINE", "*.cdx.json", "package,Test", "Alpine-Test")] + public void GetInternalRepolist_ValidProjectType_ReturnsInternalRepos(string projectType, string expectedInclude, string expectedExclude, string expectedRepos) + { + SetupAppSettings(projectType, expectedInclude, expectedExclude, expectedRepos); + string result = DisplayInformation.GetInternalRepolist(appSettings); + Assert.AreEqual(expectedRepos, result); + } + + [Test] + public void DisplayIncludeFiles_InvalidProjectType_ReturnsEmptyString() + { + appSettings.ProjectType = "INVALID"; + string result = DisplayInformation.DisplayIncludeFiles(appSettings); + Assert.AreEqual(string.Empty, result); + } + + [Test] + public void DisplayExcludeFiles_InvalidProjectType_ReturnsEmptyString() + { + appSettings.ProjectType = "INVALID"; + string result = DisplayInformation.DisplayExcludeFiles(appSettings); + Assert.AreEqual(string.Empty, result); + } + + [Test] + public void GetInternalRepolist_InvalidProjectType_ReturnsEmptyString() + { + appSettings.ProjectType = "INVALID"; + string result = DisplayInformation.GetInternalRepolist(appSettings); + Assert.AreEqual(string.Empty, result); + } + + [Test] + public void DisplayExcludeComponents_ValidExcludeComponents_ReturnsExcludeComponents() + { + appSettings.SW360 = new SW360 + { + ExcludeComponents = new List { "component1", "component2" } + }; + string result = DisplayInformation.DisplayExcludeComponents(appSettings); + Assert.AreEqual("component1,component2", result); + } + + [Test] + public void DisplayExcludeComponents_NullExcludeComponents_ReturnsEmptyString() + { + appSettings.SW360 = new SW360 + { + ExcludeComponents = null + }; + string result = DisplayInformation.DisplayExcludeComponents(appSettings); + Assert.AreEqual(string.Empty, result); + } + + private void SetupAppSettings(string projectType, string include, string exclude, string repos) + { + appSettings.ProjectType = projectType; + var includeList = include.Split(','); + var excludeList = exclude.Split(','); + var repoList = repos.Split(','); + + switch (projectType) + { + case "NPM": + appSettings.Npm = new Config { Include = includeList, Exclude = excludeList, Artifactory = new Artifactory { InternalRepos = repoList } }; + break; + case "NUGET": + appSettings.Nuget = new Config { Include = includeList, Exclude = excludeList, Artifactory = new Artifactory { InternalRepos = repoList } }; + break; + case "MAVEN": + appSettings.Maven = new Config { Include = includeList, Exclude = excludeList, Artifactory = new Artifactory { InternalRepos = repoList } }; + break; + case "DEBIAN": + appSettings.Debian = new Config { Include = includeList, Exclude = excludeList, Artifactory = new Artifactory { InternalRepos = repoList } }; + break; + case "POETRY": + appSettings.Poetry = new Config { Include = includeList, Exclude = excludeList, Artifactory = new Artifactory { InternalRepos = repoList } }; + break; + case "CONAN": + appSettings.Conan = new Config { Include = includeList, Exclude = excludeList, Artifactory = new Artifactory { InternalRepos = repoList } }; + break; + case "ALPINE": + appSettings.Alpine = new Config { Include = includeList, Exclude = excludeList, Artifactory = new Artifactory { InternalRepos = repoList } }; + break; + } + } + } +} \ No newline at end of file diff --git a/src/LCT.PackageIdentifier/DisplayInformation.cs b/src/LCT.PackageIdentifier/DisplayInformation.cs new file mode 100644 index 00000000..27e0c4bb --- /dev/null +++ b/src/LCT.PackageIdentifier/DisplayInformation.cs @@ -0,0 +1,116 @@ +using LCT.Common; +using log4net; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace LCT.PackageIdentifier +{ + public class DisplayInformation + { + private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public static string DisplayIncludeFiles(CommonAppSettings appSettings) + { + string totalString = string.Empty; + var includeMappings = new Dictionary>>(StringComparer.OrdinalIgnoreCase) + { + { "NPM", () => appSettings.Npm.Include }, + { "NUGET", () => appSettings.Nuget.Include }, + { "MAVEN", () => appSettings.Maven.Include }, + { "DEBIAN", () => appSettings.Debian.Include }, + { "POETRY", () => appSettings.Poetry.Include }, + { "CONAN", () => appSettings.Conan.Include }, + { "ALPINE", () => appSettings.Alpine.Include } + }; + + if (includeMappings.TryGetValue(appSettings.ProjectType, out var getIncludeList)) + { + var includeList = getIncludeList(); + if (includeList != null) + { + totalString = string.Join(",", includeList); + } + } + else + { + Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); + } + + return totalString; + } + public static string DisplayExcludeFiles(CommonAppSettings appSettings) + { + string totalString = string.Empty; + var excludeMappings = new Dictionary>>(StringComparer.OrdinalIgnoreCase) + { + { "NPM", () => appSettings.Npm.Exclude }, + { "NUGET", () => appSettings.Nuget.Exclude }, + { "MAVEN", () => appSettings.Maven.Exclude }, + { "DEBIAN", () => appSettings.Debian.Exclude }, + { "POETRY", () => appSettings.Poetry.Exclude }, + { "CONAN", () => appSettings.Conan.Exclude }, + { "ALPINE", () => appSettings.Alpine.Exclude } + }; + + if (excludeMappings.TryGetValue(appSettings.ProjectType, out var getExcludeList)) + { + var excludeList = getExcludeList(); + if (excludeList != null) + { + totalString = string.Join(",", excludeList); + } + } + else + { + Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); + } + + return totalString; + } + + public static string DisplayExcludeComponents(CommonAppSettings appSettings) + { + + string totalString = string.Empty; + if (appSettings.SW360.ExcludeComponents != null) + { + totalString = string.Join(",", appSettings.SW360.ExcludeComponents?.ToList()); + } + return totalString; + } + + public static string GetInternalRepolist(CommonAppSettings appSettings) + { + string listOfInternalRepoList = string.Empty; + + var repoMapping = new Dictionary>>(StringComparer.OrdinalIgnoreCase) + { + { "NPM", () => appSettings.Npm?.Artifactory.InternalRepos }, + { "NUGET", () => appSettings.Nuget?.Artifactory.InternalRepos }, + { "MAVEN", () => appSettings.Maven?.Artifactory.InternalRepos }, + { "DEBIAN", () => appSettings.Debian?.Artifactory.InternalRepos }, + { "POETRY", () => appSettings.Poetry?.Artifactory.InternalRepos }, + { "CONAN", () => appSettings.Conan?.Artifactory.InternalRepos }, + { "ALPINE", () => appSettings.Alpine?.Artifactory.InternalRepos } + }; + + if (repoMapping.TryGetValue(appSettings.ProjectType, out var getRepos)) + { + var repos = getRepos(); + if (repos != null) + { + listOfInternalRepoList = string.Join(",", repos); + } + } + else + { + Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); + } + + return listOfInternalRepoList; + } + } +} diff --git a/src/LCT.PackageIdentifier/Program.cs b/src/LCT.PackageIdentifier/Program.cs index 6af55588..e9761a86 100644 --- a/src/LCT.PackageIdentifier/Program.cs +++ b/src/LCT.PackageIdentifier/Program.cs @@ -75,10 +75,10 @@ static async Task Main(string[] args) // Validate application settings await ValidateAppsettingsFile(appSettings, projectReleases); - string listOfInlude = DisplayIncludeFiles(appSettings); - string listOfExclude = DisplayExcludeFiles(appSettings); - string listOfExcludeComponents = DisplayExcludeComponents(appSettings); - string listOfInternalRepoList = GetInternalRepolist(appSettings); + string listOfInlude = DisplayInformation.DisplayIncludeFiles(appSettings); + string listOfExclude = DisplayInformation.DisplayExcludeFiles(appSettings); + string listOfExcludeComponents = DisplayInformation.DisplayExcludeComponents(appSettings); + string listOfInternalRepoList = DisplayInformation.GetInternalRepolist(appSettings); Logger.Logger.Log(null, Level.Notice, $"Input Parameters used in Package Identifier:\n\t" + $"CaToolVersion\t\t --> {caToolInformation.CatoolVersion}\n\t" + @@ -158,107 +158,7 @@ private static async Task ValidateAppsettingsFile(CommonAppSettings appSettings, environmentHelper=new EnvironmentHelper(); environmentHelper.CallEnvironmentExit(-1); } - } - private static string DisplayIncludeFiles(CommonAppSettings appSettings) - { - string totalString = string.Empty; - var includeMappings = new Dictionary>>(StringComparer.OrdinalIgnoreCase) - { - { "NPM", () => appSettings.Npm.Include }, - { "NUGET", () => appSettings.Nuget.Include }, - { "MAVEN", () => appSettings.Maven.Include }, - { "DEBIAN", () => appSettings.Debian.Include }, - { "POETRY", () => appSettings.Poetry.Include }, - { "CONAN", () => appSettings.Conan.Include }, - { "ALPINE", () => appSettings.Alpine.Include } - }; - - if (includeMappings.TryGetValue(appSettings.ProjectType, out var getIncludeList)) - { - var includeList = getIncludeList(); - if (includeList != null) - { - totalString = string.Join(",", includeList); - } - } - else - { - Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); - } - - return totalString; - } - private static string DisplayExcludeFiles(CommonAppSettings appSettings) - { - string totalString = string.Empty; - var excludeMappings = new Dictionary>>(StringComparer.OrdinalIgnoreCase) - { - { "NPM", () => appSettings.Npm.Exclude }, - { "NUGET", () => appSettings.Nuget.Exclude }, - { "MAVEN", () => appSettings.Maven.Exclude }, - { "DEBIAN", () => appSettings.Debian.Exclude }, - { "POETRY", () => appSettings.Poetry.Exclude }, - { "CONAN", () => appSettings.Conan.Exclude }, - { "ALPINE", () => appSettings.Alpine.Exclude } - }; - - if (excludeMappings.TryGetValue(appSettings.ProjectType, out var getExcludeList)) - { - var excludeList = getExcludeList(); - if (excludeList != null) - { - totalString = string.Join(",", excludeList); - } - } - else - { - Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); - } - - return totalString; - } - - private static string DisplayExcludeComponents(CommonAppSettings appSettings) - { - - string totalString = string.Empty; - if (appSettings.SW360.ExcludeComponents != null) - { - totalString = string.Join(",", appSettings.SW360.ExcludeComponents?.ToList()); - } - return totalString; - } - - private static string GetInternalRepolist(CommonAppSettings appSettings) - { - string listOfInternalRepoList = string.Empty; - - var repoMapping = new Dictionary>>(StringComparer.OrdinalIgnoreCase) - { - { "NPM", () => appSettings.Npm?.Artifactory.InternalRepos }, - { "NUGET", () => appSettings.Nuget?.Artifactory.InternalRepos }, - { "MAVEN", () => appSettings.Maven?.Artifactory.InternalRepos }, - { "DEBIAN", () => appSettings.Debian?.Artifactory.InternalRepos }, - { "POETRY", () => appSettings.Poetry?.Artifactory.InternalRepos }, - { "CONAN", () => appSettings.Conan?.Artifactory.InternalRepos }, - { "ALPINE", () => appSettings.Alpine?.Artifactory.InternalRepos } - }; - - if (repoMapping.TryGetValue(appSettings.ProjectType, out var getRepos)) - { - var repos = getRepos(); - if (repos != null) - { - listOfInternalRepoList = string.Join(",", repos); - } - } - else - { - Logger.Error($"Invalid ProjectType - {appSettings.ProjectType}"); - } - - return listOfInternalRepoList; - } + } private static string LogFolderInitialisation(CommonAppSettings appSettings) { From 05ac40250f08e42f63131a4cf3d4e6aa10181b71 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Wed, 5 Feb 2025 10:13:22 +0530 Subject: [PATCH 3/6] updated code --- src/ArtifactoryUploader/Program.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ArtifactoryUploader/Program.cs b/src/ArtifactoryUploader/Program.cs index 7aa02584..64f5cc1b 100644 --- a/src/ArtifactoryUploader/Program.cs +++ b/src/ArtifactoryUploader/Program.cs @@ -88,6 +88,8 @@ static async Task Main(string[] args) //Uploading Package to artifactory PackageUploadHelper.jFrogService = GetJfrogService(appSettings); + UploadToArtifactory.jFrogService = GetJfrogService(appSettings); + JfrogRepoUpdater.jFrogService = GetJfrogService(appSettings); await PackageUploader.UploadPackageToArtifactory(appSettings); Logger.Logger.Log(null, Level.Notice, $"End of Artifactory Uploader execution : {DateTime.Now}\n", null); From 4aad9735a8149aa41133aec5f5236346bac23ba7 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Wed, 5 Feb 2025 20:41:56 +0530 Subject: [PATCH 4/6] updated requested changes --- .../JfrogRepoUpdaterTest.cs | 94 +------------------ .../PackageUploadHelperTest.cs | 18 +++- .../PackageUploadInformationTest.cs | 76 +++++++++++++++ .../ArtifactoryUploader.cs | 24 +++++ src/ArtifactoryUploader/JfrogRepoUpdater.cs | 36 +------ .../PackageUploadHelper.cs | 35 ++++++- .../PackageUploadInformation.cs | 81 +++++++++++----- src/LCT.Common/EnvironmentHelper.cs | 3 + src/LCT.PackageIdentifier/Program.cs | 4 +- 9 files changed, 216 insertions(+), 155 deletions(-) diff --git a/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs b/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs index bb8aed4c..cee36313 100644 --- a/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs +++ b/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs @@ -41,97 +41,7 @@ public async Task GetJfrogRepoInfoForAllTypePackages_GivenDestRepoNames_ReturnsA // Assert Assert.That(actualAqlResultList.Count, Is.GreaterThan(2)); } - - [Test] - [TestCase("NPM", ".tgz")] - [TestCase("NUGET", ".nupkg")] - [TestCase("MAVEN", ".jar")] - [TestCase("DEBIAN", ".deb")] - [TestCase("POETRY", ".whl")] - [TestCase("CONAN", "package.tgz")] - public void GetPkgeNameExtensionBasedOnComponentType_GivenType_ReturnsPkgNameExtension(string type, string extension) - { - // Arrange - var package = new ComponentsToArtifactory(); - package.ComponentType = type; - // Act - var actualExtension = JfrogRepoUpdater.GetPackageNameExtensionBasedOnComponentType(package); - // Assert - Assert.AreEqual(extension, actualExtension); - } - [Test] - public void GetUploadPackageDetails_CoversAllScenarios() - { - // Arrange - DisplayPackagesInfo displayPackagesInfo = new DisplayPackagesInfo() - { - JfrogFoundPackagesConan = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesMaven = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesNpm = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesNuget = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesPython = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - }, - JfrogFoundPackagesDebian = new List() - { - new ComponentsToArtifactory() - { - ResponseMessage = new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK - } - } - } - }; - - // Act - List uploadedPackages = JfrogRepoUpdater.GetUploadePackageDetails(displayPackagesInfo); - - // Assert - Assert.AreEqual(6, uploadedPackages.Count); - } + + } } diff --git a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs index 15ab82f8..ce735430 100644 --- a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs +++ b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs @@ -44,7 +44,23 @@ public void GetComponentListFromComparisonBOM_GivenComparisonBOM_ReturnsComponen // Assert Assert.That(6, Is.EqualTo(componentList.Components.Count), "Checks for no of components"); } - + [Test] + [TestCase("NPM", ".tgz")] + [TestCase("NUGET", ".nupkg")] + [TestCase("MAVEN", ".jar")] + [TestCase("DEBIAN", ".deb")] + [TestCase("POETRY", ".whl")] + [TestCase("CONAN", "package.tgz")] + public void GetPkgeNameExtensionBasedOnComponentType_GivenType_ReturnsPkgNameExtension(string type, string extension) + { + // Arrange + var package = new ComponentsToArtifactory(); + package.ComponentType = type; + // Act + var actualExtension = PackageUploadHelper.GetPackageNameExtensionBasedOnComponentType(package); + // Assert + Assert.AreEqual(extension, actualExtension); + } [Test] public void GetComponentListFromComparisonBOM_GivenInvalidComparisonBOM_ReturnsException() { diff --git a/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs b/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs index ffb88862..cd34dba3 100644 --- a/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs +++ b/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs @@ -8,6 +8,8 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.Http; +using System.Net; using System.Text; using System.Threading.Tasks; @@ -15,6 +17,80 @@ namespace AritfactoryUploader.UTest { public class PackageUploadInformationTest { + [Test] + public void GetUploadPackageDetails_CoversAllScenarios() + { + // Arrange + DisplayPackagesInfo displayPackagesInfo = new DisplayPackagesInfo() + { + JfrogFoundPackagesConan = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesMaven = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesNpm = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesNuget = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesPython = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + }, + JfrogFoundPackagesDebian = new List() + { + new ComponentsToArtifactory() + { + ResponseMessage = new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + } + } + } + }; + + // Act + List uploadedPackages = PackageUploadInformation.GetUploadePackageDetails(displayPackagesInfo); + + // Assert + Assert.AreEqual(6, uploadedPackages.Count); + } [Test] public void GetNotApprovedDebianPackages_CoversAllScenarios() { diff --git a/src/ArtifactoryUploader/ArtifactoryUploader.cs b/src/ArtifactoryUploader/ArtifactoryUploader.cs index 71562302..7ff1acdc 100644 --- a/src/ArtifactoryUploader/ArtifactoryUploader.cs +++ b/src/ArtifactoryUploader/ArtifactoryUploader.cs @@ -13,6 +13,7 @@ using log4net; using System; using System.Configuration; +using System.IO; using System.Net; using System.Net.Http; using System.Reflection; @@ -117,6 +118,29 @@ async Task TryGetPackageInfo(ComponentsToArtifactory component) return packageInfo; } + public static string GettPathForArtifactoryUpload() + { + string localPathforartifactory = string.Empty; + try + { + String Todaysdate = DateTime.Now.ToString("dd-MM-yyyy_ss"); + localPathforartifactory = $"{Directory.GetParent(Directory.GetCurrentDirectory())}\\ClearingTool\\ArtifactoryFiles\\{Todaysdate}\\"; + if (!Directory.Exists(localPathforartifactory)) + { + localPathforartifactory = Directory.CreateDirectory(localPathforartifactory).ToString(); + } + } + catch (IOException ex) + { + Logger.Error($"GettPathForArtifactoryUpload() ", ex); + } + catch (UnauthorizedAccessException ex) + { + Logger.Error($"GettPathForArtifactoryUpload() ", ex); + } + + return localPathforartifactory; + } } } diff --git a/src/ArtifactoryUploader/JfrogRepoUpdater.cs b/src/ArtifactoryUploader/JfrogRepoUpdater.cs index 9597a79a..3883569b 100644 --- a/src/ArtifactoryUploader/JfrogRepoUpdater.cs +++ b/src/ArtifactoryUploader/JfrogRepoUpdater.cs @@ -25,7 +25,7 @@ public static async Task UpdateJfrogRepoPathForSucessfullyUploadedItems(Bom DisplayPackagesInfo displayPackagesInfo) { // Get details of sucessfully uploaded packages - List uploadedPackages = GetUploadePackageDetails(displayPackagesInfo); + List uploadedPackages = PackageUploadInformation.GetUploadePackageDetails(displayPackagesInfo); // Get the details of all the dest repo names from jfrog at once List destRepoNames = uploadedPackages.Select(x => x.DestRepoName)?.Distinct()?.ToList() ?? new List(); @@ -52,7 +52,7 @@ private static List UpdateJfroRepoPathProperty(Bom m_ComponentsInBOM, if (package == null) { continue; } // get jfrog details of a component from the aqlresult set - string packageNameEXtension = GetPackageNameExtensionBasedOnComponentType(package); + string packageNameEXtension = PackageUploadHelper.GetPackageNameExtensionBasedOnComponentType(package); AqlResult jfrogData = GetJfrogInfoOfThePackageUploaded(jfrogPackagesListAql, package, packageNameEXtension); // if package not exists in jfrog list move to nect item in the loop @@ -103,37 +103,7 @@ private static AqlResult GetJfrogInfoOfThePackageUploaded(List jfrogP return jfrogPackagesListAql.FirstOrDefault(x => x.Path.Contains(package.Name) && x.Name.Contains(package.Version) && x.Name.Contains(packageNameEXtension)); - } - public static string GetPackageNameExtensionBasedOnComponentType(ComponentsToArtifactory package) - { - string packageNameEXtension = string.Empty; - if (package.ComponentType.Equals("NPM", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".tgz"; - } - if (package.ComponentType.Equals("NUGET", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".nupkg"; - } - if (package.ComponentType.Equals("MAVEN", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".jar"; - } - if (package.ComponentType.Equals("DEBIAN", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".deb"; - } - if (package.ComponentType.Equals("POETRY", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = ".whl"; - } - if (package.ComponentType.Equals("CONAN", StringComparison.OrdinalIgnoreCase)) - { - packageNameEXtension = "package.tgz"; - } - - return packageNameEXtension; - } + } public static async Task> GetJfrogRepoInfoForAllTypePackages(List destRepoNames) { diff --git a/src/ArtifactoryUploader/PackageUploadHelper.cs b/src/ArtifactoryUploader/PackageUploadHelper.cs index 70f34c07..5b390708 100644 --- a/src/ArtifactoryUploader/PackageUploadHelper.cs +++ b/src/ArtifactoryUploader/PackageUploadHelper.cs @@ -58,7 +58,7 @@ public static Bom GetComponentListFromComparisonBOM(string comparisionBomFilePat catch (JsonReaderException ex) { - Logger.Error($"Exception occured in reading the comparison BOM: {ex}"); + Logger.Error($"Exception occurred in reading the comparison BOM: {ex}"); throw new JsonReaderException(); } @@ -226,8 +226,8 @@ public static async Task UploadingThePackages(List comp if (SetWarningCode) { - PipelineArtifactUploader.UploadArtifacts(); - Environment.ExitCode = 2; + EnvironmentHelper environmentHelper = new EnvironmentHelper(); + environmentHelper.CallEnvironmentExit(2); Logger.Debug("Setting ExitCode to 2"); } @@ -296,7 +296,36 @@ private static async Task SourceRepoFoundToUploadArtifactory(PackageType package // do nothing } } + public static string GetPackageNameExtensionBasedOnComponentType(ComponentsToArtifactory package) + { + string packageNameEXtension = string.Empty; + if (package.ComponentType.Equals("NPM", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".tgz"; + } + if (package.ComponentType.Equals("NUGET", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".nupkg"; + } + if (package.ComponentType.Equals("MAVEN", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".jar"; + } + if (package.ComponentType.Equals("DEBIAN", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".deb"; + } + if (package.ComponentType.Equals("POETRY", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = ".whl"; + } + if (package.ComponentType.Equals("CONAN", StringComparison.OrdinalIgnoreCase)) + { + packageNameEXtension = "package.tgz"; + } + return packageNameEXtension; + } public static IJFrogApiCommunication GetJfrogApiCommInstance(ComponentsToArtifactory component, int timeout) { diff --git a/src/ArtifactoryUploader/PackageUploadInformation.cs b/src/ArtifactoryUploader/PackageUploadInformation.cs index a5cb78e7..13185663 100644 --- a/src/ArtifactoryUploader/PackageUploadInformation.cs +++ b/src/ArtifactoryUploader/PackageUploadInformation.cs @@ -12,6 +12,7 @@ using LCT.APICommunications; using Directory = System.IO.Directory; using Newtonsoft.Json; +using System.Net; namespace LCT.ArtifactoryUploader { @@ -50,9 +51,63 @@ public static DisplayPackagesInfo GetComponentsToBePackages() return displayPackagesInfo; } + public static List GetUploadePackageDetails(DisplayPackagesInfo displayPackagesInfo) + { + List uploadedPackages = new List(); + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesConan) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesMaven) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesNpm) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesNuget) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesPython) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + foreach (var item in displayPackagesInfo.JfrogFoundPackagesDebian) + { + if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) + { + uploadedPackages.Add(item); + } + } + + return uploadedPackages; + } public static void DisplayPackageUploadInformation(DisplayPackagesInfo displayPackagesInfo) { - string localPathforartifactory = GettPathForArtifactoryUpload(); + string localPathforartifactory = ArtfactoryUploader.GettPathForArtifactoryUpload(); DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesNpm, displayPackagesInfo.JfrogNotFoundPackagesNpm, displayPackagesInfo.SuccessfullPackagesNpm, displayPackagesInfo.JfrogFoundPackagesNpm, "Npm", localPathforartifactory); DisplaySortedForeachComponents(displayPackagesInfo.UnknownPackagesNuget, displayPackagesInfo.JfrogNotFoundPackagesNuget, displayPackagesInfo.SuccessfullPackagesNuget, displayPackagesInfo.JfrogFoundPackagesNuget, "Nuget", localPathforartifactory); @@ -357,28 +412,6 @@ private static void GetNotApprovedMavenPackages(List un } Logger.Warn($"Artifactory upload will not be done due to Report not in Approved state and package details can be found at {filename}\n"); } - public static string GettPathForArtifactoryUpload() - { - string localPathforartifactory = string.Empty; - try - { - String Todaysdate = DateTime.Now.ToString("dd-MM-yyyy_ss"); - localPathforartifactory = $"{Directory.GetParent(Directory.GetCurrentDirectory())}\\ClearingTool\\ArtifactoryFiles\\{Todaysdate}\\"; - if (!Directory.Exists(localPathforartifactory)) - { - localPathforartifactory = Directory.CreateDirectory(localPathforartifactory).ToString(); - } - } - catch (IOException ex) - { - Logger.Error($"GettPathForArtifactoryUpload() ", ex); - } - catch (UnauthorizedAccessException ex) - { - Logger.Error($"GettPathForArtifactoryUpload() ", ex); - } - - return localPathforartifactory; - } + } } diff --git a/src/LCT.Common/EnvironmentHelper.cs b/src/LCT.Common/EnvironmentHelper.cs index f7b49dd5..f386096c 100644 --- a/src/LCT.Common/EnvironmentHelper.cs +++ b/src/LCT.Common/EnvironmentHelper.cs @@ -15,6 +15,9 @@ public void CallEnvironmentExit(int code) { PipelineArtifactUploader.UploadLogs(); EnvironmentExit(code); + } else if (code == 2) + { + Environment.ExitCode = 2; } } private static void EnvironmentExit(int exitCode) diff --git a/src/LCT.PackageIdentifier/Program.cs b/src/LCT.PackageIdentifier/Program.cs index e9761a86..db3e13a4 100644 --- a/src/LCT.PackageIdentifier/Program.cs +++ b/src/LCT.PackageIdentifier/Program.cs @@ -75,7 +75,7 @@ static async Task Main(string[] args) // Validate application settings await ValidateAppsettingsFile(appSettings, projectReleases); - string listOfInlude = DisplayInformation.DisplayIncludeFiles(appSettings); + string listOfInclude = DisplayInformation.DisplayIncludeFiles(appSettings); string listOfExclude = DisplayInformation.DisplayExcludeFiles(appSettings); string listOfExcludeComponents = DisplayInformation.DisplayExcludeComponents(appSettings); string listOfInternalRepoList = DisplayInformation.GetInternalRepolist(appSettings); @@ -92,7 +92,7 @@ static async Task Main(string[] args) $"ProjectType\t\t --> {appSettings.ProjectType}\n\t" + $"LogFolderPath\t\t --> {Log4Net.CatoolLogPath}\n\t" + $"InternalRepoList\t --> {listOfInternalRepoList}\n\t" + - $"Include\t\t\t --> {listOfInlude}\n\t" + + $"Include\t\t\t --> {listOfInclude}\n\t" + $"Exclude\t\t\t --> {listOfExclude}\n\t" + $"ExcludeComponents\t --> {listOfExcludeComponents}\n", null); From 5d40c8d376f14d8713f4ab006a93e41e9c96ab29 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Wed, 5 Feb 2025 20:43:00 +0530 Subject: [PATCH 5/6] updated --- src/ArtifactoryUploader/JfrogRepoUpdater.cs | 55 +-------------------- 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/src/ArtifactoryUploader/JfrogRepoUpdater.cs b/src/ArtifactoryUploader/JfrogRepoUpdater.cs index 3883569b..95d749ad 100644 --- a/src/ArtifactoryUploader/JfrogRepoUpdater.cs +++ b/src/ArtifactoryUploader/JfrogRepoUpdater.cs @@ -118,59 +118,6 @@ public static async Task> GetJfrogRepoInfoForAllTypePackages(Lis return aqlResultList; } - public static List GetUploadePackageDetails(DisplayPackagesInfo displayPackagesInfo) - { - List uploadedPackages = new List(); - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesConan) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesMaven) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesNpm) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesNuget) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesPython) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - foreach (var item in displayPackagesInfo.JfrogFoundPackagesDebian) - { - if (item.ResponseMessage?.StatusCode == HttpStatusCode.OK) - { - uploadedPackages.Add(item); - } - } - - return uploadedPackages; - } + } } From fcb2fffb4f586b3133980c39d1c2d39130c7b717 Mon Sep 17 00:00:00 2001 From: Chalapala RaghavendraReddy Date: Thu, 6 Feb 2025 13:57:23 +0530 Subject: [PATCH 6/6] Updated code changes --- src/ArtifactoryUploader/PackageUploader.cs | 3 ++- src/LCT.Common/CommonHelper.cs | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ArtifactoryUploader/PackageUploader.cs b/src/ArtifactoryUploader/PackageUploader.cs index 6452801f..27881541 100644 --- a/src/ArtifactoryUploader/PackageUploader.cs +++ b/src/ArtifactoryUploader/PackageUploader.cs @@ -79,7 +79,8 @@ public static async Task UploadPackageToArtifactory(CommonAppSettings appSetting // set the error code if (uploaderKpiData.PackagesNotUploadedDueToError > 0 || uploaderKpiData.PackagesNotExistingInRemoteCache > 0) { - Environment.ExitCode = 2; + EnvironmentHelper environmentHelper = new EnvironmentHelper(); + environmentHelper.CallEnvironmentExit(2); Logger.Debug("Setting ExitCode to 2"); } } diff --git a/src/LCT.Common/CommonHelper.cs b/src/LCT.Common/CommonHelper.cs index 0abdbbf6..30058944 100644 --- a/src/LCT.Common/CommonHelper.cs +++ b/src/LCT.Common/CommonHelper.cs @@ -157,8 +157,8 @@ 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(); - Environment.ExitCode = 2; + EnvironmentHelper environmentHelper = new EnvironmentHelper(); + environmentHelper.CallEnvironmentExit(2); } if (componentInfo.Count > 0) @@ -204,8 +204,8 @@ public static void WriteComponentsNotLinkedListInConsole(List compon if (components.Count > 0) { - PipelineArtifactUploader.UploadArtifacts(); - Environment.ExitCode = 2; + EnvironmentHelper environmentHelper = new EnvironmentHelper(); + environmentHelper.CallEnvironmentExit(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); Logger.Logger.Log(null, Level.Alert, $"{"=",5}{string.Join("", Enumerable.Repeat("=", 98)),5}", null);