Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import datadog.communication.BackendApi;
import datadog.trace.api.Config;
import datadog.trace.api.civisibility.config.BazelMode;
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
import datadog.trace.api.civisibility.telemetry.tag.Provider;
import datadog.trace.api.git.CommitInfo;
Expand All @@ -19,6 +20,7 @@
import datadog.trace.civisibility.config.ExecutionSettings;
import datadog.trace.civisibility.config.ExecutionSettingsFactory;
import datadog.trace.civisibility.config.ExecutionSettingsFactoryImpl;
import datadog.trace.civisibility.config.FileBasedConfigurationApi;
import datadog.trace.civisibility.config.JvmInfo;
import datadog.trace.civisibility.config.MultiModuleExecutionSettingsFactory;
import datadog.trace.civisibility.git.tree.GitClient;
Expand Down Expand Up @@ -81,15 +83,22 @@ public class CiVisibilityRepoServices {

ciTags = new CITagsProvider().getCiTags(ciInfo, pullRequestInfo);

gitDataUploader =
buildGitDataUploader(
services.config,
services.metricCollector,
services.gitInfoProvider,
gitClient,
gitRepoUnshallow,
services.backendApi,
repoRoot);
if (BazelMode.get().isEnabled()) {
// bazel rule takes care of the git data upload
LOGGER.info("[bazel mode] Skipping git data upload");
gitDataUploader = () -> CompletableFuture.completedFuture(null);
} else {
gitDataUploader =
buildGitDataUploader(
services.config,
services.metricCollector,
services.gitInfoProvider,
gitClient,
gitRepoUnshallow,
services.backendApi,
repoRoot);
}

repoIndexProvider = services.repoIndexProviderFactory.create(repoRoot);
codeowners = buildCodeowners(repoRoot);
sourcePathResolver = buildSourcePathResolver(repoRoot, repoIndexProvider);
Expand Down Expand Up @@ -242,7 +251,17 @@ private static ExecutionSettingsFactory buildExecutionSettingsFactory(
PullRequestInfo pullRequestInfo,
@Nullable String repoRoot) {
ConfigurationApi configurationApi;
if (backendApi == null) {
BazelMode bazelMode = BazelMode.get();
if (bazelMode.isManifestModeEnabled()) {
LOGGER.info("[bazel mode] Manifest mode detected. Using file-based configuration API");
configurationApi =
new FileBasedConfigurationApi(
bazelMode.getSettingsPath(),
null,
bazelMode.getFlakyTestsPath(),
bazelMode.getKnownTestsPath(),
bazelMode.getTestManagementPath());
} else if (backendApi == null) {
LOGGER.warn(
"Remote config and skippable tests requests will be skipped since backend API client could not be created");
configurationApi = ConfigurationApi.NO_OP;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import datadog.communication.ddagent.SharedCommunicationObjects;
import datadog.communication.util.IOUtils;
import datadog.trace.api.Config;
import datadog.trace.api.civisibility.config.BazelMode;
import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric;
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
import datadog.trace.api.civisibility.telemetry.tag.Command;
Expand Down Expand Up @@ -83,7 +84,14 @@ public class CiVisibilityServices {
this.backendApi = new BackendApiFactory(config, sco).createBackendApi(Intake.API);
this.ciIntake = new BackendApiFactory(config, sco).createBackendApi(Intake.CI_INTAKE);
this.jvmInfoFactory = new CachingJvmInfoFactory(config, new JvmInfoFactoryImpl());
this.gitClientFactory = buildGitClientFactory(config, metricCollector);

if (BazelMode.get().isPayloadFilesEnabled()) {
// git commands should not be executed in payload files mode
logger.info("[bazel mode] Payload-in-files mode detected. Disabling git commands");
this.gitClientFactory = r -> NoOpGitClient.INSTANCE;
} else {
this.gitClientFactory = buildGitClientFactory(config, metricCollector);
}

this.environment = buildCiEnvironment();
this.ciProviderInfoFactory = new CIProviderInfoFactory(config, environment);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package datadog.trace.civisibility.config;

import com.squareup.moshi.FromJson;
import com.squareup.moshi.Json;
import com.squareup.moshi.JsonAdapter;
import com.squareup.moshi.Moshi;
import com.squareup.moshi.ToJson;
import com.squareup.moshi.Types;
import datadog.communication.BackendApi;
import datadog.communication.http.OkHttpUtils;
Expand All @@ -27,10 +25,8 @@
import datadog.trace.api.civisibility.telemetry.tag.TestManagementEnabled;
import datadog.trace.civisibility.communication.TelemetryListener;
import datadog.trace.util.RandomUtils;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.util.Base64;
import java.util.BitSet;
import java.util.Collection;
import java.util.Collections;
Expand Down Expand Up @@ -87,7 +83,7 @@ public ConfigurationApiImpl(BackendApi backendApi, CiVisibilityMetricCollector m
.add(ConfigurationsJsonAdapter.INSTANCE)
.add(CiVisibilitySettings.JsonAdapter.INSTANCE)
.add(EarlyFlakeDetectionSettings.JsonAdapter.INSTANCE)
.add(MetaDtoJsonAdapter.INSTANCE)
.add(MetaDto.JsonAdapter.INSTANCE)
.build();

ParameterizedType requestType =
Expand Down Expand Up @@ -208,7 +204,7 @@ public SkippableTests getSkippableTests(TracerEnvironment tracerEnvironment) thr
metricCollector.add(
CiVisibilityCountMetric.ITR_SKIPPABLE_TESTS_RESPONSE_TESTS, response.data.size());

String correlationId = response.meta != null ? response.meta.correlation_id : null;
String correlationId = response.meta != null ? response.meta.correlationId : null;
Map<String, BitSet> coveredLinesByRelativeSourcePath =
response.meta != null && response.meta.coverage != null
? response.meta.coverage
Expand Down Expand Up @@ -499,6 +495,7 @@ private MultiEnvelopeDto(Collection<DataDto<T>> data, MetaDto meta) {
}

private static final class DataDto<T> {
// TODO: extract all DTO logic to common utilities
private final String id;
private final String type;
private final T attributes;
Expand All @@ -514,52 +511,6 @@ public T getAttributes() {
}
}

private static final class MetaDto {
private final String correlation_id;
private final Map<String, BitSet> coverage;

private MetaDto(String correlation_id, Map<String, BitSet> coverage) {
this.correlation_id = correlation_id;
this.coverage = coverage;
}
}

private static final class MetaDtoJsonAdapter {

private static final MetaDtoJsonAdapter INSTANCE = new MetaDtoJsonAdapter();

@FromJson
public MetaDto fromJson(Map<String, Object> json) {
if (json == null) {
return null;
}

Map<String, BitSet> coverage;
Map<String, String> encodedCoverage = (Map<String, String>) json.get("coverage");
if (encodedCoverage != null) {
coverage = new HashMap<>();
for (Map.Entry<String, String> e : encodedCoverage.entrySet()) {
String relativeSourceFilePath = e.getKey();
String normalizedSourceFilePath =
relativeSourceFilePath.startsWith(File.separator)
? relativeSourceFilePath.substring(1)
: relativeSourceFilePath;
byte[] decodedLines = Base64.getDecoder().decode(e.getValue());
coverage.put(normalizedSourceFilePath, BitSet.valueOf(decodedLines));
}
} else {
coverage = null;
}

return new MetaDto((String) json.get("correlation_id"), coverage);
}

@ToJson
public Map<String, Object> toJson(MetaDto metaDto) {
throw new UnsupportedOperationException();
}
}

private static final class KnownTestsDto {
private final Map<String, Map<String, List<String>>> tests;

Expand Down Expand Up @@ -648,66 +599,4 @@ private TestManagementDto(
this.branch = branch;
}
}

private static final class TestManagementTestsDto {
private static final class Properties {
private final Map<String, Boolean> properties;

private Properties(Map<String, Boolean> properties) {
this.properties = properties;
}

public Boolean isQuarantined() {
return properties != null
? properties.getOrDefault(TestSetting.QUARANTINED.asString(), false)
: false;
}

public Boolean isDisabled() {
return properties != null
? properties.getOrDefault(TestSetting.DISABLED.asString(), false)
: false;
}

public Boolean isAttemptToFix() {
return properties != null
? properties.getOrDefault(TestSetting.ATTEMPT_TO_FIX.asString(), false)
: false;
}
}

private static final class Tests {
private final Map<String, Properties> tests;

private Tests(Map<String, Properties> tests) {
this.tests = tests;
}

public Map<String, Properties> getTests() {
return tests != null ? tests : Collections.emptyMap();
}
}

private static final class Suites {
private final Map<String, Tests> suites;

private Suites(Map<String, Tests> suites) {
this.suites = suites;
}

public Map<String, Tests> getSuites() {
return suites != null ? suites : Collections.emptyMap();
}
}

private final Map<String, Suites> modules;

private TestManagementTestsDto(Map<String, Suites> modules) {
this.modules = modules;
}

public Map<String, Suites> getModules() {
return modules != null ? modules : Collections.emptyMap();
}
}
}
Loading
Loading