Skip to content

Commit 95b40c2

Browse files
[metricsadvisor] support key rotation for MetricsAdvisorKeyCredential (Azure#16276)
* allow rotation of the api/sub keys for MetricsAdvisorKeyCredential * fix tests * fix tests * update changelog
1 parent 9043478 commit 95b40c2

File tree

6 files changed

+471
-2
lines changed

6 files changed

+471
-2
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
**New Features**
66

77
- AAD support authentication #15922
8+
- `MetricsAdvisorKeyCredential` support for rotating the subscription and api keys to update long-lived clients
89

910
## 1.0.0b2 (2020-11-10)
1011

sdk/metricsadvisor/azure-ai-metricsadvisor/azure/ai/metricsadvisor/_metrics_advisor_key_credential.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,45 @@ def __init__(self, subscription_key, api_key):
1818
# type: (str, str) -> None
1919
if not (isinstance(subscription_key, six.string_types) and isinstance(api_key, six.string_types)):
2020
raise TypeError("key must be a string.")
21-
self.subscription_key = subscription_key # type: str
22-
self.api_key = api_key # type: str
21+
self._subscription_key = subscription_key # type: str
22+
self._api_key = api_key # type: str
23+
24+
@property
25+
def subscription_key(self):
26+
# type: () -> str
27+
"""The value of the subscription key.
28+
29+
:rtype: str
30+
"""
31+
return self._subscription_key
32+
33+
@property
34+
def api_key(self):
35+
# type: () -> str
36+
"""The value of the api key.
37+
38+
:rtype: str
39+
"""
40+
return self._api_key
41+
42+
def update(self, subscription_key=None, api_key=None):
43+
# type: (str, str) -> None
44+
"""Update the subscription and/or api key.
45+
46+
This can be used when you've regenerated your service keys and want
47+
to update long-lived clients.
48+
49+
:param str subscription_key: The subscription key
50+
:param str api_key: The api key
51+
:raises: ValueError or TypeError
52+
"""
53+
if not subscription_key and not api_key:
54+
raise ValueError("Pass at least one non-empty key for updating.")
55+
if subscription_key:
56+
if not isinstance(subscription_key, six.string_types):
57+
raise TypeError("The subscription_key used for updating must be a string.")
58+
self._subscription_key = subscription_key
59+
if api_key:
60+
if not isinstance(api_key, six.string_types):
61+
raise TypeError("The api_key used for updating must be a string.")
62+
self._api_key = api_key
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- application/json
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
User-Agent:
12+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
13+
method: GET
14+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
15+
response:
16+
body:
17+
string: '{"feedbackId":"feedback_id","createdTime":"2020-10-21T20:53:05.91Z","userPrincipal":"krpratic@microsoft.com","metricId":"metric_id","dimensionFilter":{"dimension":{"dimension_name":"Mumbai","category":"Shoes
18+
Handbags & Sunglasses"}},"feedbackType":"Anomaly","startTime":"2020-10-01T00:00:00Z","endTime":"2020-10-01T00:00:00Z","value":{"anomalyValue":"NotAnomaly"},"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","anomalyDetectionConfigurationSnapshot":{"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","name":"detection-config","description":"","metricId":"metric_id","wholeMetricConfiguration":{"smartDetectionCondition":{"sensitivity":100.0,"anomalyDetectorDirection":"Both","suppressCondition":{"minNumber":1,"minRatio":100.0}}},"dimensionGroupOverrideConfigurations":[],"seriesOverrideConfigurations":[]}}'
19+
headers:
20+
apim-request-id:
21+
- ff207a4a-c67b-4009-b4de-3f32d0e144ed
22+
content-length:
23+
- '927'
24+
content-type:
25+
- application/json; charset=utf-8
26+
date:
27+
- Thu, 21 Jan 2021 00:19:44 GMT
28+
strict-transport-security:
29+
- max-age=31536000; includeSubDomains; preload
30+
x-content-type-options:
31+
- nosniff
32+
x-envoy-upstream-service-time:
33+
- '202'
34+
x-request-id:
35+
- ff207a4a-c67b-4009-b4de-3f32d0e144ed
36+
status:
37+
code: 200
38+
message: OK
39+
- request:
40+
body: null
41+
headers:
42+
Accept:
43+
- application/json
44+
Accept-Encoding:
45+
- gzip, deflate
46+
Connection:
47+
- keep-alive
48+
User-Agent:
49+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
50+
method: GET
51+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
52+
response:
53+
body:
54+
string: '{"code":"Unauthorized","message":"Access denied due to invalid API
55+
key or wrong API endpoint. Make sure to provide a valid key and use a correct
56+
regional API endpoint."}'
57+
headers:
58+
apim-request-id:
59+
- 722f2e0a-c248-4a9b-8e14-0575b51d0010
60+
content-type:
61+
- application/json; charset=utf-8
62+
date:
63+
- Thu, 21 Jan 2021 00:19:44 GMT
64+
strict-transport-security:
65+
- max-age=31536000; includeSubDomains; preload
66+
transfer-encoding:
67+
- chunked
68+
x-content-type-options:
69+
- nosniff
70+
x-envoy-upstream-service-time:
71+
- '86'
72+
status:
73+
code: 400
74+
message: Bad Request
75+
- request:
76+
body: null
77+
headers:
78+
Accept:
79+
- application/json
80+
Accept-Encoding:
81+
- gzip, deflate
82+
Connection:
83+
- keep-alive
84+
User-Agent:
85+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
86+
method: GET
87+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
88+
response:
89+
body:
90+
string: '{"feedbackId":"feedback_id","createdTime":"2020-10-21T20:53:05.91Z","userPrincipal":"krpratic@microsoft.com","metricId":"metric_id","dimensionFilter":{"dimension":{"dimension_name":"Mumbai","category":"Shoes
91+
Handbags & Sunglasses"}},"feedbackType":"Anomaly","startTime":"2020-10-01T00:00:00Z","endTime":"2020-10-01T00:00:00Z","value":{"anomalyValue":"NotAnomaly"},"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","anomalyDetectionConfigurationSnapshot":{"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","name":"detection-config","description":"","metricId":"metric_id","wholeMetricConfiguration":{"smartDetectionCondition":{"sensitivity":100.0,"anomalyDetectorDirection":"Both","suppressCondition":{"minNumber":1,"minRatio":100.0}}},"dimensionGroupOverrideConfigurations":[],"seriesOverrideConfigurations":[]}}'
92+
headers:
93+
apim-request-id:
94+
- 2107621b-7bb9-403a-b461-a199eb738921
95+
content-length:
96+
- '927'
97+
content-type:
98+
- application/json; charset=utf-8
99+
date:
100+
- Thu, 21 Jan 2021 00:19:45 GMT
101+
strict-transport-security:
102+
- max-age=31536000; includeSubDomains; preload
103+
x-content-type-options:
104+
- nosniff
105+
x-envoy-upstream-service-time:
106+
- '230'
107+
x-request-id:
108+
- 2107621b-7bb9-403a-b461-a199eb738921
109+
status:
110+
code: 200
111+
message: OK
112+
version: 1
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- application/json
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
User-Agent:
12+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
13+
method: GET
14+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
15+
response:
16+
body:
17+
string: '{"feedbackId":"feedback_id","createdTime":"2020-10-21T20:53:05.91Z","userPrincipal":"krpratic@microsoft.com","metricId":"metric_id","dimensionFilter":{"dimension":{"dimension_name":"Mumbai","category":"Shoes
18+
Handbags & Sunglasses"}},"feedbackType":"Anomaly","startTime":"2020-10-01T00:00:00Z","endTime":"2020-10-01T00:00:00Z","value":{"anomalyValue":"NotAnomaly"},"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","anomalyDetectionConfigurationSnapshot":{"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","name":"detection-config","description":"","metricId":"metric_id","wholeMetricConfiguration":{"smartDetectionCondition":{"sensitivity":100.0,"anomalyDetectorDirection":"Both","suppressCondition":{"minNumber":1,"minRatio":100.0}}},"dimensionGroupOverrideConfigurations":[],"seriesOverrideConfigurations":[]}}'
19+
headers:
20+
apim-request-id:
21+
- bd25f508-276f-4a03-9c4f-9c01ca86cb09
22+
content-length:
23+
- '927'
24+
content-type:
25+
- application/json; charset=utf-8
26+
date:
27+
- Thu, 21 Jan 2021 00:19:45 GMT
28+
strict-transport-security:
29+
- max-age=31536000; includeSubDomains; preload
30+
x-content-type-options:
31+
- nosniff
32+
x-envoy-upstream-service-time:
33+
- '105'
34+
x-request-id:
35+
- bd25f508-276f-4a03-9c4f-9c01ca86cb09
36+
status:
37+
code: 200
38+
message: OK
39+
- request:
40+
body: null
41+
headers:
42+
Accept:
43+
- application/json
44+
Accept-Encoding:
45+
- gzip, deflate
46+
Connection:
47+
- keep-alive
48+
User-Agent:
49+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
50+
method: GET
51+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
52+
response:
53+
body:
54+
string: '{"error":{"code":"401","message":"Access denied due to invalid subscription
55+
key or wrong API endpoint. Make sure to provide a valid key for an active
56+
subscription and use a correct regional API endpoint for your resource."}}'
57+
headers:
58+
content-length:
59+
- '224'
60+
date:
61+
- Thu, 21 Jan 2021 00:19:45 GMT
62+
status:
63+
code: 401
64+
message: PermissionDenied
65+
- request:
66+
body: null
67+
headers:
68+
Accept:
69+
- application/json
70+
Accept-Encoding:
71+
- gzip, deflate
72+
Connection:
73+
- keep-alive
74+
User-Agent:
75+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
76+
method: GET
77+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
78+
response:
79+
body:
80+
string: '{"feedbackId":"feedback_id","createdTime":"2020-10-21T20:53:05.91Z","userPrincipal":"krpratic@microsoft.com","metricId":"metric_id","dimensionFilter":{"dimension":{"dimension_name":"Mumbai","category":"Shoes
81+
Handbags & Sunglasses"}},"feedbackType":"Anomaly","startTime":"2020-10-01T00:00:00Z","endTime":"2020-10-01T00:00:00Z","value":{"anomalyValue":"NotAnomaly"},"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","anomalyDetectionConfigurationSnapshot":{"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","name":"detection-config","description":"","metricId":"metric_id","wholeMetricConfiguration":{"smartDetectionCondition":{"sensitivity":100.0,"anomalyDetectorDirection":"Both","suppressCondition":{"minNumber":1,"minRatio":100.0}}},"dimensionGroupOverrideConfigurations":[],"seriesOverrideConfigurations":[]}}'
82+
headers:
83+
apim-request-id:
84+
- 0e520a36-d235-4784-b83c-c7fc43a1a47c
85+
content-length:
86+
- '927'
87+
content-type:
88+
- application/json; charset=utf-8
89+
date:
90+
- Thu, 21 Jan 2021 00:19:46 GMT
91+
strict-transport-security:
92+
- max-age=31536000; includeSubDomains; preload
93+
x-content-type-options:
94+
- nosniff
95+
x-envoy-upstream-service-time:
96+
- '106'
97+
x-request-id:
98+
- 0e520a36-d235-4784-b83c-c7fc43a1a47c
99+
status:
100+
code: 200
101+
message: OK
102+
version: 1
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- application/json
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
User-Agent:
12+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
13+
method: GET
14+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
15+
response:
16+
body:
17+
string: '{"feedbackId":"feedback_id","createdTime":"2020-10-21T20:53:05.91Z","userPrincipal":"krpratic@microsoft.com","metricId":"metric_id","dimensionFilter":{"dimension":{"dimension_name":"Mumbai","category":"Shoes
18+
Handbags & Sunglasses"}},"feedbackType":"Anomaly","startTime":"2020-10-01T00:00:00Z","endTime":"2020-10-01T00:00:00Z","value":{"anomalyValue":"NotAnomaly"},"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","anomalyDetectionConfigurationSnapshot":{"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","name":"detection-config","description":"","metricId":"metric_id","wholeMetricConfiguration":{"smartDetectionCondition":{"sensitivity":100.0,"anomalyDetectorDirection":"Both","suppressCondition":{"minNumber":1,"minRatio":100.0}}},"dimensionGroupOverrideConfigurations":[],"seriesOverrideConfigurations":[]}}'
19+
headers:
20+
apim-request-id:
21+
- 1b8c4f41-01bc-49dc-a6fb-a52a9d5b5e38
22+
content-length:
23+
- '927'
24+
content-type:
25+
- application/json; charset=utf-8
26+
date:
27+
- Thu, 21 Jan 2021 00:19:46 GMT
28+
strict-transport-security:
29+
- max-age=31536000; includeSubDomains; preload
30+
x-content-type-options:
31+
- nosniff
32+
x-envoy-upstream-service-time:
33+
- '100'
34+
x-request-id:
35+
- 1b8c4f41-01bc-49dc-a6fb-a52a9d5b5e38
36+
status:
37+
code: 200
38+
message: OK
39+
- request:
40+
body: null
41+
headers:
42+
Accept:
43+
- application/json
44+
Accept-Encoding:
45+
- gzip, deflate
46+
Connection:
47+
- keep-alive
48+
User-Agent:
49+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
50+
method: GET
51+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
52+
response:
53+
body:
54+
string: '{"error":{"code":"401","message":"Access denied due to invalid subscription
55+
key or wrong API endpoint. Make sure to provide a valid key for an active
56+
subscription and use a correct regional API endpoint for your resource."}}'
57+
headers:
58+
content-length:
59+
- '224'
60+
date:
61+
- Thu, 21 Jan 2021 00:19:46 GMT
62+
status:
63+
code: 401
64+
message: PermissionDenied
65+
- request:
66+
body: null
67+
headers:
68+
Accept:
69+
- application/json
70+
Accept-Encoding:
71+
- gzip, deflate
72+
Connection:
73+
- keep-alive
74+
User-Agent:
75+
- azsdk-python-ai-metricsadvisor/1.0.0b3 Python/3.9.0 (Windows-10-10.0.19041-SP0)
76+
method: GET
77+
uri: https://js-metrics-advisor.cognitiveservices.azure.com/metricsadvisor/v1.0/feedback/metric/feedback_id
78+
response:
79+
body:
80+
string: '{"feedbackId":"feedback_id","createdTime":"2020-10-21T20:53:05.91Z","userPrincipal":"krpratic@microsoft.com","metricId":"metric_id","dimensionFilter":{"dimension":{"dimension_name":"Mumbai","category":"Shoes
81+
Handbags & Sunglasses"}},"feedbackType":"Anomaly","startTime":"2020-10-01T00:00:00Z","endTime":"2020-10-01T00:00:00Z","value":{"anomalyValue":"NotAnomaly"},"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","anomalyDetectionConfigurationSnapshot":{"anomalyDetectionConfigurationId":"e17f32d4-3ddf-4dc7-84ee-b4130c7e1777","name":"detection-config","description":"","metricId":"metric_id","wholeMetricConfiguration":{"smartDetectionCondition":{"sensitivity":100.0,"anomalyDetectorDirection":"Both","suppressCondition":{"minNumber":1,"minRatio":100.0}}},"dimensionGroupOverrideConfigurations":[],"seriesOverrideConfigurations":[]}}'
82+
headers:
83+
apim-request-id:
84+
- 5bbd22d2-10b9-4d29-ac53-47bb62ff2588
85+
content-length:
86+
- '927'
87+
content-type:
88+
- application/json; charset=utf-8
89+
date:
90+
- Thu, 21 Jan 2021 00:19:46 GMT
91+
strict-transport-security:
92+
- max-age=31536000; includeSubDomains; preload
93+
x-content-type-options:
94+
- nosniff
95+
x-envoy-upstream-service-time:
96+
- '116'
97+
x-request-id:
98+
- 5bbd22d2-10b9-4d29-ac53-47bb62ff2588
99+
status:
100+
code: 200
101+
message: OK
102+
version: 1

0 commit comments

Comments
 (0)