1 changed files with 0 additions and 195 deletions
@ -1,195 +0,0 @@
|
||||
/** |
||||
* Stolen from |
||||
* https://github.com/project-ncl/sbomer/blob/3b2ef857e8c0cefe9324ea401fa3fbe53499c615/cli/src/main/java/org/jboss/sbomer/cli/feature/sbom/service/PncService.java
|
||||
*/ |
||||
package com.redhat.pctsec.model.api.service; |
||||
|
||||
//import jakarta.annotation.PostConstruct;
|
||||
//import jakarta.annotation.PreDestroy;
|
||||
import jakarta.enterprise.context.ApplicationScoped; |
||||
import jakarta.ws.rs.WebApplicationException; |
||||
import org.eclipse.microprofile.config.inject.ConfigProperty; |
||||
import org.jboss.logging.Logger; |
||||
import org.jboss.pnc.client.*; |
||||
import org.jboss.pnc.dto.Artifact; |
||||
import org.jboss.pnc.dto.Build; |
||||
import org.jboss.pnc.dto.BuildConfiguration; |
||||
import org.jboss.pnc.dto.ProductVersionRef; |
||||
|
||||
import java.util.Optional; |
||||
|
||||
/** |
||||
* A service to interact with the PNC build system. |
||||
*/ |
||||
|
||||
//@ApplicationScoped
|
||||
public class PncService { |
||||
|
||||
private static final Logger log = Logger.getLogger(PncService.class); |
||||
|
||||
public PncService() { |
||||
artifactClient = new ArtifactClient(getConfiguration()); |
||||
buildClient = new BuildClient(getConfiguration()); |
||||
buildConfigurationClient = new BuildConfigurationClient(getConfiguration()); |
||||
} |
||||
|
||||
public String getApiUrl() { |
||||
return apiUrl; |
||||
} |
||||
|
||||
@ConfigProperty(name = "pnc.api-url") |
||||
String apiUrl; |
||||
|
||||
ArtifactClient artifactClient; |
||||
|
||||
BuildClient buildClient; |
||||
|
||||
BuildConfigurationClient buildConfigurationClient; |
||||
|
||||
/* |
||||
@PostConstruct |
||||
void init() { |
||||
artifactClient = new ArtifactClient(getConfiguration()); |
||||
buildClient = new BuildClient(getConfiguration()); |
||||
buildConfigurationClient = new BuildConfigurationClient(getConfiguration()); |
||||
} |
||||
|
||||
@PreDestroy |
||||
void cleanup() { |
||||
artifactClient.close(); |
||||
buildClient.close(); |
||||
buildConfigurationClient.close(); |
||||
} |
||||
*/ |
||||
|
||||
/** |
||||
* Setup basic configuration to be able to talk to PNC. |
||||
* |
||||
* |
||||
* @return |
||||
*/ |
||||
public Configuration getConfiguration() { |
||||
return Configuration.builder().host(apiUrl).protocol("http").build(); |
||||
} |
||||
|
||||
/** |
||||
* <p> |
||||
* Fetch information about the PNC {@link Build} identified by the particular {@code buildId}. |
||||
* </p> |
||||
* |
||||
* <p> |
||||
* In case the {@link Build} with provided identifier cannot be found {@code null} is returned. |
||||
* </p> |
||||
* |
||||
* @param buildId Tbe {@link Build} identifier in PNC |
||||
* @return The {@link Build} object or {@code null} in case the {@link Build} could not be found. |
||||
*/ |
||||
public Build getBuild(String buildId) { |
||||
log.debugv("Fetching Build from PNC with id '{}'", buildId); |
||||
try { |
||||
return buildClient.getSpecific(buildId); |
||||
} catch (RemoteResourceNotFoundException ex) { |
||||
log.warnv("Build with id '{}' was not found in PNC", buildId); |
||||
return null; |
||||
} catch (RemoteResourceException ex) { |
||||
throw new WebApplicationException("Build could not be retrieved because PNC responded with an error", ex); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* <p> |
||||
* Fetch information about the PNC {@link BuildConfiguration} identified by the particular {@code buildConfigId}. |
||||
* </p> |
||||
* |
||||
* <p> |
||||
* In case the {@link BuildConfiguration} with provided identifier cannot be found {@code null} is returned. |
||||
* </p> |
||||
* |
||||
* @param buildId Tbe {@link BuildConfiguration} identifier in PNC |
||||
* @return The {@link BuildConfiguration} object or {@code null} in case the {@link BuildConfiguration} could not be |
||||
* found. |
||||
*/ |
||||
public BuildConfiguration getBuildConfig(String buildConfigId) { |
||||
log.debugv("Fetching BuildConfig from PNC with id '{}'", buildConfigId); |
||||
try { |
||||
return buildConfigurationClient.getSpecific(buildConfigId); |
||||
} catch (RemoteResourceNotFoundException ex) { |
||||
log.warnv("BuildConfig with id '{}' was not found in PNC", buildConfigId); |
||||
return null; |
||||
} catch (RemoteResourceException ex) { |
||||
throw new WebApplicationException( |
||||
"BuildConfig could not be retrieved because PNC responded with an error", |
||||
ex); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* <p> |
||||
* Obtains the {@link ProductVersionRef} for a given PNC {@link Build} identifier. |
||||
* <p> |
||||
* |
||||
* @param buildId The {@link Build} identifier to get the Product Version for. |
||||
* @return The {@link ProductVersionRef} object for the related or {@code null} in case it is not possible to obtain |
||||
* it. |
||||
*/ |
||||
public ProductVersionRef getProductVersion(String buildId) { |
||||
log.debugv("Fetching Product Version information from PNC for build '{}'", buildId); |
||||
|
||||
if (buildId == null) { |
||||
return null; |
||||
} |
||||
Build build = getBuild(buildId); |
||||
|
||||
if (build == null) { |
||||
log.warn("Build related to the SBOM could not be found in PNC, interrupting processing"); |
||||
return null; |
||||
} |
||||
|
||||
BuildConfiguration buildConfig = getBuildConfig(build.getBuildConfigRevision().getId()); |
||||
|
||||
if (buildConfig == null) { |
||||
log.warn("BuildConfig related to the SBOM could not be found in PNC, interrupting processing"); |
||||
return null; |
||||
} |
||||
|
||||
ProductVersionRef productVersion = buildConfig.getProductVersion(); |
||||
|
||||
if (productVersion == null) { |
||||
log.warn( |
||||
"BuildConfig related to the SBOM does not provide product version information, interrupting processing"); |
||||
return null; |
||||
} |
||||
|
||||
return productVersion; |
||||
} |
||||
|
||||
/** |
||||
* Fetch information about the PNC {@link Artifact} identified by the particular purl. |
||||
* |
||||
* @param purl |
||||
* @return The {@link Artifact} object or {@code null} if it cannot be found. |
||||
*/ |
||||
public Artifact getArtifact(String purl) { |
||||
log.debugv("Fetching artifact from PNC for purl '{}'", purl); |
||||
|
||||
try { |
||||
String artifactQuery = "purl==\"" + purl + "\""; |
||||
RemoteCollection<Artifact> artifacts = artifactClient |
||||
.getAll(null, null, null, Optional.empty(), Optional.of(artifactQuery)); |
||||
if (artifacts.size() == 0) { |
||||
log.debugv("Artifact with purl '{}' was not found in PNC", purl); |
||||
return null; |
||||
} else if (artifacts.size() > 1) { |
||||
throw new IllegalStateException("There should exist only one artifact with purl " + purl); |
||||
} |
||||
return artifacts.iterator().next(); |
||||
} catch (RemoteResourceNotFoundException ex) { |
||||
throw new WebApplicationException("Artifact with purl" + purl + "was not found in PNC", ex); |
||||
} catch (RemoteResourceException ex) { |
||||
throw new WebApplicationException( |
||||
"Artifact with purl" + purl + "could not be retrieved because PNC responded with an error", |
||||
ex); |
||||
} |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue