Skip to content

Commit cebd109

Browse files
authored
Support AAD authentication for Metrics Advisor (Azure#18718)
1 parent 5ed4aa6 commit cebd109

22 files changed

+843
-56
lines changed

sdk/metricsadvisor/azure-ai-metricsadvisor/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Release History
22

33
## 1.0.0-beta.3 (Unreleased)
4-
4+
- Support Azure Active Directory (AAD) authentication for Metrics Advisor clients.
55

66
## 1.0.0-beta.2 (2020-11-10)
77

sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/MetricsAdvisorClientBuilder.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
import com.azure.ai.metricsadvisor.models.MetricsAdvisorKeyCredential;
99
import com.azure.ai.metricsadvisor.models.MetricsAdvisorServiceVersion;
1010
import com.azure.core.annotation.ServiceClientBuilder;
11+
import com.azure.core.credential.TokenCredential;
1112
import com.azure.core.http.ContentType;
1213
import com.azure.core.http.HttpClient;
1314
import com.azure.core.http.HttpHeaders;
1415
import com.azure.core.http.HttpPipeline;
1516
import com.azure.core.http.HttpPipelineBuilder;
1617
import com.azure.core.http.policy.AddDatePolicy;
1718
import com.azure.core.http.policy.AddHeadersPolicy;
19+
import com.azure.core.http.policy.BearerTokenAuthenticationPolicy;
1820
import com.azure.core.http.policy.HttpLogDetailLevel;
1921
import com.azure.core.http.policy.HttpLogOptions;
2022
import com.azure.core.http.policy.HttpPipelinePolicy;
@@ -85,7 +87,8 @@ public final class MetricsAdvisorClientBuilder {
8587
private final String clientVersion;
8688

8789
private String endpoint;
88-
private MetricsAdvisorKeyCredential credential;
90+
private MetricsAdvisorKeyCredential metricsAdvisorKeyCredential;
91+
private TokenCredential tokenCredential;
8992
private HttpClient httpClient;
9093
private HttpLogOptions httpLogOptions;
9194
private HttpPipeline httpPipeline;
@@ -178,9 +181,12 @@ private HttpPipeline getDefaultHttpPipeline(Configuration buildConfiguration) {
178181
final List<HttpPipelinePolicy> policies = new ArrayList<>();
179182

180183
// Authentications
181-
if (credential != null) {
182-
headers.put(OCP_APIM_SUBSCRIPTION_KEY, credential.getSubscriptionKey());
183-
headers.put(API_KEY, credential.getApiKey());
184+
if (tokenCredential != null) {
185+
policies.add(new BearerTokenAuthenticationPolicy(tokenCredential, DEFAULT_SCOPE));
186+
} else if (!CoreUtils.isNullOrEmpty(metricsAdvisorKeyCredential.getSubscriptionKey())
187+
|| !CoreUtils.isNullOrEmpty(metricsAdvisorKeyCredential.getApiKey())) {
188+
headers.put(OCP_APIM_SUBSCRIPTION_KEY, metricsAdvisorKeyCredential.getSubscriptionKey());
189+
headers.put(API_KEY, metricsAdvisorKeyCredential.getApiKey());
184190
} else {
185191
// Throw exception that credential cannot be null
186192
throw logger.logExceptionAsError(
@@ -232,6 +238,18 @@ public MetricsAdvisorClientBuilder endpoint(String endpoint) {
232238
return this;
233239
}
234240

241+
/**
242+
* Sets the {@link TokenCredential} used to authenticate HTTP requests.
243+
*
244+
* @param tokenCredential {@link TokenCredential} used to authenticate HTTP requests.
245+
* @return The updated {@link MetricsAdvisorClientBuilder} object.
246+
* @throws NullPointerException If {@code tokenCredential} is null.
247+
*/
248+
public MetricsAdvisorClientBuilder credential(TokenCredential tokenCredential) {
249+
this.tokenCredential = Objects.requireNonNull(tokenCredential, "'tokenCredential' cannot be null.");
250+
return this;
251+
}
252+
235253
/**
236254
* Sets the {@link MetricsAdvisorKeyCredential} to use when authenticating HTTP requests for this
237255
* MetricsAdvisorClientBuilder.
@@ -242,7 +260,7 @@ public MetricsAdvisorClientBuilder endpoint(String endpoint) {
242260
* @throws NullPointerException If {@code metricsAdvisorKeyCredential} is null.
243261
*/
244262
public MetricsAdvisorClientBuilder credential(MetricsAdvisorKeyCredential metricsAdvisorKeyCredential) {
245-
this.credential = Objects.requireNonNull(metricsAdvisorKeyCredential,
263+
this.metricsAdvisorKeyCredential = Objects.requireNonNull(metricsAdvisorKeyCredential,
246264
"'metricsAdvisorKeyCredential' cannot be null.");
247265
return this;
248266
}

sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClientBuilder.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
import com.azure.ai.metricsadvisor.models.MetricsAdvisorKeyCredential;
99
import com.azure.ai.metricsadvisor.models.MetricsAdvisorServiceVersion;
1010
import com.azure.core.annotation.ServiceClientBuilder;
11+
import com.azure.core.credential.TokenCredential;
1112
import com.azure.core.http.ContentType;
1213
import com.azure.core.http.HttpClient;
1314
import com.azure.core.http.HttpHeaders;
1415
import com.azure.core.http.HttpPipeline;
1516
import com.azure.core.http.HttpPipelineBuilder;
1617
import com.azure.core.http.policy.AddDatePolicy;
1718
import com.azure.core.http.policy.AddHeadersPolicy;
19+
import com.azure.core.http.policy.BearerTokenAuthenticationPolicy;
1820
import com.azure.core.http.policy.HttpLogDetailLevel;
1921
import com.azure.core.http.policy.HttpLogOptions;
2022
import com.azure.core.http.policy.HttpPipelinePolicy;
@@ -88,7 +90,8 @@ public final class MetricsAdvisorAdministrationClientBuilder {
8890
private final String clientVersion;
8991

9092
private String endpoint;
91-
private MetricsAdvisorKeyCredential credential;
93+
private TokenCredential tokenCredential;
94+
private MetricsAdvisorKeyCredential metricsAdvisorKeyCredential;
9295
private HttpClient httpClient;
9396
private HttpLogOptions httpLogOptions;
9497
private HttpPipeline httpPipeline;
@@ -190,11 +193,14 @@ private HttpPipeline getDefaultHttpPipeline(Configuration buildConfiguration) {
190193
policies.add(new AddDatePolicy());
191194

192195
// Authentications
193-
if (credential.getSubscriptionKey() != null || credential.getApiKey() != null) {
194-
headers.put(OCP_APIM_SUBSCRIPTION_KEY, credential.getSubscriptionKey());
195-
headers.put(API_KEY, credential.getApiKey());
196+
if (tokenCredential != null) {
197+
policies.add(new BearerTokenAuthenticationPolicy(tokenCredential, DEFAULT_SCOPE));
198+
} else if (!CoreUtils.isNullOrEmpty(metricsAdvisorKeyCredential.getSubscriptionKey())
199+
|| !CoreUtils.isNullOrEmpty(metricsAdvisorKeyCredential.getApiKey())) {
200+
headers.put(OCP_APIM_SUBSCRIPTION_KEY, metricsAdvisorKeyCredential.getSubscriptionKey());
201+
headers.put(API_KEY, metricsAdvisorKeyCredential.getApiKey());
196202
} else {
197-
// Throw exception that credential cannot be null
203+
// Throw exception that credential and tokenCredential cannot be null
198204
throw logger.logExceptionAsError(
199205
new IllegalArgumentException("Missing credential information while building a client."));
200206
}
@@ -235,6 +241,18 @@ public MetricsAdvisorAdministrationClientBuilder endpoint(String endpoint) {
235241
return this;
236242
}
237243

244+
/**
245+
* Sets the {@link TokenCredential} used to authenticate HTTP requests.
246+
*
247+
* @param tokenCredential {@link TokenCredential} used to authenticate HTTP requests.
248+
* @return The updated {@link MetricsAdvisorAdministrationClientBuilder} object.
249+
* @throws NullPointerException If {@code tokenCredential} is null.
250+
*/
251+
public MetricsAdvisorAdministrationClientBuilder credential(TokenCredential tokenCredential) {
252+
this.tokenCredential = Objects.requireNonNull(tokenCredential, "'tokenCredential' cannot be null.");
253+
return this;
254+
}
255+
238256
/**
239257
* Sets the {@link MetricsAdvisorKeyCredential} to use when authenticating HTTP requests for this
240258
* MetricsAdvisorAdministrationClientBuilder.
@@ -246,7 +264,7 @@ public MetricsAdvisorAdministrationClientBuilder endpoint(String endpoint) {
246264
*/
247265
public MetricsAdvisorAdministrationClientBuilder credential(
248266
MetricsAdvisorKeyCredential metricsAdvisorKeyCredential) {
249-
this.credential = Objects.requireNonNull(metricsAdvisorKeyCredential,
267+
this.metricsAdvisorKeyCredential = Objects.requireNonNull(metricsAdvisorKeyCredential,
250268
"'metricsAdvisorKeyCredential' cannot be null.");
251269
return this;
252270
}

sdk/metricsadvisor/azure-ai-metricsadvisor/src/test/java/com/azure/ai/metricsadvisor/AlertTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ static void afterAll() {
3535

3636
@ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS)
3737
@MethodSource("com.azure.ai.metricsadvisor.TestUtils#getTestParameters")
38-
@Override
3938
public void listAlerts(HttpClient httpClient, MetricsAdvisorServiceVersion serviceVersion) {
4039
MetricsAdvisorClient client = getMetricsAdvisorBuilder(httpClient, serviceVersion).buildClient();
4140

sdk/metricsadvisor/azure-ai-metricsadvisor/src/test/java/com/azure/ai/metricsadvisor/AnomalyIncidentDetectedTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ static void afterAll() {
3434

3535
@ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS)
3636
@MethodSource("com.azure.ai.metricsadvisor.TestUtils#getTestParameters")
37-
@Override
3837
public void listIncidentsDetected(HttpClient httpClient, MetricsAdvisorServiceVersion serviceVersion) {
3938
MetricsAdvisorClient client = getMetricsAdvisorBuilder(httpClient, serviceVersion).buildClient();
4039

sdk/metricsadvisor/azure-ai-metricsadvisor/src/test/java/com/azure/ai/metricsadvisor/IncidentRootCauseTestBase.java

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,6 @@
77
import com.azure.ai.metricsadvisor.implementation.models.RootCause;
88
import com.azure.ai.metricsadvisor.implementation.util.IncidentRootCauseTransforms;
99
import com.azure.ai.metricsadvisor.models.IncidentRootCause;
10-
import com.azure.ai.metricsadvisor.models.MetricsAdvisorKeyCredential;
11-
import com.azure.ai.metricsadvisor.models.MetricsAdvisorServiceVersion;
12-
import com.azure.core.http.HttpClient;
13-
import com.azure.core.http.policy.HttpLogDetailLevel;
14-
import com.azure.core.http.policy.HttpLogOptions;
15-
import com.azure.core.test.TestBase;
16-
import com.azure.core.test.TestMode;
1710
import com.azure.core.util.Configuration;
1811

1912
import java.util.Collections;
@@ -24,7 +17,7 @@
2417
import static org.junit.jupiter.api.Assertions.assertEquals;
2518
import static org.junit.jupiter.api.Assertions.assertNotNull;
2619

27-
public abstract class IncidentRootCauseTestBase extends TestBase {
20+
public abstract class IncidentRootCauseTestBase extends MetricsAdvisorClientTestBase {
2821

2922
static final String INCIDENT_ROOT_CAUSE_ID = "2583ff47fef9174e6d6bfe73415ad914-174d2024c00";
3023
static final String INCIDENT_ROOT_CAUSE_CONFIGURATION_ID = DETECTION_CONFIGURATION_ID;
@@ -33,26 +26,6 @@ public abstract class IncidentRootCauseTestBase extends TestBase {
3326
protected void beforeTest() {
3427
}
3528

36-
MetricsAdvisorClientBuilder getMetricsAdvisorBuilder(HttpClient httpClient,
37-
MetricsAdvisorServiceVersion serviceVersion) {
38-
MetricsAdvisorClientBuilder builder = new MetricsAdvisorClientBuilder()
39-
.endpoint(getEndpoint())
40-
.httpClient(httpClient == null ? interceptorManager.getPlaybackClient() : httpClient)
41-
.httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
42-
.serviceVersion(serviceVersion)
43-
.addPolicy(interceptorManager.getRecordPolicy());
44-
45-
if (getTestMode() == TestMode.PLAYBACK) {
46-
builder.credential(new MetricsAdvisorKeyCredential("", ""));
47-
} else {
48-
builder.credential(
49-
new MetricsAdvisorKeyCredential(
50-
Configuration.getGlobalConfiguration().get("AZURE_METRICS_ADVISOR_SUBSCRIPTION_KEY"),
51-
Configuration.getGlobalConfiguration().get("AZURE_METRICS_ADVISOR_API_KEY")));
52-
}
53-
return builder;
54-
}
55-
5629
static IncidentRootCause getExpectedIncidentRootCause() {
5730
RootCause innerRootCause = new RootCause()
5831
.setRootCause(new DimensionGroupIdentity().setDimension(new HashMap<String, String>() {

0 commit comments

Comments
 (0)