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/JfrogRepoUpdaterTest.cs b/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs new file mode 100644 index 00000000..cee36313 --- /dev/null +++ b/src/AritfactoryUploader.UTest/JfrogRepoUpdaterTest.cs @@ -0,0 +1,47 @@ +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)); + } + + + } +} diff --git a/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs b/src/AritfactoryUploader.UTest/PackageUploadHelperTest.cs index 67a4c0f4..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() { @@ -67,145 +83,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 = PackageUploadHelper.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 = PackageUploadHelper.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 = PackageUploadHelper.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,334 +132,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); - } - - [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() - { - 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() @@ -757,208 +308,8 @@ public async Task JfrogFoundPackagesAsync_CoversAllScenarios(string compType) 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() - { - // 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; - - // Act - var actualAqlResultList = await PackageUploadHelper.GetJfrogRepoInfoForAllTypePackages(destRepoNames); - - - // 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 - { - 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 - { - 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 - { - 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); - } - - [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 = PackageUploadHelper.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); - - PackageUploadHelper.jFrogService = jFrogServiceMock.Object; - - - // Act - var result = await PackageUploadHelper.GetSrcRepoDetailsForComponent(item); - - // 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 new file mode 100644 index 00000000..cd34dba3 --- /dev/null +++ b/src/AritfactoryUploader.UTest/PackageUploadInformationTest.cs @@ -0,0 +1,162 @@ +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.Net; +using System.Text; +using System.Threading.Tasks; + +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() + { + // 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() + { + // 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)); + } + } +} 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 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 new file mode 100644 index 00000000..95d749ad --- /dev/null +++ b/src/ArtifactoryUploader/JfrogRepoUpdater.cs @@ -0,0 +1,123 @@ +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 = 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(); + 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 = PackageUploadHelper.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 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; + } + + } +} diff --git a/src/ArtifactoryUploader/PackageUploadHelper.cs b/src/ArtifactoryUploader/PackageUploadHelper.cs index 8c1cb786..5b390708 100644 --- a/src/ArtifactoryUploader/PackageUploadHelper.cs +++ b/src/ArtifactoryUploader/PackageUploadHelper.cs @@ -58,457 +58,13 @@ 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(); } return componentsToBoms; } - - 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; - } - - 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() - { - 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 DisplayErrorForSucessfullPackages(List SucessfullPackages) - { - - if (SucessfullPackages.Any()) - { - - foreach (var sucessfullPackage in SucessfullPackages) - { - Logger.Info($"Package {sucessfullPackage.Name}-{sucessfullPackage.Version} is already uploaded"); - } - Logger.Info("\n"); - - } - } - public static void DisplayPackageUploadInformation(DisplayPackagesInfo displayPackagesInfo) - { - 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) { @@ -550,48 +106,7 @@ private static Task GetSucessFulPackageinfo(ComponentsT 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) { @@ -701,293 +216,6 @@ private static async Task SucessfullPackagesAsync(ComponentsToArtifactory item, } - 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") - { - 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 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; - } - } - - private static string GetJfrogPackageName(ComponentsToArtifactory component) - { - string packageName; - - switch (component.ComponentType) - { - 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; - } - - return packageName; - } - - 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 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; - } - } - - 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; - } - - 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 UploadingThePackages(List componentsToUpload, int timeout, DisplayPackagesInfo displayPackagesInfo) { Logger.Debug("Starting UploadingThePackages() method"); @@ -998,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"); } @@ -1068,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) { @@ -1170,85 +427,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) @@ -1259,194 +438,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) - { - 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/PackageUploadInformation.cs b/src/ArtifactoryUploader/PackageUploadInformation.cs new file mode 100644 index 00000000..13185663 --- /dev/null +++ b/src/ArtifactoryUploader/PackageUploadInformation.cs @@ -0,0 +1,417 @@ +using LCT.APICommunications.Model; +using LCT.ArtifactoryUploader.Model; +using LCT.Common.Constants; +using LCT.Common.Interface; +using LCT.Common; +using log4net; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using LCT.APICommunications; +using Directory = System.IO.Directory; +using Newtonsoft.Json; +using System.Net; + +namespace LCT.ArtifactoryUploader +{ + public 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 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 = ArtfactoryUploader.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 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 DisplayErrorForSucessfullPackages(List SucessfullPackages) + { + + if (SucessfullPackages.Any()) + { + + 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}"); + + 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 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"); + } + + } +} diff --git a/src/ArtifactoryUploader/PackageUploader.cs b/src/ArtifactoryUploader/PackageUploader.cs index 5d66f469..27881541 100644 --- a/src/ArtifactoryUploader/PackageUploader.cs +++ b/src/ArtifactoryUploader/PackageUploader.cs @@ -39,9 +39,9 @@ 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); + 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); @@ -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 @@ -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); @@ -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/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); 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.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); 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.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 0dfce57c..db3e13a4 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 = DisplayInclude(appSettings); - string listOfExclude = DisplayExclude(appSettings); - string listOfExcludeComponents = DisplayExcludeComponents(appSettings); - string listOfInternalRepoList = GetInternalRepolist(appSettings); + string listOfInclude = 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" + @@ -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); @@ -158,157 +158,7 @@ private static async Task ValidateAppsettingsFile(CommonAppSettings appSettings, environmentHelper=new EnvironmentHelper(); environmentHelper.CallEnvironmentExit(-1); } - } - private static string DisplayInclude(CommonAppSettings appSettings) - { - string totalString = string.Empty; - switch (appSettings.ProjectType.ToUpperInvariant()) - { - 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; - } - return totalString; - } - private static string DisplayExclude(CommonAppSettings appSettings) - { - - string totalString = string.Empty; - switch (appSettings.ProjectType.ToUpperInvariant()) - { - 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; - } - 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) {