Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize how detect project clone categories are sent #955

Draft
wants to merge 10 commits into
base: master
Choose a base branch
from
Expand Up @@ -84,4 +84,20 @@ public Set<B> representedValueSet() {
public List<ExtendedEnumValue<E, B>> toProvidedValues() {
return providedValues;
}

/**
* This returns null if the properties' value is set to ALL values of the Enum.
* It returns an empty array if the value is set to NONE.
* This streamlines things for newer 2023.10.0 and later endpoints.
* Older endpoints should use representedValues.
*/
public List<B> representedValuesStreamlined() {
if (containsNone()) {
return new ArrayList<>();
} else if (containsAll()) {
return null;
} else {
return toPresentValues();
}
}
}
2 changes: 1 addition & 1 deletion shared-version.properties
@@ -1,3 +1,3 @@
// ALSO CHANGE integration-common version in src/main/resources/create-gradle-airgap-script.ft
gradle.ext.blackDuckCommonVersion='66.2.7'
gradle.ext.blackDuckCommonVersion='66.2.8-SNAPSHOT-f'
gradle.ext.springBootVersion='2.7.12'
Expand Up @@ -25,6 +25,7 @@
import com.synopsys.integration.blackduck.codelocation.signaturescanner.command.ReducedPersistence;
import com.synopsys.integration.blackduck.codelocation.signaturescanner.command.SnippetMatching;
import com.synopsys.integration.blackduck.configuration.BlackDuckServerConfig;
import com.synopsys.integration.blackduck.version.BlackDuckVersion;
import com.synopsys.integration.configuration.property.types.enumallnone.list.AllEnumList;
import com.synopsys.integration.configuration.property.types.enumallnone.list.AllNoneEnumCollection;
import com.synopsys.integration.configuration.property.types.enumallnone.list.AllNoneEnumList;
Expand All @@ -41,7 +42,10 @@
import com.synopsys.integration.detect.configuration.enumeration.RapidCompareMode;
import com.synopsys.integration.detect.lifecycle.boot.decision.BlackDuckDecision;
import com.synopsys.integration.detect.lifecycle.boot.decision.RunDecision;
import com.synopsys.integration.detect.lifecycle.boot.product.BlackDuckConnectivityResult;
import com.synopsys.integration.detect.lifecycle.boot.product.ProductBootOptions;
import com.synopsys.integration.detect.lifecycle.boot.product.version.BlackDuckVersionParser;
import com.synopsys.integration.detect.lifecycle.run.data.BlackDuckRunData;
import com.synopsys.integration.detect.tool.binaryscanner.BinaryScanOptions;
import com.synopsys.integration.detect.tool.detector.executable.DetectExecutableOptions;
import com.synopsys.integration.detect.tool.iac.IacScanOptions;
Expand Down Expand Up @@ -320,13 +324,22 @@ public CustomFieldDocument createCustomFieldDocument() throws DetectUserFriendly
return parser.parseCustomFieldDocument(detectConfiguration.getRaw());
}

public ProjectSyncOptions createDetectProjectServiceOptions() {
public ProjectSyncOptions createDetectProjectServiceOptions(Optional<BlackDuckVersion> blackDuckServerVersion) {
ProjectVersionPhaseType projectVersionPhase = detectConfiguration.getValue(DetectProperties.DETECT_PROJECT_VERSION_PHASE);
ProjectVersionDistributionType projectVersionDistribution = detectConfiguration.getValue(DetectProperties.DETECT_PROJECT_VERSION_DISTRIBUTION);
Integer projectTier = detectConfiguration.getNullableValue(DetectProperties.DETECT_PROJECT_TIER);
String projectDescription = detectConfiguration.getNullableValue(DetectProperties.DETECT_PROJECT_DESCRIPTION);
String projectVersionNotes = detectConfiguration.getNullableValue(DetectProperties.DETECT_PROJECT_VERSION_NOTES);
List<ProjectCloneCategoriesType> cloneCategories = detectConfiguration.getValue(DetectProperties.DETECT_PROJECT_CLONE_CATEGORIES).representedValues();

List<ProjectCloneCategoriesType> cloneCategories;
AllNoneEnumList<ProjectCloneCategoriesType> categoriesEnum = detectConfiguration.getValue(DetectProperties.DETECT_PROJECT_CLONE_CATEGORIES);

if (canSendSummaryData(blackDuckServerVersion)) {
cloneCategories = categoriesEnum.representedValuesStreamlined();
} else {
cloneCategories = categoriesEnum.representedValues();
}

Boolean projectLevelAdjustments = detectConfiguration.getValue(DetectProperties.DETECT_PROJECT_LEVEL_ADJUSTMENTS);
Boolean forceProjectVersionUpdate = detectConfiguration.getValue(DetectProperties.DETECT_PROJECT_VERSION_UPDATE);
String projectVersionNickname = detectConfiguration.getNullableValue(DetectProperties.DETECT_PROJECT_VERSION_NICKNAME);
Expand Down Expand Up @@ -526,6 +539,27 @@ private List<String> collectDirectoryExclusions(@NotNull List<String> givenExclu

return directoryExclusionPatterns;
}

/**
* Newer BlackDuck servers allow us to send ALL and null values for project categories. BlackDuck will then
* determine the appropriate values to display in the UI. For older servers we have to send all the values that we know
* about, for all, which can cause problems if we send a value Detect knows about but an older BlackDuck server does not.
* Eventually we can pull this code once all servers we support are 2023.10.0 or higher.
*
* @param blackDuckServerVersion the version of the BlackDuck server specified in blackduck.url
* @return true if we can optimize the categories argument, false otherwise
*/
private boolean canSendSummaryData(Optional<BlackDuckVersion> blackDuckServerVersion) {
boolean canSendSummaryData = false;

BlackDuckVersion minVersion = new BlackDuckVersion(2023, 10, 0);

if (blackDuckServerVersion.isPresent() && blackDuckServerVersion.get().isAtLeast(minVersion)) {
canSendSummaryData = true;
}

return canSendSummaryData;
}

public Optional<String> getContainerScanFilePath() {
return Optional.ofNullable(detectConfiguration.getNullableValue(DetectProperties.DETECT_CONTAINER_SCAN_FILE));
Expand Down
Expand Up @@ -118,12 +118,12 @@ private BlackDuckRunData getBlackDuckRunData(
blackDuckDecision.scanMode(),
blackDuckServicesFactory,
phoneHomeManager,
blackDuckConnectivityResult.getBlackDuckServerConfig(),
blackDuckConnectivityResult,
waitAtScanLevel
);
} else {
logger.debug("Skipping phone home due to Black Duck global settings.");
bdRunData = BlackDuckRunData.onlineNoPhoneHome(blackDuckDecision.scanMode(), blackDuckServicesFactory, blackDuckConnectivityResult.getBlackDuckServerConfig(), waitAtScanLevel);
bdRunData = BlackDuckRunData.onlineNoPhoneHome(blackDuckDecision.scanMode(), blackDuckServicesFactory, blackDuckConnectivityResult, waitAtScanLevel);
}
return bdRunData;
} else {
Expand Down
Expand Up @@ -4,7 +4,10 @@

import com.synopsys.integration.blackduck.configuration.BlackDuckServerConfig;
import com.synopsys.integration.blackduck.service.BlackDuckServicesFactory;
import com.synopsys.integration.blackduck.version.BlackDuckVersion;
import com.synopsys.integration.detect.configuration.enumeration.BlackduckScanMode;
import com.synopsys.integration.detect.lifecycle.boot.product.BlackDuckConnectivityResult;
import com.synopsys.integration.detect.lifecycle.boot.product.version.BlackDuckVersionParser;
import com.synopsys.integration.detect.workflow.phonehome.PhoneHomeManager;

public class BlackDuckRunData {
Expand All @@ -13,19 +16,23 @@ public class BlackDuckRunData {
private final BlackDuckServicesFactory blackDuckServicesFactory;
private final BlackduckScanMode scanMode;
private final boolean waitAtScanLevel;
private Optional<BlackDuckVersion> blackDuckServerVersion;

protected BlackDuckRunData(
PhoneHomeManager phoneHomeManager,
BlackDuckServerConfig blackDuckServerConfig,
BlackDuckConnectivityResult blackDuckConnectivityResult,
BlackDuckServicesFactory blackDuckServicesFactory,
BlackduckScanMode scanMode,
boolean waitAtScanLevel
) {
this.phoneHomeManager = phoneHomeManager;
this.blackDuckServerConfig = blackDuckServerConfig;
this.blackDuckServerConfig =
blackDuckConnectivityResult != null ? blackDuckConnectivityResult.getBlackDuckServerConfig() : null;
this.blackDuckServicesFactory = blackDuckServicesFactory;
this.scanMode = scanMode;
this.waitAtScanLevel = waitAtScanLevel;

determineBlackDuckServerVersion(blackDuckConnectivityResult);
}

public boolean isOnline() {
Expand All @@ -52,14 +59,14 @@ public static BlackDuckRunData online(
BlackduckScanMode scanMode,
BlackDuckServicesFactory blackDuckServicesFactory,
PhoneHomeManager phoneHomeManager,
BlackDuckServerConfig blackDuckServerConfig,
BlackDuckConnectivityResult blackDuckConnectivityResult,
boolean waitAtScanLevel
) {
return new BlackDuckRunData(phoneHomeManager, blackDuckServerConfig, blackDuckServicesFactory, scanMode, waitAtScanLevel);
return new BlackDuckRunData(phoneHomeManager, blackDuckConnectivityResult, blackDuckServicesFactory, scanMode, waitAtScanLevel);
}

public static BlackDuckRunData onlineNoPhoneHome(BlackduckScanMode scanMode, BlackDuckServicesFactory blackDuckServicesFactory, BlackDuckServerConfig blackDuckServerConfig, boolean waitAtScanLevel) {
return new BlackDuckRunData(null, blackDuckServerConfig, blackDuckServicesFactory, scanMode, waitAtScanLevel);
public static BlackDuckRunData onlineNoPhoneHome(BlackduckScanMode scanMode, BlackDuckServicesFactory blackDuckServicesFactory, BlackDuckConnectivityResult blackDuckConnectivityResult, boolean waitAtScanLevel) {
return new BlackDuckRunData(null, blackDuckConnectivityResult, blackDuckServicesFactory, scanMode, waitAtScanLevel);
}

public Boolean isNonPersistent() {
Expand All @@ -73,4 +80,17 @@ public BlackduckScanMode getScanMode() {
public boolean shouldWaitAtScanLevel() {
return waitAtScanLevel;
}

public Optional<BlackDuckVersion> getBlackDuckServerVersion() {
return blackDuckServerVersion;
}

private void determineBlackDuckServerVersion(BlackDuckConnectivityResult blackDuckConnectivityResult) {
if (blackDuckConnectivityResult == null || blackDuckConnectivityResult.getContactedServerVersion() == null) {
blackDuckServerVersion = null;
} else {
BlackDuckVersionParser parser = new BlackDuckVersionParser();
blackDuckServerVersion = parser.parse(blackDuckConnectivityResult.getContactedServerVersion());
}
}
}
Expand Up @@ -29,7 +29,7 @@
import com.synopsys.integration.blackduck.api.generated.discovery.ApiDiscovery;
import com.synopsys.integration.blackduck.api.generated.enumeration.PolicyRuleSeverityType;
import com.synopsys.integration.blackduck.api.generated.view.BomStatusScanView;
import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.generated.view.ProjectVersionView;
import com.synopsys.integration.blackduck.bdio2.model.GitInfo;
import com.synopsys.integration.blackduck.bdio2.util.Bdio2Factory;
Expand Down Expand Up @@ -1144,7 +1144,7 @@ public ProjectVersionWrapper syncProjectVersion(
projectGroupFindResult,
cloneFindResult,
projectVersionLicensesFindResult,
detectConfigurationFactory.createDetectProjectServiceOptions()
detectConfigurationFactory.createDetectProjectServiceOptions(blackDuckRunData.getBlackDuckServerVersion())
)
);
}
Expand Down
Expand Up @@ -7,19 +7,17 @@
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.Set;
import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.codelocation.Result;
import com.synopsys.integration.blackduck.codelocation.signaturescanner.ScanBatchOutput;
import com.synopsys.integration.blackduck.codelocation.signaturescanner.command.ScanCommandOutput;
import com.synopsys.integration.detect.configuration.DetectUserFriendlyException;
import com.synopsys.integration.detect.configuration.enumeration.BlackduckScanMode;
Expand Down
Expand Up @@ -9,7 +9,7 @@
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.detect.configuration.DetectUserFriendlyException;
import com.synopsys.integration.detect.configuration.enumeration.ExitCodeType;
import com.synopsys.integration.detect.workflow.file.DetectFileUtils;
Expand Down
Expand Up @@ -6,7 +6,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.detect.configuration.DetectUserFriendlyException;
import com.synopsys.integration.detect.configuration.enumeration.BlackduckScanMode;
import com.synopsys.integration.detect.configuration.enumeration.ExitCodeType;
Expand Down
Expand Up @@ -5,7 +5,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.service.BlackDuckApiClient;
import com.synopsys.integration.detect.configuration.enumeration.BlackduckScanMode;
import com.synopsys.integration.detect.workflow.blackduck.developer.blackduck.DetectRapidScanWaitJobFull;
Expand Down
Expand Up @@ -11,7 +11,7 @@
import com.synopsys.integration.blackduck.api.generated.component.DeveloperScansScanItemsPolicyViolationLicensesViolatingPoliciesView;
import com.synopsys.integration.blackduck.api.generated.component.DeveloperScansScanItemsPolicyViolationVulnerabilitiesView;
import com.synopsys.integration.blackduck.api.generated.component.DeveloperScansScanItemsPolicyViolationVulnerabilitiesViolatingPoliciesView;
import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;

public class RapidScanComponentGroupDetail {

Expand Down
Expand Up @@ -22,7 +22,7 @@
import com.synopsys.integration.blackduck.api.generated.component.DeveloperScansScanItemsTransitiveUpgradeGuidanceLongTermUpgradeGuidanceView;
import com.synopsys.integration.blackduck.api.generated.component.DeveloperScansScanItemsTransitiveUpgradeGuidanceShortTermUpgradeGuidanceView;
import com.synopsys.integration.blackduck.api.generated.component.DeveloperScansScanItemsTransitiveUpgradeGuidanceView;
import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;

public class RapidScanResultAggregator {

Expand Down
@@ -1,7 +1,7 @@
package com.synopsys.integration.detect.workflow.blackduck.developer.blackduck;

import com.synopsys.integration.blackduck.api.core.response.UrlMultipleResponses;
import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.http.BlackDuckRequestBuilder;
import com.synopsys.integration.blackduck.service.request.BlackDuckMultipleRequest;
import com.synopsys.integration.blackduck.service.request.BlackDuckResponseRequest;
Expand Down
Expand Up @@ -6,7 +6,7 @@

import org.apache.http.HttpStatus;

import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.exception.BlackDuckIntegrationException;
import com.synopsys.integration.blackduck.service.BlackDuckApiClient;
import com.synopsys.integration.blackduck.service.request.BlackDuckMultipleRequest;
Expand Down
Expand Up @@ -8,7 +8,7 @@

import com.synopsys.integration.blackduck.api.core.BlackDuckPath;
import com.synopsys.integration.blackduck.api.generated.discovery.ApiDiscovery;
import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.bdio2.model.BdioFileContent;
import com.synopsys.integration.blackduck.http.BlackDuckRequestBuilder;
import com.synopsys.integration.blackduck.service.BlackDuckApiClient;
Expand Down
Expand Up @@ -3,7 +3,7 @@
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.synopsys.integration.blackduck.api.generated.view.DeveloperScansScanView;
import com.synopsys.integration.blackduck.api.manual.view.DeveloperScansScanView;
import com.synopsys.integration.componentlocator.beans.Component;
import java.util.HashMap;
import java.util.LinkedHashSet;
Expand Down