Skip to content

Commit 9624b03

Browse files
committed
SCANJLIB-266 Log the region
1 parent 1a7b1de commit 9624b03

File tree

7 files changed

+60
-47
lines changed

7 files changed

+60
-47
lines changed

lib/src/main/java/org/sonarsource/scanner/lib/ScannerEngineBootstrapper.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import javax.annotation.Nullable;
3232
import org.apache.commons.io.FileUtils;
3333
import org.apache.commons.lang3.StringUtils;
34-
import org.jetbrains.annotations.NotNull;
3534
import org.slf4j.Logger;
3635
import org.slf4j.LoggerFactory;
3736
import org.sonarsource.scanner.lib.internal.FailedBootstrap;
@@ -147,36 +146,33 @@ public ScannerEngineBootstrapResult bootstrap() {
147146
try {
148147
scannerHttpClient.init(httpConfig);
149148
if (isSonarQubeCloud) {
150-
return bootstrapCloud(fileCache, immutableProperties, httpConfig);
149+
return bootstrapCloud(fileCache, immutableProperties, httpConfig, endpoint);
151150
}
152151
return bootstrapServer(fileCache, immutableProperties, httpConfig);
153152
} catch (MessageException e) {
154153
return handleException(e);
155154
}
156155
}
157156

158-
private ScannerEngineBootstrapResult bootstrapCloud(FileCache fileCache, Map<String, String> immutableProperties, HttpConfig httpConfig) {
159-
ScannerEngineFacade scannerFacade;
160-
LOG.info("Communicating with SonarQube Cloud");
161-
scannerFacade = buildNewFacade(fileCache, immutableProperties, httpConfig,
157+
private ScannerEngineBootstrapResult bootstrapCloud(FileCache fileCache, Map<String, String> immutableProperties, HttpConfig httpConfig, ScannerEndpoint endpoint) {
158+
endpoint.getRegionLabel().ifPresentOrElse(
159+
region -> LOG.info("Communicating with SonarQube Cloud ({} region)", region),
160+
() -> LOG.info("Communicating with SonarQube Cloud")
161+
);
162+
var scannerFacade = buildNewFacade(fileCache, immutableProperties, httpConfig,
162163
(launcher, adaptedProperties) -> NewScannerEngineFacade.forSonarQubeCloud(adaptedProperties, launcher));
163164
return new SuccessfulBootstrap(scannerFacade);
164165
}
165166

166167
private ScannerEngineBootstrapResult bootstrapServer(FileCache fileCache, Map<String, String> immutableProperties, HttpConfig httpConfig) {
167-
ScannerEngineFacade scannerFacade;
168168
var serverVersion = getServerVersion(scannerHttpClient);
169-
String serverLabel;
170-
if (VersionUtils.compareMajor(serverVersion, 10) <= 0 || VersionUtils.compareMajor(serverVersion, 2025) >= 0) {
171-
serverLabel = "SonarQube Server";
172-
} else {
173-
serverLabel = "SonarQube Community Build";
174-
}
169+
var serverLabel = guessServerLabelFromVersion(serverVersion);
175170
LOG.info("Communicating with {} {}", serverLabel, serverVersion);
176171
if (VersionUtils.isAtLeastIgnoringQualifier(serverVersion, SQ_VERSION_TOKEN_AUTHENTICATION) && Objects.nonNull(httpConfig.getLogin())) {
177172
LOG.warn("Use of '{}' property has been deprecated in favor of '{}' (or the env variable alternative '{}'). Please use the latter when passing a token.", SONAR_LOGIN,
178173
SONAR_TOKEN, TOKEN_ENV_VARIABLE);
179174
}
175+
ScannerEngineFacade scannerFacade;
180176
if (VersionUtils.isAtLeastIgnoringQualifier(serverVersion, SQ_VERSION_NEW_BOOTSTRAPPING)) {
181177
scannerFacade = buildNewFacade(fileCache, immutableProperties, httpConfig,
182178
(launcher, adaptedProperties) -> NewScannerEngineFacade.forSonarQubeServer(adaptedProperties, launcher, serverVersion));
@@ -188,6 +184,14 @@ private ScannerEngineBootstrapResult bootstrapServer(FileCache fileCache, Map<St
188184
return new SuccessfulBootstrap(scannerFacade);
189185
}
190186

187+
static String guessServerLabelFromVersion(String serverVersion) {
188+
if (VersionUtils.compareMajor(serverVersion, 10) <= 0 || VersionUtils.compareMajor(serverVersion, 2025) >= 0) {
189+
return "SonarQube Server";
190+
} else {
191+
return "SonarQube Community Build";
192+
}
193+
}
194+
191195
private ScannerEngineFacade buildNewFacade(FileCache fileCache, Map<String, String> immutableProperties, HttpConfig httpConfig,
192196
BiFunction<ScannerEngineLauncher, Map<String, String>, ScannerEngineFacade> facadeFactory) {
193197
var launcher = scannerEngineLauncherFactory.createLauncher(scannerHttpClient, fileCache, immutableProperties);

lib/src/main/java/org/sonarsource/scanner/lib/internal/endpoint/OfficialSonarQubeCloudInstance.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@
2929
import org.apache.commons.lang3.StringUtils;
3030

3131
public enum OfficialSonarQubeCloudInstance {
32-
GLOBAL("https://sonarcloud.io", "https://api.sonarcloud.io"),
33-
US("https://sonarqube.us", "https://api.sonarqube.us");
32+
GLOBAL("https://sonarcloud.io", "https://api.sonarcloud.io", null),
33+
US("https://sonarqube.us", "https://api.sonarqube.us", "US");
3434

3535

3636
private final ScannerEndpoint endpoint;
3737

38-
OfficialSonarQubeCloudInstance(String webEndpoint, String apiEndpoint) {
39-
this.endpoint = new ScannerEndpoint(webEndpoint, apiEndpoint, true);
38+
OfficialSonarQubeCloudInstance(String webEndpoint, String apiEndpoint, @Nullable String regionLabel) {
39+
this.endpoint = new ScannerEndpoint(webEndpoint, apiEndpoint, true, regionLabel);
4040
}
4141

4242
public static Set<String> getRegionCodesWithoutGlobal() {

lib/src/main/java/org/sonarsource/scanner/lib/internal/endpoint/ScannerEndpoint.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,21 @@
1919
*/
2020
package org.sonarsource.scanner.lib.internal.endpoint;
2121

22+
import java.util.Optional;
23+
import javax.annotation.Nullable;
24+
2225
public class ScannerEndpoint {
2326

2427
private final String webEndpoint;
2528
private final String apiEndpoint;
2629
private final boolean isSonarQubeCloud;
30+
private final String regionLabel;
2731

28-
public ScannerEndpoint(String webEndpoint, String apiEndpoint, boolean isSonarQubeCloud) {
32+
public ScannerEndpoint(String webEndpoint, String apiEndpoint, boolean isSonarQubeCloud, @Nullable String regionLabel) {
2933
this.webEndpoint = webEndpoint;
3034
this.apiEndpoint = apiEndpoint;
3135
this.isSonarQubeCloud = isSonarQubeCloud;
36+
this.regionLabel = regionLabel;
3237
}
3338

3439
public boolean isSonarQubeCloud() {
@@ -42,4 +47,8 @@ public String getApiEndpoint() {
4247
public String getWebEndpoint() {
4348
return webEndpoint;
4449
}
50+
51+
public Optional<String> getRegionLabel() {
52+
return Optional.ofNullable(regionLabel);
53+
}
4554
}

lib/src/main/java/org/sonarsource/scanner/lib/internal/endpoint/ScannerEndpointResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ private static ScannerEndpoint resolveCustomSonarQubeCloudEndpoint(Map<String, S
7474
}
7575
return new ScannerEndpoint(
7676
properties.get(ScannerProperties.SONARQUBE_CLOUD_URL),
77-
properties.get(ScannerProperties.API_BASE_URL), true);
77+
properties.get(ScannerProperties.API_BASE_URL), true, null);
7878
}
7979

8080
private static MessageException inconsistentUrlAndRegion(String prop2) {

lib/src/main/java/org/sonarsource/scanner/lib/internal/endpoint/SonarQubeServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
public class SonarQubeServer extends ScannerEndpoint {
2525

2626
public SonarQubeServer(String webEndpoint) {
27-
super(webEndpoint, buildApiEndpoint(webEndpoint), false);
27+
super(webEndpoint, buildApiEndpoint(webEndpoint), false, null);
2828
}
2929

3030
private static String buildApiEndpoint(String webEndpoint) {

lib/src/test/java/org/sonarsource/scanner/lib/ScannerEngineBootstrapperTest.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,14 @@
3232
import java.util.Map;
3333
import java.util.Properties;
3434
import java.util.stream.Collectors;
35+
import java.util.stream.Stream;
3536
import org.junit.jupiter.api.BeforeEach;
3637
import org.junit.jupiter.api.Test;
3738
import org.junit.jupiter.api.extension.RegisterExtension;
3839
import org.junit.jupiter.api.io.TempDir;
3940
import org.junit.jupiter.params.ParameterizedTest;
41+
import org.junit.jupiter.params.provider.Arguments;
42+
import org.junit.jupiter.params.provider.MethodSource;
4043
import org.junit.jupiter.params.provider.ValueSource;
4144
import org.junitpioneer.jupiter.RestoreSystemProperties;
4245
import org.mockito.Mockito;
@@ -103,7 +106,17 @@ void should_use_new_bootstrapping_on_sonarqube_cloud() throws Exception {
103106
verify(scannerEngineLauncherFactory).createLauncher(eq(scannerHttpClient), any(FileCache.class), anyMap());
104107
assertThat(bootstrapResult.getEngineFacade().isSonarQubeCloud()).isTrue();
105108
assertThat(bootstrapResult.getEngineFacade().getBootstrapProperties()).containsEntry(ScannerProperties.HOST_URL, "https://sonarcloud.io");
106-
verifyCloudServerTypeLogged();
109+
assertThat(logTester.logs(Level.INFO)).contains("Communicating with SonarQube Cloud");
110+
}
111+
}
112+
113+
@Test
114+
void should_use_new_bootstrapping_on_sonarqube_cloud_us() throws Exception {
115+
try (var bootstrapResult = underTest.setBootstrapProperty(ScannerProperties.SONAR_REGION, "us").bootstrap()) {
116+
verify(scannerEngineLauncherFactory).createLauncher(eq(scannerHttpClient), any(FileCache.class), anyMap());
117+
assertThat(bootstrapResult.getEngineFacade().isSonarQubeCloud()).isTrue();
118+
assertThat(bootstrapResult.getEngineFacade().getBootstrapProperties()).containsEntry(ScannerProperties.HOST_URL, "https://sonarqube.us");
119+
assertThat(logTester.logs(Level.INFO)).contains("Communicating with SonarQube Cloud (US region)");
107120
}
108121
}
109122

@@ -483,8 +496,19 @@ void should_set_ssl_properties_if_ssl_config_from_jvm() {
483496
entry("sonar.scanner.truststorePassword", "truststorePass"));
484497
}
485498

486-
private void verifyCloudServerTypeLogged() {
487-
assertThat(logTester.logs(Level.INFO)).contains("Communicating with SonarQube Cloud");
499+
@ParameterizedTest
500+
@MethodSource("provideServerVersionAndTypeArgumentPairs")
501+
void test_guessServerLabelFromVersion(String serverVersion, String serverType) {
502+
assertThat(ScannerEngineBootstrapper.guessServerLabelFromVersion(serverVersion)).isEqualTo(serverType);
503+
}
504+
505+
private static Stream<Arguments> provideServerVersionAndTypeArgumentPairs() {
506+
return Stream.of(
507+
Arguments.of("10.6", "SonarQube Server"),
508+
Arguments.of("2025.1.0.1234", "SonarQube Server"),
509+
Arguments.of("24.12", "SonarQube Community Build"),
510+
Arguments.of("25.1.0.1234", "SonarQube Community Build")
511+
);
488512
}
489513

490514
private void verifySonarQubeServerTypeLogged(String version) {

lib/src/test/java/org/sonarsource/scanner/lib/internal/facade/simulation/SimulationScannerEngineFacadeTest.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,9 @@
2525
import java.util.HashMap;
2626
import java.util.Map;
2727
import java.util.Properties;
28-
import java.util.stream.Stream;
2928
import org.junit.jupiter.api.BeforeEach;
3029
import org.junit.jupiter.api.Test;
3130
import org.junit.jupiter.api.io.TempDir;
32-
import org.junit.jupiter.params.ParameterizedTest;
33-
import org.junit.jupiter.params.provider.Arguments;
34-
import org.junit.jupiter.params.provider.MethodSource;
3531
import org.sonarsource.scanner.lib.internal.InternalProperties;
3632

3733
import static org.assertj.core.api.Assertions.assertThat;
@@ -77,26 +73,6 @@ void error_dump() {
7773
.hasMessage("Fail to export scanner properties");
7874
}
7975

80-
@Test
81-
void test_get_type_cloud() {
82-
assertThat(underTest.getServerLabel()).isEqualTo("SonarQube Cloud");
83-
}
84-
85-
@ParameterizedTest
86-
@MethodSource("provideServerVersionAndTypeArgumentPairs")
87-
void test_get_types_server_and_community_build(String serverVersion, String serverType) {
88-
assertThat(new SimulationScannerEngineFacade(new HashMap<>(), false, serverVersion).getServerLabel()).isEqualTo(serverType);
89-
}
90-
91-
private static Stream<Arguments> provideServerVersionAndTypeArgumentPairs() {
92-
return Stream.of(
93-
Arguments.of("10.6", "SonarQube Server"),
94-
Arguments.of("2025.1.0.1234", "SonarQube Server"),
95-
Arguments.of("24.12", "SonarQube Community Build"),
96-
Arguments.of("25.1.0.1234", "SonarQube Community Build")
97-
);
98-
}
99-
10076
private Map<String, String> createProperties() {
10177
Map<String, String> prop = new HashMap<>();
10278
prop.put("key1:subkey", "value1");

0 commit comments

Comments
 (0)