Skip to content

Commit 77efff6

Browse files
authored
Enable national cloud testing for ACR library. (Azure#23117)
1 parent 0f976ef commit 77efff6

File tree

46 files changed

+3438
-1967
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+3438
-1967
lines changed

sdk/containerregistry/azure-containers-containerregistry/src/test/java/com/azure/containers/containerregistry/ContainerRegistryClientIntegrationTests.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.azure.core.http.HttpClient;
99
import com.azure.core.test.TestMode;
1010
import com.azure.core.util.Context;
11+
import com.azure.identity.AzureAuthorityHosts;
12+
import org.junit.jupiter.api.Assumptions;
1113
import org.junit.jupiter.api.BeforeEach;
1214
import org.junit.jupiter.params.ParameterizedTest;
1315
import org.junit.jupiter.params.provider.MethodSource;
@@ -31,6 +33,7 @@
3133
import static com.azure.containers.containerregistry.TestUtils.V2_TAG_NAME;
3234
import static com.azure.containers.containerregistry.TestUtils.V3_TAG_NAME;
3335
import static com.azure.containers.containerregistry.TestUtils.V4_TAG_NAME;
36+
import static com.azure.containers.containerregistry.TestUtils.getAuthority;
3437
import static org.junit.jupiter.api.Assertions.assertEquals;
3538
import static org.junit.jupiter.api.Assertions.assertNotNull;
3639
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -176,20 +179,20 @@ public void convenienceProperties(HttpClient httpClient) {
176179
@ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS)
177180
@MethodSource("getHttpClients")
178181
public void authenticationScopeTest(HttpClient httpClient) {
182+
Assumptions.assumeFalse(getTestMode().equals(TestMode.PLAYBACK));
183+
Assumptions.assumeFalse(REGISTRY_ENDPOINT == null);
184+
Assumptions.assumeTrue(getAuthority(REGISTRY_ENDPOINT).equals(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD));
179185
ContainerRegistryClient registryClient = getContainerRegistryBuilder(httpClient)
180186
.authenticationScope(AZURE_GLOBAL_AUTHENTICATION_SCOPE)
181187
.buildClient();
182188

183189
List<String> repositories = registryClient.listRepositoryNames().stream().collect(Collectors.toList());
184190
validateRepositories(repositories);
185191

186-
if (getTestMode() != TestMode.PLAYBACK) {
187-
// Now doing the same should fail with the separate registryClient;
188-
ContainerRegistryClient throwableRegistryClient = getContainerRegistryBuilder(httpClient)
189-
.authenticationScope(AZURE_GOV_AUTHENTICATION_SCOPE)
190-
.buildClient();
191-
assertThrows(ClientAuthenticationException.class, () -> throwableRegistryClient.listRepositoryNames().stream().collect(Collectors.toList()));
192-
}
192+
ContainerRegistryClient throwableRegistryClient = getContainerRegistryBuilder(httpClient)
193+
.authenticationScope(AZURE_GOV_AUTHENTICATION_SCOPE)
194+
.buildClient();
195+
assertThrows(ClientAuthenticationException.class, () -> throwableRegistryClient.listRepositoryNames().stream().collect(Collectors.toList()));
193196
}
194197
}
195198

sdk/containerregistry/azure-containers-containerregistry/src/test/java/com/azure/containers/containerregistry/ContainerRegistryClientsTestBase.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import static com.azure.containers.containerregistry.TestUtils.REGISTRY_ENDPOINT;
3636
import static com.azure.containers.containerregistry.TestUtils.REGISTRY_ENDPOINT_PLAYBACK;
3737
import static com.azure.containers.containerregistry.TestUtils.V1_TAG_NAME;
38-
import static com.azure.containers.containerregistry.TestUtils.getCredential;
38+
import static com.azure.containers.containerregistry.TestUtils.getCredentialsByEndpoint;
3939
import static com.azure.containers.containerregistry.TestUtils.isSorted;
4040
import static org.junit.jupiter.api.Assertions.assertEquals;
4141
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -86,20 +86,23 @@ public class ContainerRegistryClientsTestBase extends TestBase {
8686
.setTeleportEnabled(false);
8787

8888
ContainerRegistryClientBuilder getContainerRegistryBuilder(HttpClient httpClient) {
89-
TokenCredential credential = getCredential(getTestMode());
89+
TokenCredential credential = getCredentialsByEndpoint(getTestMode(), REGISTRY_ENDPOINT);
9090
return getContainerRegistryBuilder(httpClient, credential);
9191
}
9292

9393
ContainerRegistryClientBuilder getContainerRegistryBuilder(HttpClient httpClient, TokenCredential credential, String endpoint) {
9494
List<Function<String, String>> redactors = new ArrayList<>();
9595
redactors.add(data -> redact(data, JSON_PROPERTY_VALUE_REDACTION_PATTERN.matcher(data), "REDACTED"));
9696

97+
String authenticationScope = TestUtils.getAuthenticationScope(endpoint);
98+
9799
ContainerRegistryClientBuilder builder = new ContainerRegistryClientBuilder()
98100
.endpoint(getEndpoint(endpoint))
99101
.httpClient(httpClient == null ? interceptorManager.getPlaybackClient() : httpClient)
100102
.httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
101103
.addPolicy(interceptorManager.getRecordPolicy(redactors))
102-
.credential(credential);
104+
.credential(credential)
105+
.authenticationScope(authenticationScope);
103106

104107
// builder.httpClient(new NettyAsyncHttpClientBuilder().proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888))).build());
105108
return builder;

sdk/containerregistry/azure-containers-containerregistry/src/test/java/com/azure/containers/containerregistry/ContainerRepositoryAnonymousAccessTests.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package com.azure.containers.containerregistry;
55

66
import com.azure.core.http.HttpClient;
7+
import com.azure.identity.AzureAuthorityHosts;
8+
import org.junit.jupiter.api.Assumptions;
79
import org.junit.jupiter.api.BeforeEach;
810
import org.junit.jupiter.params.ParameterizedTest;
911
import org.junit.jupiter.params.provider.MethodSource;
@@ -16,17 +18,21 @@
1618
import static com.azure.containers.containerregistry.TestUtils.ANONYMOUS_REGISTRY_NAME;
1719
import static com.azure.containers.containerregistry.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;
1820
import static com.azure.containers.containerregistry.TestUtils.HELLO_WORLD_REPOSITORY_NAME;
21+
import static com.azure.containers.containerregistry.TestUtils.getAuthority;
1922
import static org.junit.jupiter.api.Assertions.assertTrue;
2023

2124
public class ContainerRepositoryAnonymousAccessTests extends ContainerRegistryClientsTestBase {
2225
@BeforeEach
2326
void beforeEach() {
24-
TestUtils.importImageAsync(getTestMode(), ANONYMOUS_REGISTRY_NAME, HELLO_WORLD_REPOSITORY_NAME, Arrays.asList("latest", "v1", "v2", "v3", "v4")).block();
27+
TestUtils.importImageAsync(getTestMode(), ANONYMOUS_REGISTRY_NAME, HELLO_WORLD_REPOSITORY_NAME, Arrays.asList("latest", "v1", "v2", "v3", "v4"), ANONYMOUS_REGISTRY_ENDPOINT).block();
2528
}
2629

2730
@ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS)
2831
@MethodSource("getHttpClients")
2932
public void listAnonymousRepositories(HttpClient httpClient) {
33+
Assumptions.assumeFalse(ANONYMOUS_REGISTRY_ENDPOINT == null);
34+
Assumptions.assumeTrue(getAuthority(ANONYMOUS_REGISTRY_ENDPOINT).equals(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD));
35+
3036
ContainerRegistryClient client = getContainerRegistryBuilder(httpClient, null, ANONYMOUS_REGISTRY_ENDPOINT).buildClient();
3137
List<String> repositories = client.listRepositoryNames().stream().collect(Collectors.toList());
3238
assertTrue(repositories.stream().anyMatch(HELLO_WORLD_REPOSITORY_NAME::equals));

sdk/containerregistry/azure-containers-containerregistry/src/test/java/com/azure/containers/containerregistry/TestUtils.java

Lines changed: 80 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.azure.core.management.profile.AzureProfile;
1212
import com.azure.core.test.TestMode;
1313
import com.azure.core.util.Configuration;
14+
import com.azure.identity.AzureAuthorityHosts;
15+
import com.azure.identity.ClientSecretCredentialBuilder;
1416
import com.azure.identity.DefaultAzureCredentialBuilder;
1517
import com.azure.resourcemanager.containerregistry.ContainerRegistryManager;
1618
import com.azure.resourcemanager.containerregistry.models.ImportImageParameters;
@@ -48,6 +50,8 @@ public class TestUtils {
4850
public static final String REGISTRY_NAME;
4951
public static final String RESOURCE_GROUP;
5052
public static final String SUBSCRIPTION_ID;
53+
public static final String TENANT_ID;
54+
public static final String CLIENT_ID;
5155
public static final String REGISTRY_URI;
5256
public static final String REGISTRY_ENDPOINT;
5357
public static final String ANONYMOUS_REGISTRY_ENDPOINT;
@@ -61,6 +65,7 @@ public class TestUtils {
6165
public static final int HTTP_STATUS_CODE_202;
6266
public static final String AZURE_GLOBAL_AUTHENTICATION_SCOPE;
6367
public static final String AZURE_GOV_AUTHENTICATION_SCOPE;
68+
public static final String CONTAINERREGISTRY_CLIENT_SECRET;
6469

6570
static {
6671
CONFIGURATION = Configuration.getGlobalConfiguration().clone();
@@ -85,12 +90,15 @@ public class TestUtils {
8590
WINDOWS_OPERATING_SYSTEM = "windows";
8691
RESOURCE_GROUP = CONFIGURATION.get("CONTAINERREGISTRY_RESOURCE_GROUP");
8792
SUBSCRIPTION_ID = CONFIGURATION.get("CONTAINERREGISTRY_SUBSCRIPTION_ID");
93+
TENANT_ID = CONFIGURATION.get("CONTAINERREGISTRY_TENANT_ID");
94+
CLIENT_ID = CONFIGURATION.get("CONTAINERREGISTRY_CLIENT_ID");
8895
REGISTRY_NAME = CONFIGURATION.get("CONTAINERREGISTRY_REGISTRY_NAME");
8996
REGISTRY_ENDPOINT = CONFIGURATION.get("CONTAINERREGISTRY_ENDPOINT");
9097
REGISTRY_URI = "registry.hub.docker.com";
9198
SLEEP_TIME_IN_MILLISECONDS = 5000;
9299
ANONYMOUS_REGISTRY_NAME = CONFIGURATION.get("CONTAINERREGISTRY_ANONREGISTRY_NAME");
93100
ANONYMOUS_REGISTRY_ENDPOINT = CONFIGURATION.get("CONTAINERREGISTRY_ANONREGISTRY_ENDPOINT");
101+
CONTAINERREGISTRY_CLIENT_SECRET = CONFIGURATION.get("CONTAINERREGISTRY_CLIENT_SECRET");
94102
LOGIN_SERVER_SUFFIX = "azurecr.io";
95103
REGISTRY_ENDPOINT_PLAYBACK = "https://pallavitcontainerregistry.azurecr.io";
96104
REGISTRY_NAME_PLAYBACK = "pallavitcontainerregistry";
@@ -124,12 +132,29 @@ static <T extends Comparable<? super T>> boolean isSorted(Iterable<T> iterable)
124132
return true;
125133
}
126134

127-
static TokenCredential getCredential(TestMode testMode) {
135+
static TokenCredential getCredentialsByEndpoint(TestMode testMode, String endpoint) {
128136
if (testMode == TestMode.PLAYBACK) {
129137
return new FakeCredentials();
130138
}
131139

132-
return new DefaultAzureCredentialBuilder().build();
140+
String authority = getAuthority(endpoint);
141+
return getCredentialByAuthority(testMode, authority);
142+
}
143+
144+
static TokenCredential getCredentialByAuthority(TestMode testMode, String authority) {
145+
if (testMode == TestMode.PLAYBACK) {
146+
return new FakeCredentials();
147+
}
148+
149+
if (authority == AzureAuthorityHosts.AZURE_PUBLIC_CLOUD) {
150+
return new DefaultAzureCredentialBuilder().build();
151+
} else {
152+
return new ClientSecretCredentialBuilder()
153+
.tenantId(TENANT_ID)
154+
.clientId(CLIENT_ID)
155+
.clientSecret(CONTAINERREGISTRY_CLIENT_SECRET)
156+
.authorityHost(authority).build();
157+
}
133158
}
134159

135160
static void importImage(TestMode mode, String repository, List<String> tags) {
@@ -145,20 +170,69 @@ static void importImage(TestMode mode, String repository, List<String> tags) {
145170
}
146171
}
147172

173+
public static String getAuthority(String endpoint) {
174+
if (endpoint == null) {
175+
return AzureAuthorityHosts.AZURE_PUBLIC_CLOUD;
176+
}
177+
178+
if (endpoint.contains(".azurecr.io")) {
179+
return AzureAuthorityHosts.AZURE_PUBLIC_CLOUD;
180+
}
181+
182+
if (endpoint.contains(".azurecr.cn")) {
183+
return AzureAuthorityHosts.AZURE_CHINA;
184+
}
185+
186+
if (endpoint.contains(".azurecr.us")) {
187+
return AzureAuthorityHosts.AZURE_GOVERNMENT;
188+
}
189+
190+
// By default we will assume that the authority is public
191+
return AzureAuthorityHosts.AZURE_PUBLIC_CLOUD;
192+
}
193+
194+
public static String getAuthenticationScope(String endpoint) {
195+
String authority = getAuthority(endpoint);
196+
switch (authority) {
197+
case AzureAuthorityHosts.AZURE_PUBLIC_CLOUD:
198+
return "https://management.core.windows.net/.default";
199+
200+
case AzureAuthorityHosts.AZURE_CHINA:
201+
return "https://management.chinacloudapi.cn/.default";
202+
203+
case AzureAuthorityHosts.AZURE_GOVERNMENT:
204+
return "https://management.usgovcloudapi.net/.default";
205+
206+
default:
207+
return null;
208+
}
209+
}
210+
211+
static AzureProfile getAzureProfile(String authority) {
212+
switch (authority) {
213+
case AzureAuthorityHosts.AZURE_PUBLIC_CLOUD: return new AzureProfile(TENANT_ID, SUBSCRIPTION_ID, AzureEnvironment.AZURE);
214+
case AzureAuthorityHosts.AZURE_CHINA: return new AzureProfile(TENANT_ID, SUBSCRIPTION_ID, AzureEnvironment.AZURE_CHINA);
215+
case AzureAuthorityHosts.AZURE_GOVERNMENT: return new AzureProfile(TENANT_ID, SUBSCRIPTION_ID, AzureEnvironment.AZURE_US_GOVERNMENT);
216+
default: return null;
217+
}
218+
}
219+
148220
static Mono<Void> importImageAsync(TestMode mode, String repository, List<String> tags) {
149-
return importImageAsync(mode, REGISTRY_NAME, repository, tags);
221+
return importImageAsync(mode, REGISTRY_NAME, repository, tags, REGISTRY_ENDPOINT);
150222
}
151223

152-
static Mono<Void> importImageAsync(TestMode mode, String registryName, String repository, List<String> tags) {
224+
static Mono<Void> importImageAsync(TestMode mode, String registryName, String repository, List<String> tags, String endpoint) {
153225
if (mode == TestMode.PLAYBACK) {
154226
return Mono.empty();
155227
}
156228

157-
TokenCredential credential = getCredential(mode);
229+
String authority = getAuthority(endpoint);
158230

231+
TokenCredential credential = getCredentialByAuthority(mode, authority);
159232
tags = tags.stream().map(tag -> String.format("%1$s:%2$s", repository, tag)).collect(Collectors.toList());
233+
AzureProfile profile = getAzureProfile(authority);
160234

161-
ContainerRegistryManager manager = ContainerRegistryManager.authenticate(credential, new AzureProfile(AzureEnvironment.AZURE));
235+
ContainerRegistryManager manager = ContainerRegistryManager.authenticate(credential, profile);
162236

163237
return manager.serviceClient().getRegistries().importImageAsync(
164238
RESOURCE_GROUP,

0 commit comments

Comments
 (0)