From 7f18c4a6e885e866cb964c200b53f6176e8faae0 Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Wed, 17 Jan 2018 16:42:22 -0800 Subject: [PATCH 01/22] Updates for GA release. --- .../azure-cli-advisor/HISTORY.rst | 4 ++ .../cli/command_modules/advisor/_help.py | 2 +- .../latest/test_generate_recommendations.yaml | 18 +++--- ...get_set_configurations_resource_group.yaml | 56 +++++++++---------- ...t_get_set_configurations_subscription.yaml | 36 ++++++------ .../azure-cli-advisor/setup.py | 4 +- 6 files changed, 62 insertions(+), 58 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/HISTORY.rst b/src/command_modules/azure-cli-advisor/HISTORY.rst index e668b5684f5..2408b853487 100644 --- a/src/command_modules/azure-cli-advisor/HISTORY.rst +++ b/src/command_modules/azure-cli-advisor/HISTORY.rst @@ -3,6 +3,10 @@ Release History =============== +1.0.0 +++++++ +* GA release. + 0.1.1 ++++++ * Update for CLI core changes. diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index 856bf8b19a7..eb358d34c3b 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py @@ -7,7 +7,7 @@ helps['advisor'] = """ type: group - short-summary: (PREVIEW) Manage Azure Advisor. + short-summary: Manage Azure Advisor. """ helps['advisor configuration'] = """ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_generate_recommendations.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_generate_recommendations.yaml index 85eccf2611d..d58f238cb67 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_generate_recommendations.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_generate_recommendations.yaml @@ -8,8 +8,8 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations?api-version=2017-04-19 @@ -18,14 +18,14 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Mon, 11 Dec 2017 22:58:43 GMT'] + date: ['Thu, 18 Jan 2018 00:40:59 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/0dba36fb-1faf-41f6-a711-37b7f57a29bd?api-version=2017-04-19'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/6180573c-fbd7-45b8-88ef-32c7a8789d43?api-version=2017-04-19'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1196'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -35,16 +35,16 @@ interactions: CommandName: [advisor recommendation generate] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/0dba36fb-1faf-41f6-a711-37b7f57a29bd?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/6180573c-fbd7-45b8-88ef-32c7a8789d43?api-version=2017-04-19 response: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:43 GMT'] + date: ['Thu, 18 Jan 2018 00:40:59 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_resource_group.yaml index a58e2291dd7..2cbc895f5eb 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_resource_group.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_resource_group.yaml @@ -8,9 +8,9 @@ interactions: Connection: [keep-alive] Content-Length: ['50'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 @@ -20,7 +20,7 @@ interactions: cache-control: [no-cache] content-length: ['328'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:45 GMT'] + date: ['Thu, 18 Jan 2018 00:41:01 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -34,18 +34,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:46 GMT'] + date: ['Thu, 18 Jan 2018 00:41:02 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -64,8 +64,8 @@ interactions: Connection: [keep-alive] Content-Length: ['33'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -73,7 +73,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:47 GMT'] + date: ['Thu, 18 Jan 2018 00:41:03 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -89,18 +89,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":true}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":true}}]}'} headers: cache-control: [no-cache] content-length: ['513'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:47 GMT'] + date: ['Thu, 18 Jan 2018 00:41:04 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -119,8 +119,8 @@ interactions: Connection: [keep-alive] Content-Length: ['34'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -128,7 +128,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:48 GMT'] + date: ['Thu, 18 Jan 2018 00:41:05 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -144,18 +144,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:49 GMT'] + date: ['Thu, 18 Jan 2018 00:41:07 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -174,9 +174,9 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.26] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 @@ -185,11 +185,11 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Mon, 11 Dec 2017 22:58:50 GMT'] + date: ['Thu, 18 Jan 2018 00:41:08 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkRRUlczT1FSM0RYVVRUQU9JWDQ3R0pNU1k3V3wxOEMxRjE5RjRFRDcyQTdDLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkVQQzVXNVlaUUU3U1hPUDI1N05KVFNFV1FKS3xDNzBFNzZERDJBNjBEMkZFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_subscription.yaml index 61f086806eb..7e4258718b0 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_subscription.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_subscription.yaml @@ -7,18 +7,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['1804'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:51 GMT'] + date: ['Thu, 18 Jan 2018 00:41:09 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -37,8 +37,8 @@ interactions: Connection: [keep-alive] Content-Length: ['43'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -46,7 +46,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:52 GMT'] + date: ['Thu, 18 Jan 2018 00:41:10 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -62,18 +62,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['1805'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:52 GMT'] + date: ['Thu, 18 Jan 2018 00:41:11 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -92,8 +92,8 @@ interactions: Connection: [keep-alive] Content-Length: ['42'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -101,7 +101,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:53 GMT'] + date: ['Thu, 18 Jan 2018 00:41:12 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -117,18 +117,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['1804'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:53 GMT'] + date: ['Thu, 18 Jan 2018 00:41:13 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] diff --git a/src/command_modules/azure-cli-advisor/setup.py b/src/command_modules/azure-cli-advisor/setup.py index bded066802a..2b305398b20 100644 --- a/src/command_modules/azure-cli-advisor/setup.py +++ b/src/command_modules/azure-cli-advisor/setup.py @@ -14,7 +14,7 @@ logger.warn("Wheel is not available, disabling bdist_wheel hook") cmdclass = {} -VERSION = "0.1.1" +VERSION = "1.0.0" # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers @@ -33,7 +33,7 @@ DEPENDENCIES = [ 'azure-cli-core', - 'azure-mgmt-advisor==0.1.0' + 'azure-mgmt-advisor==1.0.0' ] with open('README.rst', 'r', encoding='utf-8') as f: From 77a0c2ebc5f19b82762666a97b46109d7d925635 Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Tue, 23 Jan 2018 14:41:45 -0800 Subject: [PATCH 02/22] Addressing PR feedback: - Removed 'recommendation generate' command and added a '--refresh' option to 'recommendation list' instead. - Renamed 'configuration get' to 'configuration list'. - Renamed 'configuration set' to 'configuration update'. - Test recording updates. --- .../cli/command_modules/advisor/_help.py | 13 ++--- .../cli/command_modules/advisor/_params.py | 12 +++- .../command_modules/advisor/_validators.py | 5 ++ .../cli/command_modules/advisor/commands.py | 6 +- .../cli/command_modules/advisor/custom.py | 38 +++++++------ .../latest/test_generate_recommendations.yaml | 55 ------------------- ...update_configurations_resource_group.yaml} | 34 ++++++------ ...t_update_configurations_subscription.yaml} | 32 +++++------ .../advisor/tests/test_advisor_commands.py | 30 +++++----- 9 files changed, 86 insertions(+), 139 deletions(-) delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_generate_recommendations.yaml rename src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/{test_get_set_configurations_resource_group.yaml => test_list_update_configurations_resource_group.yaml} (86%) rename src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/{test_get_set_configurations_subscription.yaml => test_list_update_configurations_subscription.yaml} (53%) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index eb358d34c3b..869efb040b1 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py @@ -20,19 +20,14 @@ short-summary: Review Azure Advisor recommendations. """ -helps['advisor configuration get'] = """ +helps['advisor configuration list'] = """ type: command - short-summary: Get Azure Advisor configuration. + short-summary: List Azure Advisor configuration. """ -helps['advisor configuration set'] = """ +helps['advisor configuration update'] = """ type: command - short-summary: Set Azure Advisor configuration. -""" - -helps['advisor recommendation generate'] = """ - type: command - short-summary: Generate Azure Advisor recommendations. + short-summary: Update Azure Advisor configuration. """ helps['advisor recommendation list'] = """ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py index 0319725836d..b0a2a892914 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py @@ -7,7 +7,10 @@ from azure.cli.core.commands.parameters import get_enum_type -from ._validators import validate_include_or_exclude, validate_ids_or_resource_group +from ._validators import \ + (validate_include_or_exclude, + validate_ids_or_resource_group, + validate_threshold_or_resource_group) def load_arguments(self, _): @@ -19,6 +22,8 @@ def load_arguments(self, _): c.argument('ids', ids_arg_type, validator=validate_ids_or_resource_group) c.argument('category', options_list=['--category', '-c'], help='Name of recommendation category.', arg_type=get_enum_type(['Cost', 'HighAvailability', 'Performance', 'Security'])) + c.argument('refresh', options_list=['--refresh', '-e'], action='store_true', + help='Generate new recommendations.') with self.argument_context('advisor recommendation disable') as c: c.argument('ids', ids_arg_type) @@ -28,9 +33,10 @@ def load_arguments(self, _): with self.argument_context('advisor recommendation enable') as c: c.argument('ids', ids_arg_type) - with self.argument_context('advisor configuration set') as c: + with self.argument_context('advisor configuration update') as c: c.argument('low_cpu_threshold', options_list=['--low-cpu-threshold', '-l'], - help='Value for low CPU threshold.', arg_type=get_enum_type(['5', '10', '15', '20'])) + help='Value for low CPU threshold.', arg_type=get_enum_type(['5', '10', '15', '20']), + validator=validate_threshold_or_resource_group) c.argument('exclude', options_list=['--exclude', '-e'], action='store_true', help='Exclude from recommendation generation.') c.argument('include', options_list=['--include', '-i'], action='store_true', diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py index e2c697e076c..af7cc079cac 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py @@ -14,3 +14,8 @@ def validate_include_or_exclude(namespace): def validate_ids_or_resource_group(namespace): if namespace.ids and namespace.resource_group_name: raise CLIError('usage error: --ids | --resource-group') + + +def validate_threshold_or_resource_group(namespace): + if namespace.low_cpu_threshold and namespace.resource_group_name: + raise CLIError('usage error: --low-cpu-threshold | --resource-group') diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index 9ec5514805c..d414c3fcb52 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -12,8 +12,6 @@ def load_command_table(self, _): with self.command_group('advisor recommendation') as g: - g.custom_command('generate', 'cli_advisor_generate_recommendations', - client_factory=recommendations_mgmt_client_factory) g.custom_command('list', 'cli_advisor_list_recommendations', client_factory=recommendations_mgmt_client_factory) g.custom_command('disable', 'cli_advisor_disable_recommendations', @@ -22,5 +20,5 @@ def load_command_table(self, _): client_factory=advisor_mgmt_client_factory) with self.command_group('advisor configuration', client_factory=configurations_mgmt_client_factory) as g: - g.custom_command('get', 'cli_advisor_get_configurations') - g.custom_command('set', 'cli_advisor_set_configurations') + g.custom_command('list', 'cli_advisor_list_configurations') + g.custom_command('update', 'cli_advisor_update_configurations') diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index db17f05b583..218b3a5245f 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -10,21 +10,9 @@ from azure.mgmt.advisor.models import ConfigData, ConfigDataProperties -def cli_advisor_generate_recommendations(client): - response = client.generate(raw=True) - location = response.headers['Location'] - operation_id = parse_operation_id(location) - - try: - client.get_generate_status(operation_id=operation_id) - except CloudError as ex: - # Advisor API returns 204 which is not aligned with ARM guidelines - # so the SDK will throw an exception that we will have to ignore - if ex.status_code != 204: - raise ex - - -def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, category=None): +def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, category=None, refresh=None): + if refresh: + generate_recommendations(client) scope = build_filter_string(ids, resource_group_name, category) return client.list(scope) @@ -75,14 +63,14 @@ def cli_advisor_enable_recommendations(client, ids): return enabledRecs -def cli_advisor_get_configurations(client, resource_group_name=None): +def cli_advisor_list_configurations(client, resource_group_name=None): if resource_group_name: return client.list_by_resource_group(resource_group_name) return client.list_by_subscription() -def cli_advisor_set_configurations(client, resource_group_name=None, - low_cpu_threshold=None, exclude=None, include=None): +def cli_advisor_update_configurations(client, resource_group_name=None, + low_cpu_threshold=None, exclude=None, include=None): cfg = ConfigData() cfg.properties = ConfigDataProperties() @@ -133,3 +121,17 @@ def parse_recommendation_uri(recommendationUri): resourceUri = recommendationUri[:recommendationUri.find("/providers/Microsoft.Advisor/recommendations")] recommendationId = recommendationUri[recommendationUri.find("/recommendations/") + len('/recommendations/'):] return {'resourceUri': resourceUri, 'recommendationId': recommendationId} + + +def generate_recommendations(client): + response = client.generate(raw=True) + location = response.headers['Location'] + operation_id = parse_operation_id(location) + + try: + client.get_generate_status(operation_id=operation_id) + except CloudError as ex: + # Advisor API returns 204 which is not aligned with ARM guidelines + # so the SDK will throw an exception that we will have to ignore + if ex.status_code != 204: + raise ex diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_generate_recommendations.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_generate_recommendations.yaml deleted file mode 100644 index d58f238cb67..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_generate_recommendations.yaml +++ /dev/null @@ -1,55 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation generate] - Connection: [keep-alive] - Content-Length: ['0'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: POST - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - date: ['Thu, 18 Jan 2018 00:40:59 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/6180573c-fbd7-45b8-88ef-32c7a8789d43?api-version=2017-04-19'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation generate] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/6180573c-fbd7-45b8-88ef-32c7a8789d43?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:40:59 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['359'] - status: {code: 204, message: No Content} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml similarity index 86% rename from src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_resource_group.yaml rename to src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml index 2cbc895f5eb..d5f26ca2567 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_resource_group.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml @@ -20,7 +20,7 @@ interactions: cache-control: [no-cache] content-length: ['328'] content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:01 GMT'] + date: ['Tue, 23 Jan 2018 22:37:47 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -31,7 +31,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration list] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 @@ -40,12 +40,12 @@ interactions: method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:02 GMT'] + date: ['Tue, 23 Jan 2018 22:37:48 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -60,7 +60,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] + CommandName: [advisor configuration update] Connection: [keep-alive] Content-Length: ['33'] Content-Type: [application/json; charset=utf-8] @@ -73,7 +73,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:41:03 GMT'] + date: ['Tue, 23 Jan 2018 22:37:49 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -86,7 +86,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration list] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 @@ -95,12 +95,12 @@ interactions: method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":true}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} headers: cache-control: [no-cache] content-length: ['513'] content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:04 GMT'] + date: ['Tue, 23 Jan 2018 22:37:51 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -115,7 +115,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] + CommandName: [advisor configuration update] Connection: [keep-alive] Content-Length: ['34'] Content-Type: [application/json; charset=utf-8] @@ -128,7 +128,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:41:05 GMT'] + date: ['Tue, 23 Jan 2018 22:37:51 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -141,7 +141,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration list] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 @@ -150,12 +150,12 @@ interactions: method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:07 GMT'] + date: ['Tue, 23 Jan 2018 22:37:53 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -185,11 +185,11 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 18 Jan 2018 00:41:08 GMT'] + date: ['Tue, 23 Jan 2018 22:37:53 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkVQQzVXNVlaUUU3U1hPUDI1N05KVFNFV1FKS3xDNzBFNzZERDJBNjBEMkZFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUk9NVFUyVkJXUDZZRkFLQ0tCVFJGVUZJNkJZQnxDRUUxOUM4OTVDQ0Y2MENDLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml similarity index 53% rename from src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_subscription.yaml rename to src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml index 7e4258718b0..8cbaf867d4e 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_get_set_configurations_subscription.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml @@ -4,7 +4,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration list] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 @@ -13,12 +13,12 @@ interactions: method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['1804'] + content-length: ['1756'] content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:09 GMT'] + date: ['Tue, 23 Jan 2018 22:37:54 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -33,7 +33,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] + CommandName: [advisor configuration update] Connection: [keep-alive] Content-Length: ['43'] Content-Type: [application/json; charset=utf-8] @@ -46,7 +46,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:41:10 GMT'] + date: ['Tue, 23 Jan 2018 22:37:56 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -59,7 +59,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration list] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 @@ -68,12 +68,12 @@ interactions: method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['1805'] + content-length: ['1757'] content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:11 GMT'] + date: ['Tue, 23 Jan 2018 22:37:57 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -88,7 +88,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] + CommandName: [advisor configuration update] Connection: [keep-alive] Content-Length: ['42'] Content-Type: [application/json; charset=utf-8] @@ -101,7 +101,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:41:12 GMT'] + date: ['Tue, 23 Jan 2018 22:37:58 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -114,7 +114,7 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration list] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 @@ -123,12 +123,12 @@ interactions: method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['1804'] + content-length: ['1756'] content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:13 GMT'] + date: ['Tue, 23 Jan 2018 22:37:59 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/test_advisor_commands.py index 42f6a97d414..b95e66c8853 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/test_advisor_commands.py @@ -44,8 +44,7 @@ def test_parse_recommendation_uri(self): class AzureAdvisorLiveScenarioTest(LiveScenarioTest): def test_list_disable_enable_recommendations(self): - self.cmd('advisor recommendation generate') - output = self.cmd('advisor recommendation list').get_output_in_json() + output = self.cmd('advisor recommendation list --refresh').get_output_in_json() self.assertGreater(len(output), 1) output = self.cmd('advisor recommendation list --category cost').get_output_in_json() self.assertGreater(len(output), 0) @@ -65,33 +64,30 @@ def test_list_disable_enable_recommendations(self): class AzureAdvisorScenarioTest(ScenarioTest): - def test_generate_recommendations(self): - self.cmd('advisor recommendation generate') - - def test_get_set_configurations_subscription(self): - output = self.cmd('advisor configuration get').get_output_in_json() + def test_list_update_configurations_subscription(self): + output = self.cmd('advisor configuration list').get_output_in_json() self.assertGreater(len(output), 1) - self.cmd('advisor configuration set --low-cpu-threshold 20') - output = self.cmd('advisor configuration get').get_output_in_json() + self.cmd('advisor configuration update --low-cpu-threshold 20') + output = self.cmd('advisor configuration list').get_output_in_json() for entry in output['value']: if entry['properties']['lowCpuThreshold']: self.assertEqual(entry['properties']['lowCpuThreshold'], '20') - self.cmd('advisor configuration set --low-cpu-threshold 5') - output = self.cmd('advisor configuration get').get_output_in_json() + self.cmd('advisor configuration update --low-cpu-threshold 5') + output = self.cmd('advisor configuration list').get_output_in_json() for entry in output['value']: if entry['properties']['lowCpuThreshold']: self.assertEqual(entry['properties']['lowCpuThreshold'], '5') @ResourceGroupPreparer(name_prefix='cli_test_advisor') - def test_get_set_configurations_resource_group(self, resource_group): - output = self.cmd('advisor configuration get --resource-group {rg}').get_output_in_json() + def test_list_update_configurations_resource_group(self, resource_group): + output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() self.assertGreater(len(output), 0) - self.cmd('advisor configuration set --exclude --resource-group {rg}') - output = self.cmd('advisor configuration get --resource-group {rg}').get_output_in_json() + self.cmd('advisor configuration update --exclude --resource-group {rg}') + output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() self.assertGreater(len(output), 0) self.assertTrue(output['value'][0]['properties']['exclude']) - self.cmd('advisor configuration set --include --resource-group {rg}') - output = self.cmd('advisor configuration get --resource-group {rg}').get_output_in_json() + self.cmd('advisor configuration update --include --resource-group {rg}') + output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() self.assertGreater(len(output), 0) self.assertTrue(not output['value'][0]['properties']['exclude']) From c6e7d08aec9491410c78c406477e7dad5eeda68d Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Tue, 23 Jan 2018 16:02:06 -0800 Subject: [PATCH 03/22] Update history with details of the changes. --- src/command_modules/azure-cli-advisor/HISTORY.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/command_modules/azure-cli-advisor/HISTORY.rst b/src/command_modules/azure-cli-advisor/HISTORY.rst index 2408b853487..ee8b884c84f 100644 --- a/src/command_modules/azure-cli-advisor/HISTORY.rst +++ b/src/command_modules/azure-cli-advisor/HISTORY.rst @@ -3,9 +3,13 @@ Release History =============== -1.0.0 +2.0.0 ++++++ * GA release. +* BC: `advisor configuration get` has been renamed to `advisor configuration list`. +* BC: `advisor configuration set` has been renamed to `advisor configuration update`. +* BC: `advisor recommendation generate` has been removed. +* `advisor recommendation list` has a new --refresh parameter. 0.1.1 ++++++ From ca47a9ede27de5a73d8f138a52e746205bedfb2e Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Fri, 9 Feb 2018 13:56:03 -0800 Subject: [PATCH 04/22] Adding generic update and show command. --- .../advisor/_client_factory.py | 14 +- .../cli/command_modules/advisor/_params.py | 14 +- .../cli/command_modules/advisor/commands.py | 14 +- .../cli/command_modules/advisor/custom.py | 155 ++++++++++++------ 4 files changed, 132 insertions(+), 65 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py index cb70b508dac..20922d39d1f 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py @@ -10,17 +10,17 @@ def cf_advisor(cli_ctx, **_): return get_mgmt_service_client(cli_ctx, AdvisorManagementClient) -def advisor_mgmt_client_factory(cli_ctx, kwargs): +def advisor_mgmt_client_factory(cli_ctx, **kwargs): return cf_advisor(cli_ctx, **kwargs) -def recommendations_mgmt_client_factory(cli_ctx, kwargs): - return cf_advisor(cli_ctx, **kwargs).recommendations +def recommendations_mgmt_client_factory(cli_ctx, _): + return cf_advisor(cli_ctx).recommendations -def suppressions_mgmt_client_factory(cli_ctx, kwargs): - return cf_advisor(cli_ctx, **kwargs).suppressions +def suppressions_mgmt_client_factory(cli_ctx, _): + return cf_advisor(cli_ctx).suppressions -def configurations_mgmt_client_factory(cli_ctx, kwargs): - return cf_advisor(cli_ctx, **kwargs).configurations +def configurations_mgmt_client_factory(cli_ctx, _): + return cf_advisor(cli_ctx).configurations diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py index b0a2a892914..2fcd955194f 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py @@ -5,7 +5,9 @@ from knack.arguments import CLIArgumentType -from azure.cli.core.commands.parameters import get_enum_type +from azure.cli.core.commands.parameters import \ + (get_enum_type, + get_resource_name_completion_list) from ._validators import \ (validate_include_or_exclude, @@ -18,20 +20,24 @@ def load_arguments(self, _): help='One or more resource IDs (space delimited). If provided, no other ' '"Resource Id" arguments should be specified.') + name_arg_type = CLIArgumentType(options_list=['--name', '-n'], id_part='name', + help='The name of the recommendation as output by the list command.', + completer=get_resource_name_completion_list('Microsoft.Advisor/recommendations')) + with self.argument_context('advisor recommendation list') as c: c.argument('ids', ids_arg_type, validator=validate_ids_or_resource_group) c.argument('category', options_list=['--category', '-c'], help='Name of recommendation category.', arg_type=get_enum_type(['Cost', 'HighAvailability', 'Performance', 'Security'])) - c.argument('refresh', options_list=['--refresh', '-e'], action='store_true', + c.argument('refresh', options_list=['--refresh', '-r'], action='store_true', help='Generate new recommendations.') with self.argument_context('advisor recommendation disable') as c: - c.argument('ids', ids_arg_type) + c.argument('recommendation_name', name_arg_type) c.argument('days', options_list=['--days', '-d'], type=int, help='Number of days to disable. If not specified, the recommendation is disabled forever.') with self.argument_context('advisor recommendation enable') as c: - c.argument('ids', ids_arg_type) + c.argument('recommendation_name', name_arg_type) with self.argument_context('advisor configuration update') as c: c.argument('low_cpu_threshold', options_list=['--low-cpu-threshold', '-l'], diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index d414c3fcb52..b92fe757b80 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -11,14 +11,24 @@ def load_command_table(self, _): + from azure.cli.core.commands import CliCommandType + advisor_custom = CliCommandType(operations_tmpl='azure.cli.command_modules.advisor.custom#{}') + with self.command_group('advisor recommendation') as g: g.custom_command('list', 'cli_advisor_list_recommendations', client_factory=recommendations_mgmt_client_factory) g.custom_command('disable', 'cli_advisor_disable_recommendations', - client_factory=suppressions_mgmt_client_factory) + client_factory=advisor_mgmt_client_factory) g.custom_command('enable', 'cli_advisor_enable_recommendations', client_factory=advisor_mgmt_client_factory) with self.command_group('advisor configuration', client_factory=configurations_mgmt_client_factory) as g: g.custom_command('list', 'cli_advisor_list_configurations') - g.custom_command('update', 'cli_advisor_update_configurations') + g.custom_command('show', 'cli_advisor_show_configuration') + g.generic_update_command('update', + getter_name='cli_advisor_show_configuration', + getter_type=advisor_custom, + setter_name='_cli_advisor_set_configuration', + setter_type=advisor_custom, + custom_func_name='cli_advisor_update_configurations', + custom_func_type=advisor_custom) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index 218b3a5245f..a606b512976 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -10,82 +10,133 @@ from azure.mgmt.advisor.models import ConfigData, ConfigDataProperties -def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, category=None, refresh=None): +def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, + category=None, refresh=None): if refresh: generate_recommendations(client) scope = build_filter_string(ids, resource_group_name, category) return client.list(scope) -def cli_advisor_disable_recommendations(client, ids, days=None): - suppressions = [] - suppressionName = str(uuid.uuid4()) - for id_arg in ids: - result = parse_recommendation_uri(id_arg) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] - ttl = '{}:00:00:00'.format(days) if days else '' - client.create( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName, - ttl=ttl - ) - suppressions.append(client.get( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName - )) +def cli_advisor_disable_recommendations(client, resource_group_name=None, + recommendation_name=None, days=None): + if recommendation_name: + recs = cli_advisor_list_recommendations( + client=client.recommendations, + resource_group_name=resource_group_name) + rec = next(r for r in recs if r.name == recommendation_name) + suppressions.append( + create_suppression( + client.suppressions, + rec.id, + days)) + +# if ids: +# for id_arg in ids: +# suppressions.append(create_suppression(client.suppressions, id_arg, days)) + return suppressions -def cli_advisor_enable_recommendations(client, ids): +def cli_advisor_enable_recommendations(client, ids=None, resource_group_name=None, recommendation_name=None): enabledRecs = [] allSups = list(client.suppressions.list()) - for id_arg in ids: - result = parse_recommendation_uri(id_arg) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] + + if recommendation_name: recs = cli_advisor_list_recommendations( - client=client.recommendations, - ids=[resourceUri] - ) - rec = next(x for x in recs if x.name == recommendationId) - matches = [x for x in allSups if x.suppression_id in rec.suppression_ids] - for match in matches: - client.suppressions.delete( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=match.name + client=client.recommendations, + resource_group_name=resource_group_name) + enabledRecs.append( + remove_suppressions( + client.suppressions, + recommendations=recs, + recommendation_name=recommendation_name, + suppressions=allSups)) + + if ids: + for id_arg in ids: + result = parse_recommendation_uri(id_arg) + resourceUri = result['resourceUri'] + recommendationId = result['recommendationId'] + recs = cli_advisor_list_recommendations( + client=client.recommendations, + ids=[resourceUri] ) - rec.suppression_ids = None - enabledRecs.append(rec) - return enabledRecs + enabledRecs.append( + remove_suppressions( + client.suppressions, + recommendations=recs, + recommendation_name=recommendationId, + suppressions=allSups)) + return enabledRecs -def cli_advisor_list_configurations(client, resource_group_name=None): - if resource_group_name: - return client.list_by_resource_group(resource_group_name) - return client.list_by_subscription() +def cli_advisor_list_configurations(client): + return client.list_by_subscription().value -def cli_advisor_update_configurations(client, resource_group_name=None, - low_cpu_threshold=None, exclude=None, include=None): - cfg = ConfigData() - cfg.properties = ConfigDataProperties() +def cli_advisor_show_configuration(client, resource_group_name=None): + # check for null and zero value + if resource_group_name: + return client.list_by_resource_group(resource_group_name).value[0] + return client.list_by_subscription().value[0] - cfg.properties.low_cpu_threshold = low_cpu_threshold - cfg.properties.exclude = exclude - if include: - cfg.properties.exclude = False +def _cli_advisor_set_configuration(client, resource_group_name=None, parameters=None): if resource_group_name: return client.create_in_resource_group( - config_contract=cfg, + config_contract=parameters, resource_group=resource_group_name) - return client.create_in_subscription(cfg) + return client.create_in_subscription(parameters) + + +def cli_advisor_update_configurations(instance, resource_group_name=None, + low_cpu_threshold=None, exclude=None, include=None): + + instance.properties.low_cpu_threshold = low_cpu_threshold + instance.properties.exclude = exclude + if include: + instance.properties.exclude = False + + return instance + + +def create_suppression(client, recommendation_uri, days=None): + suppressionName = str(uuid.uuid4()) + ttl = '{}:00:00:00'.format(days) if days else '' + + result = parse_recommendation_uri(recommendation_uri) + resourceUri = result['resourceUri'] + recommendationId = result['recommendationId'] + + client.create( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName, + ttl=ttl + ) + + return client.get( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName + ) + + +def remove_suppressions(client, recommendations, recommendation_name, suppressions): + rec = next(x for x in recommendations if x.name == recommendation_name) + + matches = [x for x in suppressions if x.suppression_id in rec.suppression_ids] + for match in matches: + client.delete( + resource_uri=parse_recommendation_uri(rec.id)['resourceUri'], + recommendation_id=recommendation_name, + name=match.name + ) + rec.suppression_ids = None + return rec def build_filter_string(ids=None, resource_group_name=None, category=None): From 6c8c2efaf453e8c2426961149b6f439cf869febe Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Tue, 13 Feb 2018 09:46:02 -0800 Subject: [PATCH 05/22] Addressing review feedback. --- .../azure-cli-advisor/HISTORY.rst | 4 +- .../cli/command_modules/advisor/_help.py | 7 +- .../cli/command_modules/advisor/commands.py | 13 +- .../cli/command_modules/advisor/custom.py | 180 +++++++----------- .../advisor/tests/test_advisor_commands.py | 22 +-- 5 files changed, 96 insertions(+), 130 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/HISTORY.rst b/src/command_modules/azure-cli-advisor/HISTORY.rst index ee8b884c84f..0da76642809 100644 --- a/src/command_modules/azure-cli-advisor/HISTORY.rst +++ b/src/command_modules/azure-cli-advisor/HISTORY.rst @@ -3,13 +3,13 @@ Release History =============== -2.0.0 +0.5.0 ++++++ -* GA release. * BC: `advisor configuration get` has been renamed to `advisor configuration list`. * BC: `advisor configuration set` has been renamed to `advisor configuration update`. * BC: `advisor recommendation generate` has been removed. * `advisor recommendation list` has a new --refresh parameter. +* `advisor recommendation show` has been added. 0.1.1 ++++++ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index 869efb040b1..1447917f977 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py @@ -22,7 +22,12 @@ helps['advisor configuration list'] = """ type: command - short-summary: List Azure Advisor configuration. + short-summary: List Azure Advisor configuration for the entire subscription. +""" + +helps['advisor configuration show'] = """ + type: command + short-summary: Show Azure Advisor configuration for the given subscription or resource group. """ helps['advisor configuration update'] = """ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index b92fe757b80..0a03435dc28 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -6,7 +6,6 @@ from azure.cli.command_modules.advisor._client_factory import \ (advisor_mgmt_client_factory, recommendations_mgmt_client_factory, - suppressions_mgmt_client_factory, configurations_mgmt_client_factory) @@ -26,9 +25,9 @@ def load_command_table(self, _): g.custom_command('list', 'cli_advisor_list_configurations') g.custom_command('show', 'cli_advisor_show_configuration') g.generic_update_command('update', - getter_name='cli_advisor_show_configuration', - getter_type=advisor_custom, - setter_name='_cli_advisor_set_configuration', - setter_type=advisor_custom, - custom_func_name='cli_advisor_update_configurations', - custom_func_type=advisor_custom) + getter_name='cli_advisor_show_configuration', + getter_type=advisor_custom, + setter_name='_cli_advisor_set_configuration', + setter_type=advisor_custom, + custom_func_name='cli_advisor_update_configurations', + custom_func_type=advisor_custom) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index a606b512976..9cb068b5993 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -4,97 +4,84 @@ # -------------------------------------------------------------------------------------------- import uuid - -from msrestazure.azure_exceptions import CloudError - -from azure.mgmt.advisor.models import ConfigData, ConfigDataProperties +from knack.util import CLIError def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, category=None, refresh=None): if refresh: - generate_recommendations(client) - scope = build_filter_string(ids, resource_group_name, category) + _cli_advisor_generate_recommendations(client) + scope = _cli_advisor_build_filter_string(ids, resource_group_name, category) return client.list(scope) -def cli_advisor_disable_recommendations(client, resource_group_name=None, - recommendation_name=None, days=None): - if recommendation_name: - recs = cli_advisor_list_recommendations( - client=client.recommendations, - resource_group_name=resource_group_name) - rec = next(r for r in recs if r.name == recommendation_name) - suppressions.append( - create_suppression( - client.suppressions, - rec.id, - days)) +def cli_advisor_disable_recommendations(client, resource_group_name, + recommendation_name, days=None): + recs = cli_advisor_list_recommendations( + client=client.recommendations, + resource_group_name=resource_group_name) + rec = next((r for r in recs if r.name == recommendation_name), None) -# if ids: -# for id_arg in ids: -# suppressions.append(create_suppression(client.suppressions, id_arg, days)) + if rec: + suppressionName = str(uuid.uuid4()) + ttl = '{}:00:00:00'.format(days) if days else '' - return suppressions + result = _cli_advisor_parse_recommendation_uri(rec.id) + resourceUri = result['resourceUri'] + recommendationId = result['recommendationId'] + client.suppressions.create( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName, + ttl=ttl + ) -def cli_advisor_enable_recommendations(client, ids=None, resource_group_name=None, recommendation_name=None): - enabledRecs = [] - allSups = list(client.suppressions.list()) + # return recommendation object for consistency with enable + return client.suppressions.get( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName + ) - if recommendation_name: - recs = cli_advisor_list_recommendations( - client=client.recommendations, - resource_group_name=resource_group_name) - enabledRecs.append( - remove_suppressions( - client.suppressions, - recommendations=recs, - recommendation_name=recommendation_name, - suppressions=allSups)) + raise CLIError( + "Recommendation with name '{recommendation_name}' in resource group '{resource_group_name}' not found") - if ids: - for id_arg in ids: - result = parse_recommendation_uri(id_arg) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] - recs = cli_advisor_list_recommendations( - client=client.recommendations, - ids=[resourceUri] + +def cli_advisor_enable_recommendations(client, resource_group_name, recommendation_name): + allSups = list(client.suppressions.list()) + + recs = cli_advisor_list_recommendations( + client=client.recommendations, + resource_group_name=resource_group_name) + rec = next((r for r in recs if r.name == recommendation_name), None) + if rec: + matches = [x for x in allSups if x.suppression_id in rec.suppression_ids] + for match in matches: + client.suppressions.delete( + resource_uri=_cli_advisor_parse_recommendation_uri(rec.id)['resourceUri'], + recommendation_id=recommendation_name, + name=match.name ) - enabledRecs.append( - remove_suppressions( - client.suppressions, - recommendations=recs, - recommendation_name=recommendationId, - suppressions=allSups)) + rec.suppression_ids = None + return rec - return enabledRecs + raise CLIError( + "Recommendation with name '{recommendation_name}' in resource group '{resource_group_name}' not found") def cli_advisor_list_configurations(client): - return client.list_by_subscription().value + return client.list_by_subscription() def cli_advisor_show_configuration(client, resource_group_name=None): - # check for null and zero value if resource_group_name: - return client.list_by_resource_group(resource_group_name).value[0] - return client.list_by_subscription().value[0] - - -def _cli_advisor_set_configuration(client, resource_group_name=None, parameters=None): - if resource_group_name: - return client.create_in_resource_group( - config_contract=parameters, - resource_group=resource_group_name) - - return client.create_in_subscription(parameters) - + return client.list_by_resource_group(resource_group_name) + return client.list_by_subscription()[0] -def cli_advisor_update_configurations(instance, resource_group_name=None, - low_cpu_threshold=None, exclude=None, include=None): +def cli_advisor_update_configurations(instance, low_cpu_threshold=None, + exclude=None, include=None): instance.properties.low_cpu_threshold = low_cpu_threshold instance.properties.exclude = exclude if include: @@ -103,55 +90,19 @@ def cli_advisor_update_configurations(instance, resource_group_name=None, return instance -def create_suppression(client, recommendation_uri, days=None): - suppressionName = str(uuid.uuid4()) - ttl = '{}:00:00:00'.format(days) if days else '' - - result = parse_recommendation_uri(recommendation_uri) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] - - client.create( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName, - ttl=ttl - ) - - return client.get( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName - ) - - -def remove_suppressions(client, recommendations, recommendation_name, suppressions): - rec = next(x for x in recommendations if x.name == recommendation_name) - - matches = [x for x in suppressions if x.suppression_id in rec.suppression_ids] - for match in matches: - client.delete( - resource_uri=parse_recommendation_uri(rec.id)['resourceUri'], - recommendation_id=recommendation_name, - name=match.name - ) - rec.suppression_ids = None - return rec - - -def build_filter_string(ids=None, resource_group_name=None, category=None): +def _cli_advisor_build_filter_string(ids=None, resource_group_name=None, category=None): idFilter = None if ids: idFilter = ' or '.join(["ResourceId eq '{}'".format(id_arg) for id_arg in ids]) elif resource_group_name: - idFilter = "ResourceGroup eq '{}'".format(resource_group_name) + idFilter = "ResourceGroup eq '{resource_group_name}'" categoryFilter = "Category eq '{}'".format(category) if category else None if idFilter: if categoryFilter: - return '({}) and {}'.format(idFilter, categoryFilter) + return '({idFilter}) and {categoryFilter}' return idFilter elif categoryFilter: return categoryFilter @@ -159,7 +110,7 @@ def build_filter_string(ids=None, resource_group_name=None, category=None): return None -def parse_operation_id(location): +def _cli_advisor_parse_operation_id(location): # extract the operation ID from the Location header # it is a GUID (i.e. a string of length 36) immediately preceding the api-version query parameter end = location.find('?api-version') @@ -168,16 +119,18 @@ def parse_operation_id(location): return operation_id -def parse_recommendation_uri(recommendationUri): +def _cli_advisor_parse_recommendation_uri(recommendationUri): resourceUri = recommendationUri[:recommendationUri.find("/providers/Microsoft.Advisor/recommendations")] recommendationId = recommendationUri[recommendationUri.find("/recommendations/") + len('/recommendations/'):] return {'resourceUri': resourceUri, 'recommendationId': recommendationId} -def generate_recommendations(client): +def _cli_advisor_generate_recommendations(client): + from msrestazure.azure_exceptions import CloudError + response = client.generate(raw=True) location = response.headers['Location'] - operation_id = parse_operation_id(location) + operation_id = _cli_advisor_parse_operation_id(location) try: client.get_generate_status(operation_id=operation_id) @@ -186,3 +139,12 @@ def generate_recommendations(client): # so the SDK will throw an exception that we will have to ignore if ex.status_code != 204: raise ex + + +def _cli_advisor_set_configuration(client, resource_group_name=None, parameters=None): + if resource_group_name: + return client.create_in_resource_group( + config_contract=parameters, + resource_group=resource_group_name) + + return client.create_in_subscription(parameters) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/test_advisor_commands.py index b95e66c8853..b83555f2f06 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/test_advisor_commands.py @@ -7,7 +7,7 @@ from azure.cli.testsdk import LiveScenarioTest, ScenarioTest, ResourceGroupPreparer -from azure.cli.command_modules.advisor.custom import build_filter_string, parse_operation_id, parse_recommendation_uri +from azure.cli.command_modules.advisor.custom import _cli_advisor_build_filter_string, _cli_advisor_parse_operation_id, _cli_advisor_parse_recommendation_uri # pylint: disable=line-too-long @@ -19,21 +19,21 @@ def test_build_filter(self): resource_group_name = 'r' category = 'cost' - self.assertEqual(build_filter_string(), None) - self.assertEqual(build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") - self.assertEqual(build_filter_string(resource_group_name=resource_group_name), "ResourceGroup eq 'r'") - self.assertEqual(build_filter_string(category=category), "Category eq 'cost'") - self.assertEqual(build_filter_string(ids=ids, category=category), "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") - self.assertEqual(build_filter_string(resource_group_name=resource_group_name, category=category), "(ResourceGroup eq 'r') and Category eq 'cost'") + self.assertEqual(_cli_advisor_build_filter_string(), None) + self.assertEqual(_cli_advisor_build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") + self.assertEqual(_cli_advisor_build_filter_string(resource_group_name=resource_group_name), "ResourceGroup eq 'r'") + self.assertEqual(_cli_advisor_build_filter_string(category=category), "Category eq 'cost'") + self.assertEqual(_cli_advisor_build_filter_string(ids=ids, category=category), "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") + self.assertEqual(_cli_advisor_build_filter_string(resource_group_name=resource_group_name, category=category), "(ResourceGroup eq 'r') and Category eq 'cost'") - def test_parse_operation_id(self): + def test__cli_advisor_parse_operation_id(self): location = 'https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320?api-version=2017-04-19' - operation_id = parse_operation_id(location) + operation_id = _cli_advisor_parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') - def test_parse_recommendation_uri(self): + def test__cli_advisor_parse_recommendation_uri(self): recommendation_uri = '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test/providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425' - result = parse_recommendation_uri(recommendation_uri) + result = _cli_advisor_parse_recommendation_uri(recommendation_uri) self.assertEqual( result['resourceUri'], '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test' From d61ea431e454fa2c4fa2bcf17852a9e2e70807d8 Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Tue, 13 Feb 2018 11:28:07 -0800 Subject: [PATCH 06/22] Update SDK package version. --- src/command_modules/azure-cli-advisor/setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/setup.py b/src/command_modules/azure-cli-advisor/setup.py index 2b305398b20..62139f3ab8b 100644 --- a/src/command_modules/azure-cli-advisor/setup.py +++ b/src/command_modules/azure-cli-advisor/setup.py @@ -14,7 +14,7 @@ logger.warn("Wheel is not available, disabling bdist_wheel hook") cmdclass = {} -VERSION = "1.0.0" +VERSION = "0.5.0" # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers @@ -33,7 +33,7 @@ DEPENDENCIES = [ 'azure-cli-core', - 'azure-mgmt-advisor==1.0.0' + 'azure-mgmt-advisor==1.0.1' ] with open('README.rst', 'r', encoding='utf-8') as f: From 64369a5d14a1925dc8121d0e4dd462d7cb1d960e Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Thu, 15 Feb 2018 18:29:42 -0800 Subject: [PATCH 07/22] Addressing review feedback. --- .../advisor/_client_factory.py | 4 +- .../cli/command_modules/advisor/_help.py | 7 + .../cli/command_modules/advisor/_params.py | 2 +- .../cli/command_modules/advisor/commands.py | 4 +- .../cli/command_modules/advisor/custom.py | 84 +++--- ... => test_configurations_subscription.yaml} | 134 ++++++--- .../test_generate_recommendations.yaml | 55 ---- ...t_get_set_configurations_subscription.yaml | 141 --------- ...t_list_disable_enable_recommendations.yaml | 267 ------------------ .../tests/latest/test_advisor_commands.py | 175 ++++++++---- 10 files changed, 283 insertions(+), 590 deletions(-) rename src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/{test_get_set_configurations_resource_group.yaml => test_configurations_subscription.yaml} (52%) delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_list_disable_enable_recommendations.yaml diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py index 20922d39d1f..8481014d4e2 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py @@ -10,8 +10,8 @@ def cf_advisor(cli_ctx, **_): return get_mgmt_service_client(cli_ctx, AdvisorManagementClient) -def advisor_mgmt_client_factory(cli_ctx, **kwargs): - return cf_advisor(cli_ctx, **kwargs) +def advisor_mgmt_client_factory(cli_ctx, _): + return cf_advisor(cli_ctx) def recommendations_mgmt_client_factory(cli_ctx, _): diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index 1447917f977..d5e353136db 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py @@ -33,6 +33,13 @@ helps['advisor configuration update'] = """ type: command short-summary: Update Azure Advisor configuration. + examples: + - name: Update low CPU threshold for a given subscription to 20%. + text: > + az advisor configuration update -l 20 + - name: Exclude a given resource group from recommendation generation. + text: > + az advisor configuration update -g myRG -e """ helps['advisor recommendation list'] = """ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py index d5d0da9aa10..50a69e42a79 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py @@ -20,7 +20,7 @@ def load_arguments(self, _): help='One or more resource IDs (space-delimited). If provided, no other ' '"Resource Id" arguments should be specified.') - name_arg_type = CLIArgumentType(options_list=['--name', '-n'], id_part='name', + name_arg_type = CLIArgumentType(options_list=['--name', '-n'], id_part='child_name_1', help='The name of the recommendation as output by the list command.', completer=get_resource_name_completion_list('Microsoft.Advisor/recommendations')) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index 0a03435dc28..e7ad86e9080 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -22,12 +22,12 @@ def load_command_table(self, _): client_factory=advisor_mgmt_client_factory) with self.command_group('advisor configuration', client_factory=configurations_mgmt_client_factory) as g: - g.custom_command('list', 'cli_advisor_list_configurations') + g.custom_command('list', 'cli_advisor_list_configuration') g.custom_command('show', 'cli_advisor_show_configuration') g.generic_update_command('update', getter_name='cli_advisor_show_configuration', getter_type=advisor_custom, setter_name='_cli_advisor_set_configuration', setter_type=advisor_custom, - custom_func_name='cli_advisor_update_configurations', + custom_func_name='cli_advisor_update_configuration', custom_func_type=advisor_custom) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index 9cb068b5993..1b5bc75a102 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -22,30 +22,32 @@ def cli_advisor_disable_recommendations(client, resource_group_name, resource_group_name=resource_group_name) rec = next((r for r in recs if r.name == recommendation_name), None) - if rec: - suppressionName = str(uuid.uuid4()) - ttl = '{}:00:00:00'.format(days) if days else '' + if not rec: + raise CLIError( + "Recommendation with name {} in resource group {} not found".format( + recommendation_name, + resource_group_name)) + + suppressionName = str(uuid.uuid4()) + ttl = '{}:00:00:00'.format(days) if days else '' - result = _cli_advisor_parse_recommendation_uri(rec.id) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] + result = _cli_advisor_parse_recommendation_uri(rec.id) + resourceUri = result['resourceUri'] + recommendationId = result['recommendationId'] - client.suppressions.create( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName, - ttl=ttl - ) + sup = client.suppressions.create( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName, + ttl=ttl + ) - # return recommendation object for consistency with enable - return client.suppressions.get( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName - ) + if rec.suppression_ids: + rec.suppression_ids.append(sup.suppression_id) + else: + rec.suppression_ids = [sup.suppression_id] - raise CLIError( - "Recommendation with name '{recommendation_name}' in resource group '{resource_group_name}' not found") + return rec def cli_advisor_enable_recommendations(client, resource_group_name, recommendation_name): @@ -55,33 +57,44 @@ def cli_advisor_enable_recommendations(client, resource_group_name, recommendati client=client.recommendations, resource_group_name=resource_group_name) rec = next((r for r in recs if r.name == recommendation_name), None) + if rec: matches = [x for x in allSups if x.suppression_id in rec.suppression_ids] + else: + matches = [s for s in allSups if 'Microsoft.Advisor/recommendations/{}'.format(recommendation_name) in s.id] + + if matches: for match in matches: + result = _cli_advisor_parse_recommendation_uri(match.id) client.suppressions.delete( - resource_uri=_cli_advisor_parse_recommendation_uri(rec.id)['resourceUri'], - recommendation_id=recommendation_name, + resource_uri=result['resourceUri'], + recommendation_id=result['recommendationId'], name=match.name ) - rec.suppression_ids = None - return rec - raise CLIError( - "Recommendation with name '{recommendation_name}' in resource group '{resource_group_name}' not found") + rec = cli_advisor_list_recommendations( + client=client.recommendations, + ids=result['resourceUri']) + + return rec -def cli_advisor_list_configurations(client): +def cli_advisor_list_configuration(client): return client.list_by_subscription() def cli_advisor_show_configuration(client, resource_group_name=None): + output = None if resource_group_name: - return client.list_by_resource_group(resource_group_name) - return client.list_by_subscription()[0] + output = client.list_by_resource_group(resource_group_name) + else: + output = client.list_by_subscription() + # the list is guaranteed to have one element + return list(output)[0] -def cli_advisor_update_configurations(instance, low_cpu_threshold=None, - exclude=None, include=None): +def cli_advisor_update_configuration(instance, low_cpu_threshold=None, + exclude=None, include=None): instance.properties.low_cpu_threshold = low_cpu_threshold instance.properties.exclude = exclude if include: @@ -96,13 +109,13 @@ def _cli_advisor_build_filter_string(ids=None, resource_group_name=None, categor if ids: idFilter = ' or '.join(["ResourceId eq '{}'".format(id_arg) for id_arg in ids]) elif resource_group_name: - idFilter = "ResourceGroup eq '{resource_group_name}'" + idFilter = "ResourceGroup eq '{}'".format(resource_group_name) categoryFilter = "Category eq '{}'".format(category) if category else None if idFilter: if categoryFilter: - return '({idFilter}) and {categoryFilter}' + return '({}) and {}'.format(idFilter, categoryFilter) return idFilter elif categoryFilter: return categoryFilter @@ -121,7 +134,10 @@ def _cli_advisor_parse_operation_id(location): def _cli_advisor_parse_recommendation_uri(recommendationUri): resourceUri = recommendationUri[:recommendationUri.find("/providers/Microsoft.Advisor/recommendations")] - recommendationId = recommendationUri[recommendationUri.find("/recommendations/") + len('/recommendations/'):] + rStart = recommendationUri.find("/recommendations/") + len('/recommendations/') + # recommendation ID is a GUID (i.e. a string of length 36) + rEnd = rStart + 36 + recommendationId = recommendationUri[rStart:rEnd] return {'resourceUri': resourceUri, 'recommendationId': recommendationId} diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml similarity index 52% rename from src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml rename to src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml index a58e2291dd7..b72cef50772 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml @@ -8,9 +8,9 @@ interactions: Connection: [keep-alive] Content-Length: ['50'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.28] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 @@ -20,7 +20,7 @@ interactions: cache-control: [no-cache] content-length: ['328'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:45 GMT'] + date: ['Fri, 16 Feb 2018 02:26:01 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -31,21 +31,21 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration show] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:46 GMT'] + date: ['Fri, 16 Feb 2018 02:26:03 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -56,16 +56,47 @@ interactions: x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: - body: '{"properties": {"exclude": true}}' + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 16 Feb 2018 02:26:04 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "properties": {"exclude": true}}''' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] + CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Length: ['33'] + Content-Length: ['509'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -73,7 +104,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:47 GMT'] + date: ['Fri, 16 Feb 2018 02:26:05 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -86,21 +117,50 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + headers: + cache-control: [no-cache] + content-length: ['513'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 16 Feb 2018 02:26:06 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":true}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} headers: cache-control: [no-cache] content-length: ['513'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:47 GMT'] + date: ['Fri, 16 Feb 2018 02:26:08 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -111,16 +171,18 @@ interactions: x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: - body: '{"properties": {"exclude": false}}' + body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "properties": {"exclude": false}}''' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] + CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Length: ['34'] + Content-Length: ['510'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -128,7 +190,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:48 GMT'] + date: ['Fri, 16 Feb 2018 02:26:08 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -141,21 +203,21 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] + CommandName: [advisor configuration show] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:49 GMT'] + date: ['Fri, 16 Feb 2018 02:26:09 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -174,9 +236,9 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.28] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 @@ -185,9 +247,9 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Mon, 11 Dec 2017 22:58:50 GMT'] + date: ['Fri, 16 Feb 2018 02:26:10 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkRRUlczT1FSM0RYVVRUQU9JWDQ3R0pNU1k3V3wxOEMxRjE5RjRFRDcyQTdDLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUlUzUTVKNFlEVkNEQ0lENDc2Q1JDUEFUUUJYRHxEOTU4QjBFMTczMDJFQTIwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-ms-ratelimit-remaining-subscription-writes: ['1199'] diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml deleted file mode 100644 index 85eccf2611d..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml +++ /dev/null @@ -1,55 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation generate] - Connection: [keep-alive] - Content-Length: ['0'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] - accept-language: [en-US] - method: POST - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - date: ['Mon, 11 Dec 2017 22:58:43 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/0dba36fb-1faf-41f6-a711-37b7f57a29bd?api-version=2017-04-19'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1196'] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation generate] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/0dba36fb-1faf-41f6-a711-37b7f57a29bd?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:43 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['359'] - status: {code: 204, message: No Content} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml deleted file mode 100644 index 61f086806eb..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml +++ /dev/null @@ -1,141 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1804'] - content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:51 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"low_cpu_threshold": "20"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] - Connection: [keep-alive] - Content-Length: ['43'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:52 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1805'] - content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:52 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"low_cpu_threshold": "5"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] - Connection: [keep-alive] - Content-Length: ['42'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:53 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1804'] - content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:53 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_list_disable_enable_recommendations.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_list_disable_enable_recommendations.yaml deleted file mode 100644 index 030249464fc..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_list_disable_enable_recommendations.yaml +++ /dev/null @@ -1,267 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations/2e6ee8e4-9c0d-fb4d-253e-27c6ed1488ae","name":"2e6ee8e4-9c0d-fb4d-253e-27c6ed1488ae","properties":{"category":"Security","impact":"High","impactedField":"","impactedValue":"","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AZEXPERTSTGEUS/providers/Microsoft.Compute/virtualMachines/EUS-Test/providers/Microsoft.Advisor/recommendations/dba85867-7188-e8ff-3cc2-351336487e7f","name":"dba85867-7188-e8ff-3cc2-351336487e7f","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"EUS-Test","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations/e6a28e1d-9c18-c7fc-cc8d-f2f7e008b7d9","name":"e6a28e1d-9c18-c7fc-cc8d-f2f7e008b7d9","properties":{"category":"Security","impact":"High","impactedField":"","impactedValue":"","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations/01251607-ff25-6192-85bf-e004fe766491","name":"01251607-ff25-6192-85bf-e004fe766491","properties":{"category":"Security","impact":"High","impactedField":"","impactedValue":"","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AZEXPERTSTGWCUS/providers/Microsoft.Compute/virtualMachines/WCUS-Test/providers/Microsoft.Advisor/recommendations/25366bb0-17ae-70cd-4783-ecc5e08ac1ca","name":"25366bb0-17ae-70cd-4783-ecc5e08ac1ca","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"WCUS-Test","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations/b1abc525-e2aa-abdb-ac0c-c2282371e126","name":"b1abc525-e2aa-abdb-ac0c-c2282371e126","properties":{"category":"Security","impact":"High","impactedField":"","impactedValue":"","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AZEXPERTSTGWCUS/providers/Microsoft.Compute/virtualMachines/WCUS-Test/providers/Microsoft.Advisor/recommendations/a6a17e46-8078-f4ab-2527-8d03051e745e","name":"a6a17e46-8078-f4ab-2527-8d03051e745e","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"WCUS-Test","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3bc9d079-1911-e91c-d08d-d3ebb52b3e93","name":"3bc9d079-1911-e91c-d08d-d3ebb52b3e93","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f967503-8b3f-c991-c2be-2a3a0e401a21","name":"3f967503-8b3f-c991-c2be-2a3a0e401a21","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/COSMOSDATA/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/405a11f1-f7e2-4ee3-f7e9-4b51cdaa6efc","name":"405a11f1-f7e2-4ee3-f7e9-4b51cdaa6efc","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/COSMOSDATA/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/6b2263e0-3881-88cd-ded5-6520b1b18dfc","name":"6b2263e0-3881-88cd-ded5-6520b1b18dfc","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/e72e1401-659c-30d9-6cc4-3f6dea42d2bc","name":"e72e1401-659c-30d9-6cc4-3f6dea42d2bc","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/aedd45a5-d2e6-6e6b-55ff-f68991ab2c6b","name":"aedd45a5-d2e6-6e6b-55ff-f68991ab2c6b","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/COSMOSDATA/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/a0ca9267-1ca0-0c39-d8f9-ad7ee177c408","name":"a0ca9267-1ca0-0c39-d8f9-ad7ee177c408","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AZEXPERTSTGEUS/providers/Microsoft.Compute/virtualMachines/EUS-Test/providers/Microsoft.Advisor/recommendations/75900b89-f998-d17b-d149-d94366b52eda","name":"75900b89-f998-d17b-d149-d94366b52eda","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"EUS-Test","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/9d88ef0e-e8c0-a056-c303-fc9ca5e71c2a","name":"9d88ef0e-e8c0-a056-c303-fc9ca5e71c2a","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:16.1814518Z","risk":"None","shortDescription":{"problem":"Your - virtual machine is not configured for backup","solution":"Enable virtual machine - backup to protect your data from corruption and accidental deletion"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cosmosdata/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/73cdeb24-ff47-432a-8eef-c55d4b754df1","name":"73cdeb24-ff47-432a-8eef-c55d4b754df1","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T17:18:16.1814518Z","risk":"None","shortDescription":{"problem":"Your - virtual machine is not configured for backup","solution":"Enable virtual machine - backup to protect your data from corruption and accidental deletion"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c","name":"3f7f8549-a4ec-9548-3b63-09bf5845724c","properties":{"category":"Cost","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T11:02:58.0160597Z","risk":"None","shortDescription":{"problem":"Your - virtual machine has low usage","solution":"Right-size or shutdown underutilized - virtual machines"}},"type":"Microsoft.Advisor/recommendations","hardwareDetails":{"resourceId":"y8fx4nayf4ptcckwy6pri8bbx5z4mwufo9ax4nayrti71j3x5pdwtc7y4imyqeyy6a","size":"Standard_D1_v2"}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/availabilitySets/avset1/providers/Microsoft.Advisor/recommendations/53162ec9-8175-8a19-bf2c-1271a893e24a","name":"53162ec9-8175-8a19-bf2c-1271a893e24a","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/availabilitySets","impactedValue":"avset1","lastUpdated":"2017-11-16T10:56:18.6499735Z","risk":"Warning","shortDescription":{"problem":"This - availability set is not configured for fault tolerance","solution":"Add more - virtual machines for improved fault tolerance"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cosmosdata/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/fd97b114-f106-e610-ee6a-7deca5f9963d","name":"fd97b114-f106-e610-ee6a-7deca5f9963d","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T10:56:02.056374Z","risk":"None","shortDescription":{"problem":"This - virtual machine is not configured for fault tolerance","solution":"Use availability - sets for improved fault tolerance"}},"type":"Microsoft.Advisor/recommendations"}]}'} - headers: - cache-control: [no-cache] - content-length: ['12585'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:25 GMT'] - expires: ['-1'] - iscutoff: ['False'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations?api-version=2017-04-19&$filter=Category%20eq%20%27cost%27 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c","name":"3f7f8549-a4ec-9548-3b63-09bf5845724c","properties":{"category":"Cost","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T11:02:58.0160597Z","risk":"None","shortDescription":{"problem":"Your - virtual machine has low usage","solution":"Right-size or shutdown underutilized - virtual machines"}},"type":"Microsoft.Advisor/recommendations","hardwareDetails":{"resourceId":"y8fx4nayf4ptcckwy6pri8bbx5z4mwufo9ax4nayrti71j3x5pdwtc7y4imyqeyy6a","size":"Standard_D1_v2"}}]}'} - headers: - cache-control: [no-cache] - content-length: ['779'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:27 GMT'] - expires: ['-1'] - iscutoff: ['False'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"ttl": "1:00:00:00"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation disable] - Connection: [keep-alive] - Content-Length: ['37'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/%2Fsubscriptions%2F658c8950-e79d-4704-a903-1df66ba90258%2FresourceGroups%2Ffunctionaltest%2Fproviders%2FMicrosoft.Compute%2FvirtualMachines%2Fvmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe?api-version=2017-04-19 - response: - body: {string: '{"properties":{"suppressionId":"eacbc09d-e003-8167-fa4e-47d8a9c61f0a","ttl":"1:00:00:00"}}'} - headers: - cache-control: [no-cache] - content-length: ['90'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:30 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation disable] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/%2Fsubscriptions%2F658c8950-e79d-4704-a903-1df66ba90258%2FresourceGroups%2Ffunctionaltest%2Fproviders%2FMicrosoft.Compute%2FvirtualMachines%2Fvmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe?api-version=2017-04-19 - response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe","name":"d8a63867-e3cc-43b4-8400-3d75f3a8f9fe","type":"Microsoft.Advisor/suppressions","properties":{"suppressionId":"eacbc09d-e003-8167-fa4e-47d8a9c61f0a","ttl":"1.00:00:00"}}'} - headers: - cache-control: [no-cache] - content-length: ['452'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:32 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation enable] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/suppressions?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe","name":"d8a63867-e3cc-43b4-8400-3d75f3a8f9fe","type":"Microsoft.Advisor/suppressions","properties":{"suppressionId":"eacbc09d-e003-8167-fa4e-47d8a9c61f0a","ttl":"1.00:00:00"}}]}'} - headers: - cache-control: [no-cache] - content-length: ['464'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:32 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation enable] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations?api-version=2017-04-19&$filter=ResourceId%20eq%20%27%2Fsubscriptions%2F658c8950-e79d-4704-a903-1df66ba90258%2FresourceGroups%2Ffunctionaltest%2Fproviders%2FMicrosoft.Compute%2FvirtualMachines%2Fvmnobackup1%27 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3bc9d079-1911-e91c-d08d-d3ebb52b3e93","name":"3bc9d079-1911-e91c-d08d-d3ebb52b3e93","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f967503-8b3f-c991-c2be-2a3a0e401a21","name":"3f967503-8b3f-c991-c2be-2a3a0e401a21","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/e72e1401-659c-30d9-6cc4-3f6dea42d2bc","name":"e72e1401-659c-30d9-6cc4-3f6dea42d2bc","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/aedd45a5-d2e6-6e6b-55ff-f68991ab2c6b","name":"aedd45a5-d2e6-6e6b-55ff-f68991ab2c6b","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/9d88ef0e-e8c0-a056-c303-fc9ca5e71c2a","name":"9d88ef0e-e8c0-a056-c303-fc9ca5e71c2a","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:16.1814518Z","risk":"None","shortDescription":{"problem":"Your - virtual machine is not configured for backup","solution":"Enable virtual machine - backup to protect your data from corruption and accidental deletion"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c","name":"3f7f8549-a4ec-9548-3b63-09bf5845724c","properties":{"category":"Cost","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T11:02:58.0160597Z","risk":"None","shortDescription":{"problem":"Your - virtual machine has low usage","solution":"Right-size or shutdown underutilized - virtual machines"},"suppressionIds":["eacbc09d-e003-8167-fa4e-47d8a9c61f0a"]},"type":"Microsoft.Advisor/recommendations","hardwareDetails":{"resourceId":"y8fx4nayf4ptcckwy6pri8bbx5z4mwufo9ax4nayrti71j3x5pdwtc7y4imyqeyy6a","size":"Standard_D1_v2"}}]}'} - headers: - cache-control: [no-cache] - content-length: ['4109'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:34 GMT'] - expires: ['-1'] - iscutoff: ['False'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation enable] - Connection: [keep-alive] - Content-Length: ['0'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: DELETE - uri: https://management.azure.com/%2Fsubscriptions%2F658c8950-e79d-4704-a903-1df66ba90258%2FresourceGroups%2Ffunctionaltest%2Fproviders%2FMicrosoft.Compute%2FvirtualMachines%2Fvmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Thu, 16 Nov 2017 17:18:35 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations?api-version=2017-04-19&$filter=Category%20eq%20%27cost%27 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c","name":"3f7f8549-a4ec-9548-3b63-09bf5845724c","properties":{"category":"Cost","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T11:02:58.0160597Z","risk":"None","shortDescription":{"problem":"Your - virtual machine has low usage","solution":"Right-size or shutdown underutilized - virtual machines"}},"type":"Microsoft.Advisor/recommendations","hardwareDetails":{"resourceId":"y8fx4nayf4ptcckwy6pri8bbx5z4mwufo9ax4nayrti71j3x5pdwtc7y4imyqeyy6a","size":"Standard_D1_v2"}}]}'} - headers: - cache-control: [no-cache] - content-length: ['779'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:37 GMT'] - expires: ['-1'] - iscutoff: ['False'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py index b83555f2f06..0204c4893a1 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py @@ -5,11 +5,13 @@ import unittest -from azure.cli.testsdk import LiveScenarioTest, ScenarioTest, ResourceGroupPreparer +from azure.cli.testsdk import ( + LiveScenarioTest, ScenarioTest, ResourceGroupPreparer) -from azure.cli.command_modules.advisor.custom import _cli_advisor_build_filter_string, _cli_advisor_parse_operation_id, _cli_advisor_parse_recommendation_uri - -# pylint: disable=line-too-long +from azure.cli.command_modules.advisor.custom import ( + _cli_advisor_build_filter_string, + _cli_advisor_parse_operation_id, + _cli_advisor_parse_recommendation_uri) class AzureAdvisorUnitTest(unittest.TestCase): @@ -19,77 +21,146 @@ def test_build_filter(self): resource_group_name = 'r' category = 'cost' - self.assertEqual(_cli_advisor_build_filter_string(), None) - self.assertEqual(_cli_advisor_build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") - self.assertEqual(_cli_advisor_build_filter_string(resource_group_name=resource_group_name), "ResourceGroup eq 'r'") - self.assertEqual(_cli_advisor_build_filter_string(category=category), "Category eq 'cost'") - self.assertEqual(_cli_advisor_build_filter_string(ids=ids, category=category), "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") - self.assertEqual(_cli_advisor_build_filter_string(resource_group_name=resource_group_name, category=category), "(ResourceGroup eq 'r') and Category eq 'cost'") + self.assertEqual( + _cli_advisor_build_filter_string(), + None) + self.assertEqual( + _cli_advisor_build_filter_string(ids=ids), + "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") + self.assertEqual( + _cli_advisor_build_filter_string( + resource_group_name=resource_group_name), + "ResourceGroup eq 'r'") + self.assertEqual( + _cli_advisor_build_filter_string( + category=category), + "Category eq 'cost'") + self.assertEqual( + _cli_advisor_build_filter_string( + ids=ids, + category=category), + "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") + self.assertEqual( + _cli_advisor_build_filter_string( + resource_group_name=resource_group_name, + category=category), + "(ResourceGroup eq 'r') and Category eq 'cost'") def test__cli_advisor_parse_operation_id(self): - location = 'https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320?api-version=2017-04-19' + location = ("https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/" + "providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320" + "?api-version=2017-04-19") operation_id = _cli_advisor_parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') def test__cli_advisor_parse_recommendation_uri(self): - recommendation_uri = '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test/providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425' + recommendation_uri = ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" + "/providers/Microsoft.Network/expressRouteCircuits/test/" + "providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425" + "/suppressions/5c9c3fce-c1b2-7e45-106c-152ce3c04be5") result = _cli_advisor_parse_recommendation_uri(recommendation_uri) self.assertEqual( result['resourceUri'], - '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test' - ) + ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" + "/providers/Microsoft.Network/expressRouteCircuits/test")) self.assertEqual(result['recommendationId'], 'c4deb869-ea38-f90d-331f-91770021d425') class AzureAdvisorLiveScenarioTest(LiveScenarioTest): - def test_list_disable_enable_recommendations(self): - output = self.cmd('advisor recommendation list --refresh').get_output_in_json() - self.assertGreater(len(output), 1) - output = self.cmd('advisor recommendation list --category cost').get_output_in_json() - self.assertGreater(len(output), 0) + def test_recommendations(self): + # List should return at least one recommendation with filters + output = self.cmd('advisor recommendation list --category Security', + checks=self.check("[0].category", 'Security')).get_output_in_json() + # Set the recommendation details to use with further commands + # Ignore the first one since that is for the whole subscription + ids = _cli_advisor_parse_recommendation_uri(output[1]['id'])['resourceUri'] + name = output[1]['name'] + group = output[1]['resourceGroup'] self.kwargs.update({ - 'recommendation_id': output[0]['id'] + 'ids': ids, + 'name': name, + 'group': group }) - disableCmd = 'advisor recommendation disable --ids {recommendation_id} --days 1' - enableCmd = 'advisor recommendation enable --ids {recommendation_id}' - output = self.cmd(disableCmd).get_output_in_json() - self.assertEqual(output[0]['ttl'], '1.00:00:00') - self.cmd(enableCmd) - output = self.cmd('advisor recommendation list --category cost').get_output_in_json() - self.assertGreater(len(output), 0) - self.assertEqual(output[0]['suppressionIds'], None) + + # Disable with specified duration should create a suppression + self.cmd('advisor recommendation disable -n {name} -g {group} --days 1', + checks = [self.check("name", name), + self.check("resourceGroup", group), + self.exists("suppressionIds")]) + + # Disable again should create another suppression + self.cmd('advisor recommendation disable -n {name} -g {group}', + checks = [self.check("name", name), + self.check("resourceGroup", group), + self.greater_than("length(suppressionIds)", 1)]) + + # Enable should remove all suppressions + self.cmd('advisor recommendation enable -n {name} -g {group}') + self.cmd('advisor recommendation list --ids {ids}', + checks = [self.check("[0].name", name), + self.check("[0].resourceGroup", group), + self.check("[0].suppressionIds", None)]) + + # Enable again should be a no op + self.cmd('advisor recommendation enable -n {name} -g {group}') + self.cmd('advisor recommendation list --ids {ids}', + checks = [self.check("[0].name", name), + self.check("[0].resourceGroup", group), + self.check("[0].suppressionIds", None)]) + + # List should return at least one recommendation without any filters + self.cmd('advisor recommendation list --refresh', + checks=self.check("[?category=='Security'].category | [0]", 'Security')) class AzureAdvisorScenarioTest(ScenarioTest): - def test_list_update_configurations_subscription(self): - output = self.cmd('advisor configuration list').get_output_in_json() - self.assertGreater(len(output), 1) - self.cmd('advisor configuration update --low-cpu-threshold 20') - output = self.cmd('advisor configuration list').get_output_in_json() - for entry in output['value']: - if entry['properties']['lowCpuThreshold']: - self.assertEqual(entry['properties']['lowCpuThreshold'], '20') - self.cmd('advisor configuration update --low-cpu-threshold 5') - output = self.cmd('advisor configuration list').get_output_in_json() - for entry in output['value']: - if entry['properties']['lowCpuThreshold']: - self.assertEqual(entry['properties']['lowCpuThreshold'], '5') + def test_configurations_subscription(self): + subscriptionId = self.cmd('account show').get_output_in_json()['id'] + + # Show should always return a default + self.cmd('advisor configuration show', + checks = [self.check("name", subscriptionId)]) + + # Show should reflect the changes made by Update + self.cmd('advisor configuration update --low-cpu-threshold 15 --exclude') + self.cmd('advisor configuration show', + checks = [self.check("name", subscriptionId), + self.check("properties.lowCpuThreshold", "15"), + self.check("properties.exclude", True)]) + + # Show should reflect the changes made by Update + self.cmd('advisor configuration update --low-cpu-threshold 5 --include') + self.cmd('advisor configuration show', + checks = [self.check("name", subscriptionId), + self.check("properties.lowCpuThreshold", "5"), + self.check("properties.exclude", False)]) + + # List should reflect the changes made by Update + self.cmd('advisor configuration list', + checks = [self.check("[0].name", subscriptionId), + self.check("[0].properties.lowCpuThreshold", "5"), + self.check("[0].properties.exclude", False)]) @ResourceGroupPreparer(name_prefix='cli_test_advisor') - def test_list_update_configurations_resource_group(self, resource_group): - output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() - self.assertGreater(len(output), 0) - self.cmd('advisor configuration update --exclude --resource-group {rg}') - output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() - self.assertGreater(len(output), 0) - self.assertTrue(output['value'][0]['properties']['exclude']) - self.cmd('advisor configuration update --include --resource-group {rg}') - output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() - self.assertGreater(len(output), 0) - self.assertTrue(not output['value'][0]['properties']['exclude']) + def test_configurations_subscription(self, resource_group): + # Show should always return a default even for a brand new resource group + self.cmd('advisor configuration show -g {rg}', + checks = [self.check("resourceGroup", resource_group)]) + + # Show should reflect the changes made by Update + self.cmd('advisor configuration update --exclude -g {rg}') + self.cmd('advisor configuration show -g {rg}', + checks = [self.check("resourceGroup", resource_group), + self.check("properties.exclude", True)]) + + # Show should reflect the changes made by Update + self.cmd('advisor configuration update --include -g {rg}') + self.cmd('advisor configuration show -g {rg}', + checks = [self.check("resourceGroup", resource_group), + self.check("properties.exclude", False)]) if __name__ == '__main__': From 6e17e92e2cab995d28b191f83ba741e7ed1ef7ca Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Fri, 16 Feb 2018 09:01:23 -0800 Subject: [PATCH 08/22] Fix indentation errors. --- .../tests/latest/test_advisor_commands.py | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py index 0204c4893a1..cc978a59412 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py @@ -23,14 +23,14 @@ def test_build_filter(self): self.assertEqual( _cli_advisor_build_filter_string(), - None) + None) self.assertEqual( _cli_advisor_build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") self.assertEqual( _cli_advisor_build_filter_string( resource_group_name=resource_group_name), - "ResourceGroup eq 'r'") + "ResourceGroup eq 'r'") self.assertEqual( _cli_advisor_build_filter_string( category=category), @@ -48,21 +48,21 @@ def test_build_filter(self): def test__cli_advisor_parse_operation_id(self): location = ("https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/" - "providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320" - "?api-version=2017-04-19") + "providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320" + "?api-version=2017-04-19") operation_id = _cli_advisor_parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') def test__cli_advisor_parse_recommendation_uri(self): recommendation_uri = ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" - "/providers/Microsoft.Network/expressRouteCircuits/test/" - "providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425" - "/suppressions/5c9c3fce-c1b2-7e45-106c-152ce3c04be5") + "/providers/Microsoft.Network/expressRouteCircuits/test/" + "providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425" + "/suppressions/5c9c3fce-c1b2-7e45-106c-152ce3c04be5") result = _cli_advisor_parse_recommendation_uri(recommendation_uri) self.assertEqual( result['resourceUri'], ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" - "/providers/Microsoft.Network/expressRouteCircuits/test")) + "/providers/Microsoft.Network/expressRouteCircuits/test")) self.assertEqual(result['recommendationId'], 'c4deb869-ea38-f90d-331f-91770021d425') @@ -86,29 +86,29 @@ def test_recommendations(self): # Disable with specified duration should create a suppression self.cmd('advisor recommendation disable -n {name} -g {group} --days 1', - checks = [self.check("name", name), - self.check("resourceGroup", group), - self.exists("suppressionIds")]) + checks=[self.check("name", name), + self.check("resourceGroup", group), + self.exists("suppressionIds")]) # Disable again should create another suppression self.cmd('advisor recommendation disable -n {name} -g {group}', - checks = [self.check("name", name), - self.check("resourceGroup", group), - self.greater_than("length(suppressionIds)", 1)]) + checks=[self.check("name", name), + self.check("resourceGroup", group), + self.greater_than("length(suppressionIds)", 1)]) # Enable should remove all suppressions self.cmd('advisor recommendation enable -n {name} -g {group}') self.cmd('advisor recommendation list --ids {ids}', - checks = [self.check("[0].name", name), - self.check("[0].resourceGroup", group), - self.check("[0].suppressionIds", None)]) + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", group), + self.check("[0].suppressionIds", None)]) # Enable again should be a no op self.cmd('advisor recommendation enable -n {name} -g {group}') self.cmd('advisor recommendation list --ids {ids}', - checks = [self.check("[0].name", name), - self.check("[0].resourceGroup", group), - self.check("[0].suppressionIds", None)]) + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", group), + self.check("[0].suppressionIds", None)]) # List should return at least one recommendation without any filters self.cmd('advisor recommendation list --refresh', @@ -122,45 +122,45 @@ def test_configurations_subscription(self): # Show should always return a default self.cmd('advisor configuration show', - checks = [self.check("name", subscriptionId)]) + checks=[self.check("name", subscriptionId)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --low-cpu-threshold 15 --exclude') self.cmd('advisor configuration show', - checks = [self.check("name", subscriptionId), - self.check("properties.lowCpuThreshold", "15"), - self.check("properties.exclude", True)]) + checks=[self.check("name", subscriptionId), + self.check("properties.lowCpuThreshold", "15"), + self.check("properties.exclude", True)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --low-cpu-threshold 5 --include') self.cmd('advisor configuration show', - checks = [self.check("name", subscriptionId), - self.check("properties.lowCpuThreshold", "5"), - self.check("properties.exclude", False)]) + checks=[self.check("name", subscriptionId), + self.check("properties.lowCpuThreshold", "5"), + self.check("properties.exclude", False)]) # List should reflect the changes made by Update self.cmd('advisor configuration list', - checks = [self.check("[0].name", subscriptionId), - self.check("[0].properties.lowCpuThreshold", "5"), - self.check("[0].properties.exclude", False)]) + checks=[self.check("[0].name", subscriptionId), + self.check("[0].properties.lowCpuThreshold", "5"), + self.check("[0].properties.exclude", False)]) @ResourceGroupPreparer(name_prefix='cli_test_advisor') def test_configurations_subscription(self, resource_group): # Show should always return a default even for a brand new resource group self.cmd('advisor configuration show -g {rg}', - checks = [self.check("resourceGroup", resource_group)]) + checks=[self.check("resourceGroup", resource_group)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --exclude -g {rg}') self.cmd('advisor configuration show -g {rg}', - checks = [self.check("resourceGroup", resource_group), - self.check("properties.exclude", True)]) + checks=[self.check("resourceGroup", resource_group), + self.check("properties.exclude", True)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --include -g {rg}') self.cmd('advisor configuration show -g {rg}', - checks = [self.check("resourceGroup", resource_group), - self.check("properties.exclude", False)]) + checks=[self.check("resourceGroup", resource_group), + self.check("properties.exclude", False)]) if __name__ == '__main__': From ae53ccef4c933e655b43c239c35f5073b8bb2e24 Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Fri, 23 Feb 2018 17:21:16 -0800 Subject: [PATCH 09/22] Add support for ids. --- .../cli/command_modules/advisor/_params.py | 11 +- .../command_modules/advisor/_validators.py | 5 + .../cli/command_modules/advisor/commands.py | 16 +- .../cli/command_modules/advisor/custom.py | 149 +++++----- .../test_configurations_resource_group.yaml | 259 ++++++++++++++++++ .../test_configurations_subscription.yaml | 119 ++++---- .../tests/latest/test_advisor_commands.py | 125 +++++---- 7 files changed, 480 insertions(+), 204 deletions(-) create mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py index 50a69e42a79..7bf272692bc 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py @@ -11,6 +11,7 @@ from ._validators import \ (validate_include_or_exclude, + validate_ids_or_names, validate_ids_or_resource_group, validate_threshold_or_resource_group) @@ -20,7 +21,7 @@ def load_arguments(self, _): help='One or more resource IDs (space-delimited). If provided, no other ' '"Resource Id" arguments should be specified.') - name_arg_type = CLIArgumentType(options_list=['--name', '-n'], id_part='child_name_1', + name_arg_type = CLIArgumentType(options_list=['--name', '-n'], help='The name of the recommendation as output by the list command.', completer=get_resource_name_completion_list('Microsoft.Advisor/recommendations')) @@ -32,12 +33,16 @@ def load_arguments(self, _): help='Generate new recommendations.') with self.argument_context('advisor recommendation disable') as c: - c.argument('recommendation_name', name_arg_type) + c.argument('ids', ids_arg_type, arg_group="Resource Id", validator=validate_ids_or_names) + c.argument('recommendation_name', name_arg_type, arg_group="Resource Id") + c.argument('resource_group_name', arg_group="Resource Id") c.argument('days', options_list=['--days', '-d'], type=int, help='Number of days to disable. If not specified, the recommendation is disabled forever.') with self.argument_context('advisor recommendation enable') as c: - c.argument('recommendation_name', name_arg_type) + c.argument('ids', ids_arg_type, arg_group="Resource Id", validator=validate_ids_or_names) + c.argument('resource_group_name', arg_group="Resource Id") + c.argument('recommendation_name', name_arg_type, arg_group="Resource Id") with self.argument_context('advisor configuration update') as c: c.argument('low_cpu_threshold', options_list=['--low-cpu-threshold', '-l'], diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py index af7cc079cac..165f89722a5 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py @@ -11,6 +11,11 @@ def validate_include_or_exclude(namespace): raise CLIError('usage error: --include | --exclude') +def validate_ids_or_names(namespace): + if namespace.ids and (namespace.recommendation_name or namespace.resource_group_name): + raise CLIError('usage error: --ids | --name [--resource-group]') + + def validate_ids_or_resource_group(namespace): if namespace.ids and namespace.resource_group_name: raise CLIError('usage error: --ids | --resource-group') diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index e7ad86e9080..4d6084dcc39 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -14,20 +14,20 @@ def load_command_table(self, _): advisor_custom = CliCommandType(operations_tmpl='azure.cli.command_modules.advisor.custom#{}') with self.command_group('advisor recommendation') as g: - g.custom_command('list', 'cli_advisor_list_recommendations', + g.custom_command('list', 'list_recommendations', client_factory=recommendations_mgmt_client_factory) - g.custom_command('disable', 'cli_advisor_disable_recommendations', + g.custom_command('disable', 'disable_recommendations', client_factory=advisor_mgmt_client_factory) - g.custom_command('enable', 'cli_advisor_enable_recommendations', + g.custom_command('enable', 'enable_recommendations', client_factory=advisor_mgmt_client_factory) with self.command_group('advisor configuration', client_factory=configurations_mgmt_client_factory) as g: - g.custom_command('list', 'cli_advisor_list_configuration') - g.custom_command('show', 'cli_advisor_show_configuration') + g.custom_command('list', 'list_configuration') + g.custom_command('show', 'show_configuration') g.generic_update_command('update', - getter_name='cli_advisor_show_configuration', + getter_name='show_configuration', getter_type=advisor_custom, - setter_name='_cli_advisor_set_configuration', + setter_name='_set_configuration', setter_type=advisor_custom, - custom_func_name='cli_advisor_update_configuration', + custom_func_name='update_configuration', custom_func_type=advisor_custom) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index 1b5bc75a102..5ddb4eb42b7 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -4,86 +4,73 @@ # -------------------------------------------------------------------------------------------- import uuid -from knack.util import CLIError -def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, - category=None, refresh=None): +def list_recommendations(client, ids=None, resource_group_name=None, + category=None, refresh=None): if refresh: - _cli_advisor_generate_recommendations(client) - scope = _cli_advisor_build_filter_string(ids, resource_group_name, category) + _generate_recommendations(client) + scope = _build_filter_string(ids, resource_group_name, category) return client.list(scope) -def cli_advisor_disable_recommendations(client, resource_group_name, - recommendation_name, days=None): - recs = cli_advisor_list_recommendations( +def disable_recommendations(client, ids=None, recommendation_name=None, + resource_group_name=None, days=None): + recs = _get_recommendations( client=client.recommendations, - resource_group_name=resource_group_name) - rec = next((r for r in recs if r.name == recommendation_name), None) - - if not rec: - raise CLIError( - "Recommendation with name {} in resource group {} not found".format( - recommendation_name, - resource_group_name)) - - suppressionName = str(uuid.uuid4()) - ttl = '{}:00:00:00'.format(days) if days else '' - - result = _cli_advisor_parse_recommendation_uri(rec.id) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] - - sup = client.suppressions.create( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName, - ttl=ttl - ) - - if rec.suppression_ids: - rec.suppression_ids.append(sup.suppression_id) - else: - rec.suppression_ids = [sup.suppression_id] + ids=ids, + resource_group_name=resource_group_name, + recommendation_name=recommendation_name) - return rec + for rec in recs: + suppression_name = str(uuid.uuid4()) + ttl = '{}:00:00:00'.format(days) if days else '' + result = _parse_recommendation_uri(rec.id) + resource_uri = result['resource_uri'] + recommendation_id = result['recommendation_id'] -def cli_advisor_enable_recommendations(client, resource_group_name, recommendation_name): - allSups = list(client.suppressions.list()) + sup = client.suppressions.create( + resource_uri=resource_uri, + recommendation_id=recommendation_id, + name=suppression_name, + ttl=ttl + ) - recs = cli_advisor_list_recommendations( - client=client.recommendations, - resource_group_name=resource_group_name) - rec = next((r for r in recs if r.name == recommendation_name), None) + if rec.suppression_ids: + rec.suppression_ids.append(sup.suppression_id) + else: + rec.suppression_ids = [sup.suppression_id] - if rec: - matches = [x for x in allSups if x.suppression_id in rec.suppression_ids] - else: - matches = [s for s in allSups if 'Microsoft.Advisor/recommendations/{}'.format(recommendation_name) in s.id] + return recs - if matches: - for match in matches: - result = _cli_advisor_parse_recommendation_uri(match.id) - client.suppressions.delete( - resource_uri=result['resourceUri'], - recommendation_id=result['recommendationId'], - name=match.name - ) - rec = cli_advisor_list_recommendations( - client=client.recommendations, - ids=result['resourceUri']) +def enable_recommendations(client, ids=None, resource_group_name=None, recommendation_name=None): + recs = _get_recommendations( + client=client.recommendations, + ids=ids, + resource_group_name=resource_group_name, + recommendation_name=recommendation_name) + all_sups = list(client.suppressions.list()) + + for rec in recs: + for sup in all_sups: + if sup.suppression_id in rec.suppression_ids: + result = _parse_recommendation_uri(rec.id) + client.suppressions.delete( + resource_uri=result['resource_uri'], + recommendation_id=result['recommendation_id'], + name=sup.name) + rec.suppression_ids = None - return rec + return recs -def cli_advisor_list_configuration(client): +def list_configuration(client): return client.list_by_subscription() -def cli_advisor_show_configuration(client, resource_group_name=None): +def show_configuration(client, resource_group_name=None): output = None if resource_group_name: output = client.list_by_resource_group(resource_group_name) @@ -93,8 +80,8 @@ def cli_advisor_show_configuration(client, resource_group_name=None): return list(output)[0] -def cli_advisor_update_configuration(instance, low_cpu_threshold=None, - exclude=None, include=None): +def update_configuration(instance, low_cpu_threshold=None, + exclude=None, include=None): instance.properties.low_cpu_threshold = low_cpu_threshold instance.properties.exclude = exclude if include: @@ -103,7 +90,7 @@ def cli_advisor_update_configuration(instance, low_cpu_threshold=None, return instance -def _cli_advisor_build_filter_string(ids=None, resource_group_name=None, category=None): +def _build_filter_string(ids=None, resource_group_name=None, category=None): idFilter = None if ids: @@ -123,7 +110,7 @@ def _cli_advisor_build_filter_string(ids=None, resource_group_name=None, categor return None -def _cli_advisor_parse_operation_id(location): +def _parse_operation_id(location): # extract the operation ID from the Location header # it is a GUID (i.e. a string of length 36) immediately preceding the api-version query parameter end = location.find('?api-version') @@ -132,21 +119,21 @@ def _cli_advisor_parse_operation_id(location): return operation_id -def _cli_advisor_parse_recommendation_uri(recommendationUri): - resourceUri = recommendationUri[:recommendationUri.find("/providers/Microsoft.Advisor/recommendations")] - rStart = recommendationUri.find("/recommendations/") + len('/recommendations/') +def _parse_recommendation_uri(recommendation_uri): + resource_uri = recommendation_uri[:recommendation_uri.find("/providers/Microsoft.Advisor/recommendations")] + rStart = recommendation_uri.find("/recommendations/") + len('/recommendations/') # recommendation ID is a GUID (i.e. a string of length 36) rEnd = rStart + 36 - recommendationId = recommendationUri[rStart:rEnd] - return {'resourceUri': resourceUri, 'recommendationId': recommendationId} + recommendation_id = recommendation_uri[rStart:rEnd] + return {'resource_uri': resource_uri, 'recommendation_id': recommendation_id} -def _cli_advisor_generate_recommendations(client): +def _generate_recommendations(client): from msrestazure.azure_exceptions import CloudError response = client.generate(raw=True) location = response.headers['Location'] - operation_id = _cli_advisor_parse_operation_id(location) + operation_id = _parse_operation_id(location) try: client.get_generate_status(operation_id=operation_id) @@ -157,10 +144,28 @@ def _cli_advisor_generate_recommendations(client): raise ex -def _cli_advisor_set_configuration(client, resource_group_name=None, parameters=None): +def _set_configuration(client, resource_group_name=None, parameters=None): if resource_group_name: return client.create_in_resource_group( config_contract=parameters, resource_group=resource_group_name) return client.create_in_subscription(parameters) + + +def _get_recommendations(client, ids=None, resource_group_name=None, recommendation_name=None): + if ids: + resource_ids = [_parse_recommendation_uri(id_arg)['resource_uri'] for id_arg in ids] + recs = list_recommendations( + client=client, + ids=resource_ids + ) + return [r for r in recs if r.id in ids] + + if recommendation_name: + recs = list_recommendations( + client=client, + resource_group_name=resource_group_name) + return [r for r in recs if r.name == recommendation_name] + + return None diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml new file mode 100644 index 00000000000..848f11bfa60 --- /dev/null +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml @@ -0,0 +1,259 @@ +interactions: +- request: + body: '{"location": "westus", "tags": {"use": "az-test"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [group create] + Connection: [keep-alive] + Content-Length: ['50'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.28] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + response: + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + headers: + cache-control: [no-cache] + content-length: ['328'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:31 GMT'] + expires: ['-1'] + pragma: [no-cache] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] + status: {code: 201, message: Created} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:33 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:34 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +- request: + body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "properties": {"exclude": true}}''' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['509'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Sat, 24 Feb 2018 01:19:35 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['198'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + headers: + cache-control: [no-cache] + content-length: ['513'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:35 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['597'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + headers: + cache-control: [no-cache] + content-length: ['513'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:38 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +- request: + body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "properties": {"exclude": false}}''' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['510'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Sat, 24 Feb 2018 01:19:39 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['198'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:40 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [group delete] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.28] + accept-language: [en-US] + method: DELETE + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + content-length: ['0'] + date: ['Sat, 24 Feb 2018 01:19:42 GMT'] + expires: ['-1'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkRYSjNPUlpMSVVENTVZWUZKS1JWM0hTWTRWS3w5OEMxNzQ2RDE4QTVFRTNBLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + pragma: [no-cache] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] + status: {code: 202, message: Accepted} +version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml index b72cef50772..90117463d2b 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml @@ -1,31 +1,4 @@ interactions: -- request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [group create] - Connection: [keep-alive] - Content-Length: ['50'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.28] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 - response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} - headers: - cache-control: [no-cache] - content-length: ['328'] - content-type: [application/json; charset=utf-8] - date: ['Fri, 16 Feb 2018 02:26:01 GMT'] - expires: ['-1'] - pragma: [no-cache] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 201, message: Created} - request: body: null headers: @@ -38,14 +11,14 @@ interactions: msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['514'] + content-length: ['798'] content-type: [application/json; charset=utf-8] - date: ['Fri, 16 Feb 2018 02:26:03 GMT'] + date: ['Sat, 24 Feb 2018 01:19:43 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -67,14 +40,14 @@ interactions: msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['514'] + content-length: ['798'] content-type: [application/json; charset=utf-8] - date: ['Fri, 16 Feb 2018 02:26:04 GMT'] + date: ['Sat, 24 Feb 2018 01:19:45 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -82,29 +55,29 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] status: {code: 200, message: OK} - request: - body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", - "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", - "properties": {"exclude": true}}''' + body: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258", + "properties": {"exclude": true, "low_cpu_threshold": "15"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Length: ['509'] + Content-Length: ['293'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: body: {string: ''} headers: cache-control: [no-cache] - date: ['Fri, 16 Feb 2018 02:26:05 GMT'] + date: ['Sat, 24 Feb 2018 01:19:43 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -124,14 +97,14 @@ interactions: msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"15","exclude":true}}]}'} headers: cache-control: [no-cache] - content-length: ['513'] + content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Fri, 16 Feb 2018 02:26:06 GMT'] + date: ['Sat, 24 Feb 2018 01:19:47 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -153,14 +126,14 @@ interactions: msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"15","exclude":true}}]}'} headers: cache-control: [no-cache] - content-length: ['513'] + content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Fri, 16 Feb 2018 02:26:08 GMT'] + date: ['Sat, 24 Feb 2018 01:19:47 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -171,26 +144,26 @@ interactions: x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: - body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", - "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", - "properties": {"exclude": false}}''' + body: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258", + "properties": {"exclude": false, "low_cpu_threshold": "5"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Length: ['510'] + Content-Length: ['293'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: body: {string: ''} headers: cache-control: [no-cache] - date: ['Fri, 16 Feb 2018 02:26:08 GMT'] + date: ['Sat, 24 Feb 2018 01:19:50 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -210,14 +183,14 @@ interactions: msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['514'] + content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Fri, 16 Feb 2018 02:26:09 GMT'] + date: ['Sat, 24 Feb 2018 01:19:50 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -232,26 +205,28 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [group delete] + CommandName: [advisor configuration list] Connection: [keep-alive] - Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.28] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] - method: DELETE - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: ''} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['0'] - date: ['Fri, 16 Feb 2018 02:26:10 GMT'] + content-length: ['295'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:51 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUlUzUTVKNFlEVkNEQ0lENDc2Q1JDUEFUUUJYRHxEOTU4QjBFMTczMDJFQTIwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 202, message: Accepted} + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py index cc978a59412..63268ba6dfb 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py @@ -9,9 +9,9 @@ LiveScenarioTest, ScenarioTest, ResourceGroupPreparer) from azure.cli.command_modules.advisor.custom import ( - _cli_advisor_build_filter_string, - _cli_advisor_parse_operation_id, - _cli_advisor_parse_recommendation_uri) + _build_filter_string, + _parse_operation_id, + _parse_recommendation_uri) class AzureAdvisorUnitTest(unittest.TestCase): @@ -22,48 +22,48 @@ def test_build_filter(self): category = 'cost' self.assertEqual( - _cli_advisor_build_filter_string(), + _build_filter_string(), None) self.assertEqual( - _cli_advisor_build_filter_string(ids=ids), + _build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") self.assertEqual( - _cli_advisor_build_filter_string( + _build_filter_string( resource_group_name=resource_group_name), "ResourceGroup eq 'r'") self.assertEqual( - _cli_advisor_build_filter_string( + _build_filter_string( category=category), "Category eq 'cost'") self.assertEqual( - _cli_advisor_build_filter_string( + _build_filter_string( ids=ids, category=category), "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") self.assertEqual( - _cli_advisor_build_filter_string( + _build_filter_string( resource_group_name=resource_group_name, category=category), "(ResourceGroup eq 'r') and Category eq 'cost'") - def test__cli_advisor_parse_operation_id(self): + def test__parse_operation_id(self): location = ("https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/" "providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320" "?api-version=2017-04-19") - operation_id = _cli_advisor_parse_operation_id(location) + operation_id = _parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') - def test__cli_advisor_parse_recommendation_uri(self): + def test__parse_recommendation_uri(self): recommendation_uri = ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" "/providers/Microsoft.Network/expressRouteCircuits/test/" "providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425" "/suppressions/5c9c3fce-c1b2-7e45-106c-152ce3c04be5") - result = _cli_advisor_parse_recommendation_uri(recommendation_uri) + result = _parse_recommendation_uri(recommendation_uri) self.assertEqual( - result['resourceUri'], + result['resource_uri'], ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" "/providers/Microsoft.Network/expressRouteCircuits/test")) - self.assertEqual(result['recommendationId'], 'c4deb869-ea38-f90d-331f-91770021d425') + self.assertEqual(result['recommendation_id'], 'c4deb869-ea38-f90d-331f-91770021d425') class AzureAdvisorLiveScenarioTest(LiveScenarioTest): @@ -74,78 +74,105 @@ def test_recommendations(self): checks=self.check("[0].category", 'Security')).get_output_in_json() # Set the recommendation details to use with further commands - # Ignore the first one since that is for the whole subscription - ids = _cli_advisor_parse_recommendation_uri(output[1]['id'])['resourceUri'] - name = output[1]['name'] - group = output[1]['resourceGroup'] + rec = output[0] + name = rec['name'] + recommendation_id = rec['id'] + resource_id = _parse_recommendation_uri(recommendation_id) self.kwargs.update({ - 'ids': ids, 'name': name, - 'group': group + 'recommendation_id': recommendation_id, + 'resource_id': resource_id }) # Disable with specified duration should create a suppression - self.cmd('advisor recommendation disable -n {name} -g {group} --days 1', - checks=[self.check("name", name), - self.check("resourceGroup", group), - self.exists("suppressionIds")]) + self.cmd('advisor recommendation disable --ids {recommendation_id} --days 1', + checks=[self.check("[0].id", recommendation_id), + self.exists("[0].suppressionIds")]) # Disable again should create another suppression - self.cmd('advisor recommendation disable -n {name} -g {group}', - checks=[self.check("name", name), - self.check("resourceGroup", group), - self.greater_than("length(suppressionIds)", 1)]) + self.cmd('advisor recommendation disable --ids {recommendation_id}', + checks=[self.check("[0].id", recommendation_id), + self.greater_than("length([0].suppressionIds)", 1)]) # Enable should remove all suppressions - self.cmd('advisor recommendation enable -n {name} -g {group}') - self.cmd('advisor recommendation list --ids {ids}', - checks=[self.check("[0].name", name), - self.check("[0].resourceGroup", group), + self.cmd('advisor recommendation enable --ids {recommendation_id}', + checks=[self.check("[0].id", recommendation_id), self.check("[0].suppressionIds", None)]) # Enable again should be a no op - self.cmd('advisor recommendation enable -n {name} -g {group}') - self.cmd('advisor recommendation list --ids {ids}', + self.cmd('advisor recommendation enable --ids {recommendation_id}', + checks=[self.check("[0].id", recommendation_id), + self.check("[0].suppressionIds", None)]) + + def test_recommendations_resource_group(self): + resource_group = 'AzExpertStg' + self.kwargs.update({ + 'resource_group': resource_group + }) + + # List should return at least one recommendation with filters + output = self.cmd('advisor recommendation list --resource-group {resource_group}', + checks=self.check("[0].resourceGroup", resource_group)).get_output_in_json() + + # Set the recommendation details to use with further commands + resource_id = _parse_recommendation_uri(output[0]['id'])['resource_uri'] + name = output[0]['name'] + self.kwargs.update({ + 'resource_id': resource_id, + 'name': name + }) + + # Disable with specified duration should create a suppression + self.cmd('advisor recommendation disable -n {name} -g {resource_group} --days 1', + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", resource_group), + self.exists("[0].suppressionIds")]) + + # Disable again should create another suppression + self.cmd('advisor recommendation disable -n {name} -g {resource_group}', checks=[self.check("[0].name", name), - self.check("[0].resourceGroup", group), + self.check("[0].resourceGroup", resource_group), + self.greater_than("length([0].suppressionIds)", 1)]) + + # Enable should remove all suppressions + self.cmd('advisor recommendation enable -n {name} -g {resource_group}', + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", resource_group), self.check("[0].suppressionIds", None)]) - # List should return at least one recommendation without any filters - self.cmd('advisor recommendation list --refresh', - checks=self.check("[?category=='Security'].category | [0]", 'Security')) + # Enable again should be a no op + self.cmd('advisor recommendation enable -n {name} -g {resource_group}', + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", resource_group), + self.check("[0].suppressionIds", None)]) class AzureAdvisorScenarioTest(ScenarioTest): def test_configurations_subscription(self): - subscriptionId = self.cmd('account show').get_output_in_json()['id'] - # Show should always return a default self.cmd('advisor configuration show', - checks=[self.check("name", subscriptionId)]) + checks=[self.check("type", "Microsoft.Advisor/Configurations")]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --low-cpu-threshold 15 --exclude') self.cmd('advisor configuration show', - checks=[self.check("name", subscriptionId), - self.check("properties.lowCpuThreshold", "15"), + checks=[self.check("properties.lowCpuThreshold", "15"), self.check("properties.exclude", True)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --low-cpu-threshold 5 --include') self.cmd('advisor configuration show', - checks=[self.check("name", subscriptionId), - self.check("properties.lowCpuThreshold", "5"), + checks=[self.check("properties.lowCpuThreshold", "5"), self.check("properties.exclude", False)]) # List should reflect the changes made by Update self.cmd('advisor configuration list', - checks=[self.check("[0].name", subscriptionId), - self.check("[0].properties.lowCpuThreshold", "5"), + checks=[self.check("[0].properties.lowCpuThreshold", "5"), self.check("[0].properties.exclude", False)]) @ResourceGroupPreparer(name_prefix='cli_test_advisor') - def test_configurations_subscription(self, resource_group): + def test_configurations_resource_group(self, resource_group): # Show should always return a default even for a brand new resource group self.cmd('advisor configuration show -g {rg}', checks=[self.check("resourceGroup", resource_group)]) From 05b6777caecc3a095f44724f7a19ef4ff5f2b8b5 Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Wed, 17 Jan 2018 16:42:22 -0800 Subject: [PATCH 10/22] Updates for GA release. --- .../azure-cli-advisor/HISTORY.rst | 6 +- .../cli/command_modules/advisor/_help.py | 2 +- .../test_generate_recommendations.yaml | 18 +++--- ...get_set_configurations_resource_group.yaml | 56 +++++++++---------- ...t_get_set_configurations_subscription.yaml | 36 ++++++------ .../azure-cli-advisor/setup.py | 4 +- 6 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/HISTORY.rst b/src/command_modules/azure-cli-advisor/HISTORY.rst index 969f96aabc8..2408b853487 100644 --- a/src/command_modules/azure-cli-advisor/HISTORY.rst +++ b/src/command_modules/azure-cli-advisor/HISTORY.rst @@ -3,9 +3,9 @@ Release History =============== -0.1.2 -+++++ -* Minor fixes. +1.0.0 +++++++ +* GA release. 0.1.1 ++++++ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index 856bf8b19a7..eb358d34c3b 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py @@ -7,7 +7,7 @@ helps['advisor'] = """ type: group - short-summary: (PREVIEW) Manage Azure Advisor. + short-summary: Manage Azure Advisor. """ helps['advisor configuration'] = """ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml index 85eccf2611d..d58f238cb67 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml @@ -8,8 +8,8 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations?api-version=2017-04-19 @@ -18,14 +18,14 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Mon, 11 Dec 2017 22:58:43 GMT'] + date: ['Thu, 18 Jan 2018 00:40:59 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/0dba36fb-1faf-41f6-a711-37b7f57a29bd?api-version=2017-04-19'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/6180573c-fbd7-45b8-88ef-32c7a8789d43?api-version=2017-04-19'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1196'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -35,16 +35,16 @@ interactions: CommandName: [advisor recommendation generate] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/0dba36fb-1faf-41f6-a711-37b7f57a29bd?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/6180573c-fbd7-45b8-88ef-32c7a8789d43?api-version=2017-04-19 response: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:43 GMT'] + date: ['Thu, 18 Jan 2018 00:40:59 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml index a58e2291dd7..2cbc895f5eb 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml @@ -8,9 +8,9 @@ interactions: Connection: [keep-alive] Content-Length: ['50'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 @@ -20,7 +20,7 @@ interactions: cache-control: [no-cache] content-length: ['328'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:45 GMT'] + date: ['Thu, 18 Jan 2018 00:41:01 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -34,18 +34,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:46 GMT'] + date: ['Thu, 18 Jan 2018 00:41:02 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -64,8 +64,8 @@ interactions: Connection: [keep-alive] Content-Length: ['33'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -73,7 +73,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:47 GMT'] + date: ['Thu, 18 Jan 2018 00:41:03 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -89,18 +89,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":true}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":true}}]}'} headers: cache-control: [no-cache] content-length: ['513'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:47 GMT'] + date: ['Thu, 18 Jan 2018 00:41:04 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -119,8 +119,8 @@ interactions: Connection: [keep-alive] Content-Length: ['34'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -128,7 +128,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:48 GMT'] + date: ['Thu, 18 Jan 2018 00:41:05 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -144,18 +144,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:49 GMT'] + date: ['Thu, 18 Jan 2018 00:41:07 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -174,9 +174,9 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.26] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 @@ -185,11 +185,11 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Mon, 11 Dec 2017 22:58:50 GMT'] + date: ['Thu, 18 Jan 2018 00:41:08 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkRRUlczT1FSM0RYVVRUQU9JWDQ3R0pNU1k3V3wxOEMxRjE5RjRFRDcyQTdDLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkVQQzVXNVlaUUU3U1hPUDI1N05KVFNFV1FKS3xDNzBFNzZERDJBNjBEMkZFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml index 61f086806eb..7e4258718b0 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml @@ -7,18 +7,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['1804'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:51 GMT'] + date: ['Thu, 18 Jan 2018 00:41:09 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -37,8 +37,8 @@ interactions: Connection: [keep-alive] Content-Length: ['43'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -46,7 +46,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:52 GMT'] + date: ['Thu, 18 Jan 2018 00:41:10 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -62,18 +62,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['1805'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:52 GMT'] + date: ['Thu, 18 Jan 2018 00:41:11 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -92,8 +92,8 @@ interactions: Connection: [keep-alive] Content-Length: ['42'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -101,7 +101,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:53 GMT'] + date: ['Thu, 18 Jan 2018 00:41:12 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -117,18 +117,18 @@ interactions: CommandName: [advisor configuration get] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.19 - msrest_azure/0.4.18 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.22] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisor3tc7naqncit26etevdevprlutrwgwqzpjs6slm5rhn2r3cjgdtszuz6xydf","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisorlepjmsh25motlwqzm2mjudwlcscnfv7mrjnxggtmdez5hcx64k55mrrf4ae","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot/providers/Microsoft.Advisor/configurations/0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","type":"Microsoft.Advisor/Configurations","name":"0b1f6471-1bf0-4dda-aec3-cb9272f09590-cli_test_advisordqrw3oqr3dxuttaoix47gjmsy7wbe3xftynrokgje65kc7kuturgcr5d2ot","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['1804'] content-type: [application/json; charset=utf-8] - date: ['Mon, 11 Dec 2017 22:58:53 GMT'] + date: ['Thu, 18 Jan 2018 00:41:13 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] diff --git a/src/command_modules/azure-cli-advisor/setup.py b/src/command_modules/azure-cli-advisor/setup.py index 3f01eae189b..2b305398b20 100644 --- a/src/command_modules/azure-cli-advisor/setup.py +++ b/src/command_modules/azure-cli-advisor/setup.py @@ -14,7 +14,7 @@ logger.warn("Wheel is not available, disabling bdist_wheel hook") cmdclass = {} -VERSION = "0.1.2" +VERSION = "1.0.0" # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers @@ -33,7 +33,7 @@ DEPENDENCIES = [ 'azure-cli-core', - 'azure-mgmt-advisor==0.1.0' + 'azure-mgmt-advisor==1.0.0' ] with open('README.rst', 'r', encoding='utf-8') as f: From fa156b83f3426e561fd8a7e9d187f9229bba3a4b Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Tue, 23 Jan 2018 14:41:45 -0800 Subject: [PATCH 11/22] Addressing PR feedback: - Removed 'recommendation generate' command and added a '--refresh' option to 'recommendation list' instead. - Renamed 'configuration get' to 'configuration list'. - Renamed 'configuration set' to 'configuration update'. - Test recording updates. --- .../cli/command_modules/advisor/_help.py | 13 +- .../cli/command_modules/advisor/_params.py | 12 +- .../command_modules/advisor/_validators.py | 5 + .../cli/command_modules/advisor/commands.py | 6 +- .../cli/command_modules/advisor/custom.py | 38 ++-- .../tests/latest/test_advisor_commands.py | 30 ++- ..._update_configurations_resource_group.yaml | 195 ++++++++++++++++++ ...st_update_configurations_subscription.yaml | 141 +++++++++++++ 8 files changed, 389 insertions(+), 51 deletions(-) create mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml create mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index eb358d34c3b..869efb040b1 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py @@ -20,19 +20,14 @@ short-summary: Review Azure Advisor recommendations. """ -helps['advisor configuration get'] = """ +helps['advisor configuration list'] = """ type: command - short-summary: Get Azure Advisor configuration. + short-summary: List Azure Advisor configuration. """ -helps['advisor configuration set'] = """ +helps['advisor configuration update'] = """ type: command - short-summary: Set Azure Advisor configuration. -""" - -helps['advisor recommendation generate'] = """ - type: command - short-summary: Generate Azure Advisor recommendations. + short-summary: Update Azure Advisor configuration. """ helps['advisor recommendation list'] = """ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py index aaee7e686f4..6b39d751700 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py @@ -7,7 +7,10 @@ from azure.cli.core.commands.parameters import get_enum_type -from ._validators import validate_include_or_exclude, validate_ids_or_resource_group +from ._validators import \ + (validate_include_or_exclude, + validate_ids_or_resource_group, + validate_threshold_or_resource_group) def load_arguments(self, _): @@ -19,6 +22,8 @@ def load_arguments(self, _): c.argument('ids', ids_arg_type, validator=validate_ids_or_resource_group) c.argument('category', options_list=['--category', '-c'], help='Name of recommendation category.', arg_type=get_enum_type(['Cost', 'HighAvailability', 'Performance', 'Security'])) + c.argument('refresh', options_list=['--refresh', '-e'], action='store_true', + help='Generate new recommendations.') with self.argument_context('advisor recommendation disable') as c: c.argument('ids', ids_arg_type) @@ -28,9 +33,10 @@ def load_arguments(self, _): with self.argument_context('advisor recommendation enable') as c: c.argument('ids', ids_arg_type) - with self.argument_context('advisor configuration set') as c: + with self.argument_context('advisor configuration update') as c: c.argument('low_cpu_threshold', options_list=['--low-cpu-threshold', '-l'], - help='Value for low CPU threshold.', arg_type=get_enum_type(['5', '10', '15', '20'])) + help='Value for low CPU threshold.', arg_type=get_enum_type(['5', '10', '15', '20']), + validator=validate_threshold_or_resource_group) c.argument('exclude', options_list=['--exclude', '-e'], action='store_true', help='Exclude from recommendation generation.') c.argument('include', options_list=['--include', '-i'], action='store_true', diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py index e2c697e076c..af7cc079cac 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py @@ -14,3 +14,8 @@ def validate_include_or_exclude(namespace): def validate_ids_or_resource_group(namespace): if namespace.ids and namespace.resource_group_name: raise CLIError('usage error: --ids | --resource-group') + + +def validate_threshold_or_resource_group(namespace): + if namespace.low_cpu_threshold and namespace.resource_group_name: + raise CLIError('usage error: --low-cpu-threshold | --resource-group') diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index 9ec5514805c..d414c3fcb52 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -12,8 +12,6 @@ def load_command_table(self, _): with self.command_group('advisor recommendation') as g: - g.custom_command('generate', 'cli_advisor_generate_recommendations', - client_factory=recommendations_mgmt_client_factory) g.custom_command('list', 'cli_advisor_list_recommendations', client_factory=recommendations_mgmt_client_factory) g.custom_command('disable', 'cli_advisor_disable_recommendations', @@ -22,5 +20,5 @@ def load_command_table(self, _): client_factory=advisor_mgmt_client_factory) with self.command_group('advisor configuration', client_factory=configurations_mgmt_client_factory) as g: - g.custom_command('get', 'cli_advisor_get_configurations') - g.custom_command('set', 'cli_advisor_set_configurations') + g.custom_command('list', 'cli_advisor_list_configurations') + g.custom_command('update', 'cli_advisor_update_configurations') diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index db17f05b583..218b3a5245f 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -10,21 +10,9 @@ from azure.mgmt.advisor.models import ConfigData, ConfigDataProperties -def cli_advisor_generate_recommendations(client): - response = client.generate(raw=True) - location = response.headers['Location'] - operation_id = parse_operation_id(location) - - try: - client.get_generate_status(operation_id=operation_id) - except CloudError as ex: - # Advisor API returns 204 which is not aligned with ARM guidelines - # so the SDK will throw an exception that we will have to ignore - if ex.status_code != 204: - raise ex - - -def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, category=None): +def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, category=None, refresh=None): + if refresh: + generate_recommendations(client) scope = build_filter_string(ids, resource_group_name, category) return client.list(scope) @@ -75,14 +63,14 @@ def cli_advisor_enable_recommendations(client, ids): return enabledRecs -def cli_advisor_get_configurations(client, resource_group_name=None): +def cli_advisor_list_configurations(client, resource_group_name=None): if resource_group_name: return client.list_by_resource_group(resource_group_name) return client.list_by_subscription() -def cli_advisor_set_configurations(client, resource_group_name=None, - low_cpu_threshold=None, exclude=None, include=None): +def cli_advisor_update_configurations(client, resource_group_name=None, + low_cpu_threshold=None, exclude=None, include=None): cfg = ConfigData() cfg.properties = ConfigDataProperties() @@ -133,3 +121,17 @@ def parse_recommendation_uri(recommendationUri): resourceUri = recommendationUri[:recommendationUri.find("/providers/Microsoft.Advisor/recommendations")] recommendationId = recommendationUri[recommendationUri.find("/recommendations/") + len('/recommendations/'):] return {'resourceUri': resourceUri, 'recommendationId': recommendationId} + + +def generate_recommendations(client): + response = client.generate(raw=True) + location = response.headers['Location'] + operation_id = parse_operation_id(location) + + try: + client.get_generate_status(operation_id=operation_id) + except CloudError as ex: + # Advisor API returns 204 which is not aligned with ARM guidelines + # so the SDK will throw an exception that we will have to ignore + if ex.status_code != 204: + raise ex diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py index 42f6a97d414..b95e66c8853 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py @@ -44,8 +44,7 @@ def test_parse_recommendation_uri(self): class AzureAdvisorLiveScenarioTest(LiveScenarioTest): def test_list_disable_enable_recommendations(self): - self.cmd('advisor recommendation generate') - output = self.cmd('advisor recommendation list').get_output_in_json() + output = self.cmd('advisor recommendation list --refresh').get_output_in_json() self.assertGreater(len(output), 1) output = self.cmd('advisor recommendation list --category cost').get_output_in_json() self.assertGreater(len(output), 0) @@ -65,33 +64,30 @@ def test_list_disable_enable_recommendations(self): class AzureAdvisorScenarioTest(ScenarioTest): - def test_generate_recommendations(self): - self.cmd('advisor recommendation generate') - - def test_get_set_configurations_subscription(self): - output = self.cmd('advisor configuration get').get_output_in_json() + def test_list_update_configurations_subscription(self): + output = self.cmd('advisor configuration list').get_output_in_json() self.assertGreater(len(output), 1) - self.cmd('advisor configuration set --low-cpu-threshold 20') - output = self.cmd('advisor configuration get').get_output_in_json() + self.cmd('advisor configuration update --low-cpu-threshold 20') + output = self.cmd('advisor configuration list').get_output_in_json() for entry in output['value']: if entry['properties']['lowCpuThreshold']: self.assertEqual(entry['properties']['lowCpuThreshold'], '20') - self.cmd('advisor configuration set --low-cpu-threshold 5') - output = self.cmd('advisor configuration get').get_output_in_json() + self.cmd('advisor configuration update --low-cpu-threshold 5') + output = self.cmd('advisor configuration list').get_output_in_json() for entry in output['value']: if entry['properties']['lowCpuThreshold']: self.assertEqual(entry['properties']['lowCpuThreshold'], '5') @ResourceGroupPreparer(name_prefix='cli_test_advisor') - def test_get_set_configurations_resource_group(self, resource_group): - output = self.cmd('advisor configuration get --resource-group {rg}').get_output_in_json() + def test_list_update_configurations_resource_group(self, resource_group): + output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() self.assertGreater(len(output), 0) - self.cmd('advisor configuration set --exclude --resource-group {rg}') - output = self.cmd('advisor configuration get --resource-group {rg}').get_output_in_json() + self.cmd('advisor configuration update --exclude --resource-group {rg}') + output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() self.assertGreater(len(output), 0) self.assertTrue(output['value'][0]['properties']['exclude']) - self.cmd('advisor configuration set --include --resource-group {rg}') - output = self.cmd('advisor configuration get --resource-group {rg}').get_output_in_json() + self.cmd('advisor configuration update --include --resource-group {rg}') + output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() self.assertGreater(len(output), 0) self.assertTrue(not output['value'][0]['properties']['exclude']) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml new file mode 100644 index 00000000000..d5f26ca2567 --- /dev/null +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml @@ -0,0 +1,195 @@ +interactions: +- request: + body: '{"location": "westus", "tags": {"use": "az-test"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [group create] + Connection: [keep-alive] + Content-Length: ['50'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.26] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + response: + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + headers: + cache-control: [no-cache] + content-length: ['328'] + content-type: [application/json; charset=utf-8] + date: ['Tue, 23 Jan 2018 22:37:47 GMT'] + expires: ['-1'] + pragma: [no-cache] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] + status: {code: 201, message: Created} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration list] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Tue, 23 Jan 2018 22:37:48 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: '{"properties": {"exclude": true}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['33'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Tue, 23 Jan 2018 22:37:49 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration list] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + headers: + cache-control: [no-cache] + content-length: ['513'] + content-type: [application/json; charset=utf-8] + date: ['Tue, 23 Jan 2018 22:37:51 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: '{"properties": {"exclude": false}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['34'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Tue, 23 Jan 2018 22:37:51 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration list] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Tue, 23 Jan 2018 22:37:53 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [group delete] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.26] + accept-language: [en-US] + method: DELETE + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + content-length: ['0'] + date: ['Tue, 23 Jan 2018 22:37:53 GMT'] + expires: ['-1'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUk9NVFUyVkJXUDZZRkFLQ0tCVFJGVUZJNkJZQnxDRUUxOUM4OTVDQ0Y2MENDLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + pragma: [no-cache] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] + status: {code: 202, message: Accepted} +version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml new file mode 100644 index 00000000000..8cbaf867d4e --- /dev/null +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml @@ -0,0 +1,141 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration list] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['1756'] + content-type: [application/json; charset=utf-8] + date: ['Tue, 23 Jan 2018 22:37:54 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: '{"properties": {"low_cpu_threshold": "20"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['43'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Tue, 23 Jan 2018 22:37:56 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration list] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['1757'] + content-type: [application/json; charset=utf-8] + date: ['Tue, 23 Jan 2018 22:37:57 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: '{"properties": {"low_cpu_threshold": "5"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['42'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Tue, 23 Jan 2018 22:37:58 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration list] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['1756'] + content-type: [application/json; charset=utf-8] + date: ['Tue, 23 Jan 2018 22:37:59 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +version: 1 From bd00ec35966eaf1450dd9bfb1c6fdc8657552ca8 Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Tue, 23 Jan 2018 16:02:06 -0800 Subject: [PATCH 12/22] Update history with details of the changes. --- src/command_modules/azure-cli-advisor/HISTORY.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/command_modules/azure-cli-advisor/HISTORY.rst b/src/command_modules/azure-cli-advisor/HISTORY.rst index 2408b853487..ee8b884c84f 100644 --- a/src/command_modules/azure-cli-advisor/HISTORY.rst +++ b/src/command_modules/azure-cli-advisor/HISTORY.rst @@ -3,9 +3,13 @@ Release History =============== -1.0.0 +2.0.0 ++++++ * GA release. +* BC: `advisor configuration get` has been renamed to `advisor configuration list`. +* BC: `advisor configuration set` has been renamed to `advisor configuration update`. +* BC: `advisor recommendation generate` has been removed. +* `advisor recommendation list` has a new --refresh parameter. 0.1.1 ++++++ From 19d3771cd36ba6827d78c9fa2ade3295dff08a6f Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Fri, 9 Feb 2018 13:56:03 -0800 Subject: [PATCH 13/22] Adding generic update and show command. --- .../advisor/_client_factory.py | 14 +- .../cli/command_modules/advisor/_params.py | 14 +- .../cli/command_modules/advisor/commands.py | 14 +- .../cli/command_modules/advisor/custom.py | 155 ++++++++++++------ 4 files changed, 132 insertions(+), 65 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py index cb70b508dac..20922d39d1f 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py @@ -10,17 +10,17 @@ def cf_advisor(cli_ctx, **_): return get_mgmt_service_client(cli_ctx, AdvisorManagementClient) -def advisor_mgmt_client_factory(cli_ctx, kwargs): +def advisor_mgmt_client_factory(cli_ctx, **kwargs): return cf_advisor(cli_ctx, **kwargs) -def recommendations_mgmt_client_factory(cli_ctx, kwargs): - return cf_advisor(cli_ctx, **kwargs).recommendations +def recommendations_mgmt_client_factory(cli_ctx, _): + return cf_advisor(cli_ctx).recommendations -def suppressions_mgmt_client_factory(cli_ctx, kwargs): - return cf_advisor(cli_ctx, **kwargs).suppressions +def suppressions_mgmt_client_factory(cli_ctx, _): + return cf_advisor(cli_ctx).suppressions -def configurations_mgmt_client_factory(cli_ctx, kwargs): - return cf_advisor(cli_ctx, **kwargs).configurations +def configurations_mgmt_client_factory(cli_ctx, _): + return cf_advisor(cli_ctx).configurations diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py index 6b39d751700..d5d0da9aa10 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py @@ -5,7 +5,9 @@ from knack.arguments import CLIArgumentType -from azure.cli.core.commands.parameters import get_enum_type +from azure.cli.core.commands.parameters import \ + (get_enum_type, + get_resource_name_completion_list) from ._validators import \ (validate_include_or_exclude, @@ -18,20 +20,24 @@ def load_arguments(self, _): help='One or more resource IDs (space-delimited). If provided, no other ' '"Resource Id" arguments should be specified.') + name_arg_type = CLIArgumentType(options_list=['--name', '-n'], id_part='name', + help='The name of the recommendation as output by the list command.', + completer=get_resource_name_completion_list('Microsoft.Advisor/recommendations')) + with self.argument_context('advisor recommendation list') as c: c.argument('ids', ids_arg_type, validator=validate_ids_or_resource_group) c.argument('category', options_list=['--category', '-c'], help='Name of recommendation category.', arg_type=get_enum_type(['Cost', 'HighAvailability', 'Performance', 'Security'])) - c.argument('refresh', options_list=['--refresh', '-e'], action='store_true', + c.argument('refresh', options_list=['--refresh', '-r'], action='store_true', help='Generate new recommendations.') with self.argument_context('advisor recommendation disable') as c: - c.argument('ids', ids_arg_type) + c.argument('recommendation_name', name_arg_type) c.argument('days', options_list=['--days', '-d'], type=int, help='Number of days to disable. If not specified, the recommendation is disabled forever.') with self.argument_context('advisor recommendation enable') as c: - c.argument('ids', ids_arg_type) + c.argument('recommendation_name', name_arg_type) with self.argument_context('advisor configuration update') as c: c.argument('low_cpu_threshold', options_list=['--low-cpu-threshold', '-l'], diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index d414c3fcb52..b92fe757b80 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -11,14 +11,24 @@ def load_command_table(self, _): + from azure.cli.core.commands import CliCommandType + advisor_custom = CliCommandType(operations_tmpl='azure.cli.command_modules.advisor.custom#{}') + with self.command_group('advisor recommendation') as g: g.custom_command('list', 'cli_advisor_list_recommendations', client_factory=recommendations_mgmt_client_factory) g.custom_command('disable', 'cli_advisor_disable_recommendations', - client_factory=suppressions_mgmt_client_factory) + client_factory=advisor_mgmt_client_factory) g.custom_command('enable', 'cli_advisor_enable_recommendations', client_factory=advisor_mgmt_client_factory) with self.command_group('advisor configuration', client_factory=configurations_mgmt_client_factory) as g: g.custom_command('list', 'cli_advisor_list_configurations') - g.custom_command('update', 'cli_advisor_update_configurations') + g.custom_command('show', 'cli_advisor_show_configuration') + g.generic_update_command('update', + getter_name='cli_advisor_show_configuration', + getter_type=advisor_custom, + setter_name='_cli_advisor_set_configuration', + setter_type=advisor_custom, + custom_func_name='cli_advisor_update_configurations', + custom_func_type=advisor_custom) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index 218b3a5245f..a606b512976 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -10,82 +10,133 @@ from azure.mgmt.advisor.models import ConfigData, ConfigDataProperties -def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, category=None, refresh=None): +def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, + category=None, refresh=None): if refresh: generate_recommendations(client) scope = build_filter_string(ids, resource_group_name, category) return client.list(scope) -def cli_advisor_disable_recommendations(client, ids, days=None): - suppressions = [] - suppressionName = str(uuid.uuid4()) - for id_arg in ids: - result = parse_recommendation_uri(id_arg) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] - ttl = '{}:00:00:00'.format(days) if days else '' - client.create( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName, - ttl=ttl - ) - suppressions.append(client.get( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName - )) +def cli_advisor_disable_recommendations(client, resource_group_name=None, + recommendation_name=None, days=None): + if recommendation_name: + recs = cli_advisor_list_recommendations( + client=client.recommendations, + resource_group_name=resource_group_name) + rec = next(r for r in recs if r.name == recommendation_name) + suppressions.append( + create_suppression( + client.suppressions, + rec.id, + days)) + +# if ids: +# for id_arg in ids: +# suppressions.append(create_suppression(client.suppressions, id_arg, days)) + return suppressions -def cli_advisor_enable_recommendations(client, ids): +def cli_advisor_enable_recommendations(client, ids=None, resource_group_name=None, recommendation_name=None): enabledRecs = [] allSups = list(client.suppressions.list()) - for id_arg in ids: - result = parse_recommendation_uri(id_arg) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] + + if recommendation_name: recs = cli_advisor_list_recommendations( - client=client.recommendations, - ids=[resourceUri] - ) - rec = next(x for x in recs if x.name == recommendationId) - matches = [x for x in allSups if x.suppression_id in rec.suppression_ids] - for match in matches: - client.suppressions.delete( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=match.name + client=client.recommendations, + resource_group_name=resource_group_name) + enabledRecs.append( + remove_suppressions( + client.suppressions, + recommendations=recs, + recommendation_name=recommendation_name, + suppressions=allSups)) + + if ids: + for id_arg in ids: + result = parse_recommendation_uri(id_arg) + resourceUri = result['resourceUri'] + recommendationId = result['recommendationId'] + recs = cli_advisor_list_recommendations( + client=client.recommendations, + ids=[resourceUri] ) - rec.suppression_ids = None - enabledRecs.append(rec) - return enabledRecs + enabledRecs.append( + remove_suppressions( + client.suppressions, + recommendations=recs, + recommendation_name=recommendationId, + suppressions=allSups)) + return enabledRecs -def cli_advisor_list_configurations(client, resource_group_name=None): - if resource_group_name: - return client.list_by_resource_group(resource_group_name) - return client.list_by_subscription() +def cli_advisor_list_configurations(client): + return client.list_by_subscription().value -def cli_advisor_update_configurations(client, resource_group_name=None, - low_cpu_threshold=None, exclude=None, include=None): - cfg = ConfigData() - cfg.properties = ConfigDataProperties() +def cli_advisor_show_configuration(client, resource_group_name=None): + # check for null and zero value + if resource_group_name: + return client.list_by_resource_group(resource_group_name).value[0] + return client.list_by_subscription().value[0] - cfg.properties.low_cpu_threshold = low_cpu_threshold - cfg.properties.exclude = exclude - if include: - cfg.properties.exclude = False +def _cli_advisor_set_configuration(client, resource_group_name=None, parameters=None): if resource_group_name: return client.create_in_resource_group( - config_contract=cfg, + config_contract=parameters, resource_group=resource_group_name) - return client.create_in_subscription(cfg) + return client.create_in_subscription(parameters) + + +def cli_advisor_update_configurations(instance, resource_group_name=None, + low_cpu_threshold=None, exclude=None, include=None): + + instance.properties.low_cpu_threshold = low_cpu_threshold + instance.properties.exclude = exclude + if include: + instance.properties.exclude = False + + return instance + + +def create_suppression(client, recommendation_uri, days=None): + suppressionName = str(uuid.uuid4()) + ttl = '{}:00:00:00'.format(days) if days else '' + + result = parse_recommendation_uri(recommendation_uri) + resourceUri = result['resourceUri'] + recommendationId = result['recommendationId'] + + client.create( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName, + ttl=ttl + ) + + return client.get( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName + ) + + +def remove_suppressions(client, recommendations, recommendation_name, suppressions): + rec = next(x for x in recommendations if x.name == recommendation_name) + + matches = [x for x in suppressions if x.suppression_id in rec.suppression_ids] + for match in matches: + client.delete( + resource_uri=parse_recommendation_uri(rec.id)['resourceUri'], + recommendation_id=recommendation_name, + name=match.name + ) + rec.suppression_ids = None + return rec def build_filter_string(ids=None, resource_group_name=None, category=None): From 1e4e7230a7b38888d6b519cfa3babc7fa8c4137a Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Tue, 13 Feb 2018 09:46:02 -0800 Subject: [PATCH 14/22] Addressing review feedback. --- .../azure-cli-advisor/HISTORY.rst | 4 +- .../cli/command_modules/advisor/_help.py | 7 +- .../cli/command_modules/advisor/commands.py | 13 +- .../cli/command_modules/advisor/custom.py | 180 +++++++----------- .../tests/latest/test_advisor_commands.py | 22 +-- 5 files changed, 96 insertions(+), 130 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/HISTORY.rst b/src/command_modules/azure-cli-advisor/HISTORY.rst index ee8b884c84f..0da76642809 100644 --- a/src/command_modules/azure-cli-advisor/HISTORY.rst +++ b/src/command_modules/azure-cli-advisor/HISTORY.rst @@ -3,13 +3,13 @@ Release History =============== -2.0.0 +0.5.0 ++++++ -* GA release. * BC: `advisor configuration get` has been renamed to `advisor configuration list`. * BC: `advisor configuration set` has been renamed to `advisor configuration update`. * BC: `advisor recommendation generate` has been removed. * `advisor recommendation list` has a new --refresh parameter. +* `advisor recommendation show` has been added. 0.1.1 ++++++ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index 869efb040b1..1447917f977 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py @@ -22,7 +22,12 @@ helps['advisor configuration list'] = """ type: command - short-summary: List Azure Advisor configuration. + short-summary: List Azure Advisor configuration for the entire subscription. +""" + +helps['advisor configuration show'] = """ + type: command + short-summary: Show Azure Advisor configuration for the given subscription or resource group. """ helps['advisor configuration update'] = """ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index b92fe757b80..0a03435dc28 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -6,7 +6,6 @@ from azure.cli.command_modules.advisor._client_factory import \ (advisor_mgmt_client_factory, recommendations_mgmt_client_factory, - suppressions_mgmt_client_factory, configurations_mgmt_client_factory) @@ -26,9 +25,9 @@ def load_command_table(self, _): g.custom_command('list', 'cli_advisor_list_configurations') g.custom_command('show', 'cli_advisor_show_configuration') g.generic_update_command('update', - getter_name='cli_advisor_show_configuration', - getter_type=advisor_custom, - setter_name='_cli_advisor_set_configuration', - setter_type=advisor_custom, - custom_func_name='cli_advisor_update_configurations', - custom_func_type=advisor_custom) + getter_name='cli_advisor_show_configuration', + getter_type=advisor_custom, + setter_name='_cli_advisor_set_configuration', + setter_type=advisor_custom, + custom_func_name='cli_advisor_update_configurations', + custom_func_type=advisor_custom) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index a606b512976..9cb068b5993 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -4,97 +4,84 @@ # -------------------------------------------------------------------------------------------- import uuid - -from msrestazure.azure_exceptions import CloudError - -from azure.mgmt.advisor.models import ConfigData, ConfigDataProperties +from knack.util import CLIError def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, category=None, refresh=None): if refresh: - generate_recommendations(client) - scope = build_filter_string(ids, resource_group_name, category) + _cli_advisor_generate_recommendations(client) + scope = _cli_advisor_build_filter_string(ids, resource_group_name, category) return client.list(scope) -def cli_advisor_disable_recommendations(client, resource_group_name=None, - recommendation_name=None, days=None): - if recommendation_name: - recs = cli_advisor_list_recommendations( - client=client.recommendations, - resource_group_name=resource_group_name) - rec = next(r for r in recs if r.name == recommendation_name) - suppressions.append( - create_suppression( - client.suppressions, - rec.id, - days)) +def cli_advisor_disable_recommendations(client, resource_group_name, + recommendation_name, days=None): + recs = cli_advisor_list_recommendations( + client=client.recommendations, + resource_group_name=resource_group_name) + rec = next((r for r in recs if r.name == recommendation_name), None) -# if ids: -# for id_arg in ids: -# suppressions.append(create_suppression(client.suppressions, id_arg, days)) + if rec: + suppressionName = str(uuid.uuid4()) + ttl = '{}:00:00:00'.format(days) if days else '' - return suppressions + result = _cli_advisor_parse_recommendation_uri(rec.id) + resourceUri = result['resourceUri'] + recommendationId = result['recommendationId'] + client.suppressions.create( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName, + ttl=ttl + ) -def cli_advisor_enable_recommendations(client, ids=None, resource_group_name=None, recommendation_name=None): - enabledRecs = [] - allSups = list(client.suppressions.list()) + # return recommendation object for consistency with enable + return client.suppressions.get( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName + ) - if recommendation_name: - recs = cli_advisor_list_recommendations( - client=client.recommendations, - resource_group_name=resource_group_name) - enabledRecs.append( - remove_suppressions( - client.suppressions, - recommendations=recs, - recommendation_name=recommendation_name, - suppressions=allSups)) + raise CLIError( + "Recommendation with name '{recommendation_name}' in resource group '{resource_group_name}' not found") - if ids: - for id_arg in ids: - result = parse_recommendation_uri(id_arg) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] - recs = cli_advisor_list_recommendations( - client=client.recommendations, - ids=[resourceUri] + +def cli_advisor_enable_recommendations(client, resource_group_name, recommendation_name): + allSups = list(client.suppressions.list()) + + recs = cli_advisor_list_recommendations( + client=client.recommendations, + resource_group_name=resource_group_name) + rec = next((r for r in recs if r.name == recommendation_name), None) + if rec: + matches = [x for x in allSups if x.suppression_id in rec.suppression_ids] + for match in matches: + client.suppressions.delete( + resource_uri=_cli_advisor_parse_recommendation_uri(rec.id)['resourceUri'], + recommendation_id=recommendation_name, + name=match.name ) - enabledRecs.append( - remove_suppressions( - client.suppressions, - recommendations=recs, - recommendation_name=recommendationId, - suppressions=allSups)) + rec.suppression_ids = None + return rec - return enabledRecs + raise CLIError( + "Recommendation with name '{recommendation_name}' in resource group '{resource_group_name}' not found") def cli_advisor_list_configurations(client): - return client.list_by_subscription().value + return client.list_by_subscription() def cli_advisor_show_configuration(client, resource_group_name=None): - # check for null and zero value if resource_group_name: - return client.list_by_resource_group(resource_group_name).value[0] - return client.list_by_subscription().value[0] - - -def _cli_advisor_set_configuration(client, resource_group_name=None, parameters=None): - if resource_group_name: - return client.create_in_resource_group( - config_contract=parameters, - resource_group=resource_group_name) - - return client.create_in_subscription(parameters) - + return client.list_by_resource_group(resource_group_name) + return client.list_by_subscription()[0] -def cli_advisor_update_configurations(instance, resource_group_name=None, - low_cpu_threshold=None, exclude=None, include=None): +def cli_advisor_update_configurations(instance, low_cpu_threshold=None, + exclude=None, include=None): instance.properties.low_cpu_threshold = low_cpu_threshold instance.properties.exclude = exclude if include: @@ -103,55 +90,19 @@ def cli_advisor_update_configurations(instance, resource_group_name=None, return instance -def create_suppression(client, recommendation_uri, days=None): - suppressionName = str(uuid.uuid4()) - ttl = '{}:00:00:00'.format(days) if days else '' - - result = parse_recommendation_uri(recommendation_uri) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] - - client.create( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName, - ttl=ttl - ) - - return client.get( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName - ) - - -def remove_suppressions(client, recommendations, recommendation_name, suppressions): - rec = next(x for x in recommendations if x.name == recommendation_name) - - matches = [x for x in suppressions if x.suppression_id in rec.suppression_ids] - for match in matches: - client.delete( - resource_uri=parse_recommendation_uri(rec.id)['resourceUri'], - recommendation_id=recommendation_name, - name=match.name - ) - rec.suppression_ids = None - return rec - - -def build_filter_string(ids=None, resource_group_name=None, category=None): +def _cli_advisor_build_filter_string(ids=None, resource_group_name=None, category=None): idFilter = None if ids: idFilter = ' or '.join(["ResourceId eq '{}'".format(id_arg) for id_arg in ids]) elif resource_group_name: - idFilter = "ResourceGroup eq '{}'".format(resource_group_name) + idFilter = "ResourceGroup eq '{resource_group_name}'" categoryFilter = "Category eq '{}'".format(category) if category else None if idFilter: if categoryFilter: - return '({}) and {}'.format(idFilter, categoryFilter) + return '({idFilter}) and {categoryFilter}' return idFilter elif categoryFilter: return categoryFilter @@ -159,7 +110,7 @@ def build_filter_string(ids=None, resource_group_name=None, category=None): return None -def parse_operation_id(location): +def _cli_advisor_parse_operation_id(location): # extract the operation ID from the Location header # it is a GUID (i.e. a string of length 36) immediately preceding the api-version query parameter end = location.find('?api-version') @@ -168,16 +119,18 @@ def parse_operation_id(location): return operation_id -def parse_recommendation_uri(recommendationUri): +def _cli_advisor_parse_recommendation_uri(recommendationUri): resourceUri = recommendationUri[:recommendationUri.find("/providers/Microsoft.Advisor/recommendations")] recommendationId = recommendationUri[recommendationUri.find("/recommendations/") + len('/recommendations/'):] return {'resourceUri': resourceUri, 'recommendationId': recommendationId} -def generate_recommendations(client): +def _cli_advisor_generate_recommendations(client): + from msrestazure.azure_exceptions import CloudError + response = client.generate(raw=True) location = response.headers['Location'] - operation_id = parse_operation_id(location) + operation_id = _cli_advisor_parse_operation_id(location) try: client.get_generate_status(operation_id=operation_id) @@ -186,3 +139,12 @@ def generate_recommendations(client): # so the SDK will throw an exception that we will have to ignore if ex.status_code != 204: raise ex + + +def _cli_advisor_set_configuration(client, resource_group_name=None, parameters=None): + if resource_group_name: + return client.create_in_resource_group( + config_contract=parameters, + resource_group=resource_group_name) + + return client.create_in_subscription(parameters) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py index b95e66c8853..b83555f2f06 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py @@ -7,7 +7,7 @@ from azure.cli.testsdk import LiveScenarioTest, ScenarioTest, ResourceGroupPreparer -from azure.cli.command_modules.advisor.custom import build_filter_string, parse_operation_id, parse_recommendation_uri +from azure.cli.command_modules.advisor.custom import _cli_advisor_build_filter_string, _cli_advisor_parse_operation_id, _cli_advisor_parse_recommendation_uri # pylint: disable=line-too-long @@ -19,21 +19,21 @@ def test_build_filter(self): resource_group_name = 'r' category = 'cost' - self.assertEqual(build_filter_string(), None) - self.assertEqual(build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") - self.assertEqual(build_filter_string(resource_group_name=resource_group_name), "ResourceGroup eq 'r'") - self.assertEqual(build_filter_string(category=category), "Category eq 'cost'") - self.assertEqual(build_filter_string(ids=ids, category=category), "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") - self.assertEqual(build_filter_string(resource_group_name=resource_group_name, category=category), "(ResourceGroup eq 'r') and Category eq 'cost'") + self.assertEqual(_cli_advisor_build_filter_string(), None) + self.assertEqual(_cli_advisor_build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") + self.assertEqual(_cli_advisor_build_filter_string(resource_group_name=resource_group_name), "ResourceGroup eq 'r'") + self.assertEqual(_cli_advisor_build_filter_string(category=category), "Category eq 'cost'") + self.assertEqual(_cli_advisor_build_filter_string(ids=ids, category=category), "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") + self.assertEqual(_cli_advisor_build_filter_string(resource_group_name=resource_group_name, category=category), "(ResourceGroup eq 'r') and Category eq 'cost'") - def test_parse_operation_id(self): + def test__cli_advisor_parse_operation_id(self): location = 'https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320?api-version=2017-04-19' - operation_id = parse_operation_id(location) + operation_id = _cli_advisor_parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') - def test_parse_recommendation_uri(self): + def test__cli_advisor_parse_recommendation_uri(self): recommendation_uri = '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test/providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425' - result = parse_recommendation_uri(recommendation_uri) + result = _cli_advisor_parse_recommendation_uri(recommendation_uri) self.assertEqual( result['resourceUri'], '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test' From 5484ea9deb290dea7c334f43e37995bf0969db5f Mon Sep 17 00:00:00 2001 From: Prasanna Padmanabhan Date: Tue, 13 Feb 2018 11:28:07 -0800 Subject: [PATCH 15/22] Update SDK package version. --- src/command_modules/azure-cli-advisor/setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/setup.py b/src/command_modules/azure-cli-advisor/setup.py index 2b305398b20..62139f3ab8b 100644 --- a/src/command_modules/azure-cli-advisor/setup.py +++ b/src/command_modules/azure-cli-advisor/setup.py @@ -14,7 +14,7 @@ logger.warn("Wheel is not available, disabling bdist_wheel hook") cmdclass = {} -VERSION = "1.0.0" +VERSION = "0.5.0" # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers @@ -33,7 +33,7 @@ DEPENDENCIES = [ 'azure-cli-core', - 'azure-mgmt-advisor==1.0.0' + 'azure-mgmt-advisor==1.0.1' ] with open('README.rst', 'r', encoding='utf-8') as f: From 917d3c743e800c818bee71284a5e3bd3484367ce Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Thu, 15 Feb 2018 18:29:42 -0800 Subject: [PATCH 16/22] Addressing review feedback. --- .../advisor/_client_factory.py | 4 +- .../cli/command_modules/advisor/_help.py | 7 + .../cli/command_modules/advisor/_params.py | 2 +- .../cli/command_modules/advisor/commands.py | 4 +- .../cli/command_modules/advisor/custom.py | 84 +++-- .../test_configurations_subscription.yaml | 329 ++++++++++++++++++ ...get_set_configurations_resource_group.yaml | 195 ----------- ...t_list_disable_enable_recommendations.yaml | 267 -------------- .../tests/latest/test_advisor_commands.py | 175 +++++++--- 9 files changed, 514 insertions(+), 553 deletions(-) create mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_list_disable_enable_recommendations.yaml diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py index 20922d39d1f..8481014d4e2 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_client_factory.py @@ -10,8 +10,8 @@ def cf_advisor(cli_ctx, **_): return get_mgmt_service_client(cli_ctx, AdvisorManagementClient) -def advisor_mgmt_client_factory(cli_ctx, **kwargs): - return cf_advisor(cli_ctx, **kwargs) +def advisor_mgmt_client_factory(cli_ctx, _): + return cf_advisor(cli_ctx) def recommendations_mgmt_client_factory(cli_ctx, _): diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index 1447917f977..d5e353136db 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py @@ -33,6 +33,13 @@ helps['advisor configuration update'] = """ type: command short-summary: Update Azure Advisor configuration. + examples: + - name: Update low CPU threshold for a given subscription to 20%. + text: > + az advisor configuration update -l 20 + - name: Exclude a given resource group from recommendation generation. + text: > + az advisor configuration update -g myRG -e """ helps['advisor recommendation list'] = """ diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py index d5d0da9aa10..50a69e42a79 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py @@ -20,7 +20,7 @@ def load_arguments(self, _): help='One or more resource IDs (space-delimited). If provided, no other ' '"Resource Id" arguments should be specified.') - name_arg_type = CLIArgumentType(options_list=['--name', '-n'], id_part='name', + name_arg_type = CLIArgumentType(options_list=['--name', '-n'], id_part='child_name_1', help='The name of the recommendation as output by the list command.', completer=get_resource_name_completion_list('Microsoft.Advisor/recommendations')) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index 0a03435dc28..e7ad86e9080 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -22,12 +22,12 @@ def load_command_table(self, _): client_factory=advisor_mgmt_client_factory) with self.command_group('advisor configuration', client_factory=configurations_mgmt_client_factory) as g: - g.custom_command('list', 'cli_advisor_list_configurations') + g.custom_command('list', 'cli_advisor_list_configuration') g.custom_command('show', 'cli_advisor_show_configuration') g.generic_update_command('update', getter_name='cli_advisor_show_configuration', getter_type=advisor_custom, setter_name='_cli_advisor_set_configuration', setter_type=advisor_custom, - custom_func_name='cli_advisor_update_configurations', + custom_func_name='cli_advisor_update_configuration', custom_func_type=advisor_custom) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index 9cb068b5993..1b5bc75a102 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -22,30 +22,32 @@ def cli_advisor_disable_recommendations(client, resource_group_name, resource_group_name=resource_group_name) rec = next((r for r in recs if r.name == recommendation_name), None) - if rec: - suppressionName = str(uuid.uuid4()) - ttl = '{}:00:00:00'.format(days) if days else '' + if not rec: + raise CLIError( + "Recommendation with name {} in resource group {} not found".format( + recommendation_name, + resource_group_name)) + + suppressionName = str(uuid.uuid4()) + ttl = '{}:00:00:00'.format(days) if days else '' - result = _cli_advisor_parse_recommendation_uri(rec.id) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] + result = _cli_advisor_parse_recommendation_uri(rec.id) + resourceUri = result['resourceUri'] + recommendationId = result['recommendationId'] - client.suppressions.create( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName, - ttl=ttl - ) + sup = client.suppressions.create( + resource_uri=resourceUri, + recommendation_id=recommendationId, + name=suppressionName, + ttl=ttl + ) - # return recommendation object for consistency with enable - return client.suppressions.get( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName - ) + if rec.suppression_ids: + rec.suppression_ids.append(sup.suppression_id) + else: + rec.suppression_ids = [sup.suppression_id] - raise CLIError( - "Recommendation with name '{recommendation_name}' in resource group '{resource_group_name}' not found") + return rec def cli_advisor_enable_recommendations(client, resource_group_name, recommendation_name): @@ -55,33 +57,44 @@ def cli_advisor_enable_recommendations(client, resource_group_name, recommendati client=client.recommendations, resource_group_name=resource_group_name) rec = next((r for r in recs if r.name == recommendation_name), None) + if rec: matches = [x for x in allSups if x.suppression_id in rec.suppression_ids] + else: + matches = [s for s in allSups if 'Microsoft.Advisor/recommendations/{}'.format(recommendation_name) in s.id] + + if matches: for match in matches: + result = _cli_advisor_parse_recommendation_uri(match.id) client.suppressions.delete( - resource_uri=_cli_advisor_parse_recommendation_uri(rec.id)['resourceUri'], - recommendation_id=recommendation_name, + resource_uri=result['resourceUri'], + recommendation_id=result['recommendationId'], name=match.name ) - rec.suppression_ids = None - return rec - raise CLIError( - "Recommendation with name '{recommendation_name}' in resource group '{resource_group_name}' not found") + rec = cli_advisor_list_recommendations( + client=client.recommendations, + ids=result['resourceUri']) + + return rec -def cli_advisor_list_configurations(client): +def cli_advisor_list_configuration(client): return client.list_by_subscription() def cli_advisor_show_configuration(client, resource_group_name=None): + output = None if resource_group_name: - return client.list_by_resource_group(resource_group_name) - return client.list_by_subscription()[0] + output = client.list_by_resource_group(resource_group_name) + else: + output = client.list_by_subscription() + # the list is guaranteed to have one element + return list(output)[0] -def cli_advisor_update_configurations(instance, low_cpu_threshold=None, - exclude=None, include=None): +def cli_advisor_update_configuration(instance, low_cpu_threshold=None, + exclude=None, include=None): instance.properties.low_cpu_threshold = low_cpu_threshold instance.properties.exclude = exclude if include: @@ -96,13 +109,13 @@ def _cli_advisor_build_filter_string(ids=None, resource_group_name=None, categor if ids: idFilter = ' or '.join(["ResourceId eq '{}'".format(id_arg) for id_arg in ids]) elif resource_group_name: - idFilter = "ResourceGroup eq '{resource_group_name}'" + idFilter = "ResourceGroup eq '{}'".format(resource_group_name) categoryFilter = "Category eq '{}'".format(category) if category else None if idFilter: if categoryFilter: - return '({idFilter}) and {categoryFilter}' + return '({}) and {}'.format(idFilter, categoryFilter) return idFilter elif categoryFilter: return categoryFilter @@ -121,7 +134,10 @@ def _cli_advisor_parse_operation_id(location): def _cli_advisor_parse_recommendation_uri(recommendationUri): resourceUri = recommendationUri[:recommendationUri.find("/providers/Microsoft.Advisor/recommendations")] - recommendationId = recommendationUri[recommendationUri.find("/recommendations/") + len('/recommendations/'):] + rStart = recommendationUri.find("/recommendations/") + len('/recommendations/') + # recommendation ID is a GUID (i.e. a string of length 36) + rEnd = rStart + 36 + recommendationId = recommendationUri[rStart:rEnd] return {'resourceUri': resourceUri, 'recommendationId': recommendationId} diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml new file mode 100644 index 00000000000..e834647686c --- /dev/null +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml @@ -0,0 +1,329 @@ +interactions: +- request: + body: '{"location": "westus", "tags": {"use": "az-test"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [group create] + Connection: [keep-alive] + Content-Length: ['50'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.26] +======= + msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.28] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + response: + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + headers: + cache-control: [no-cache] + content-length: ['328'] + content-type: [application/json; charset=utf-8] +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + date: ['Thu, 18 Jan 2018 00:41:01 GMT'] +======= + date: ['Fri, 16 Feb 2018 02:26:01 GMT'] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + expires: ['-1'] + pragma: [no-cache] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] + status: {code: 201, message: Created} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] +======= + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} +======= + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + date: ['Thu, 18 Jan 2018 00:41:02 GMT'] +======= + date: ['Fri, 16 Feb 2018 02:26:03 GMT'] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 16 Feb 2018 02:26:04 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "properties": {"exclude": true}}''' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['509'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] +======= + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + date: ['Thu, 18 Jan 2018 00:41:03 GMT'] +======= + date: ['Fri, 16 Feb 2018 02:26:05 GMT'] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + headers: + cache-control: [no-cache] + content-length: ['513'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 16 Feb 2018 02:26:06 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] +======= + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":true}}]}'} +======= + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + headers: + cache-control: [no-cache] + content-length: ['513'] + content-type: [application/json; charset=utf-8] +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + date: ['Thu, 18 Jan 2018 00:41:04 GMT'] +======= + date: ['Fri, 16 Feb 2018 02:26:08 GMT'] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "properties": {"exclude": false}}''' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['510'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] +======= + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + date: ['Thu, 18 Jan 2018 00:41:05 GMT'] +======= + date: ['Fri, 16 Feb 2018 02:26:08 GMT'] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] +======= + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} +======= + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + date: ['Thu, 18 Jan 2018 00:41:07 GMT'] +======= + date: ['Fri, 16 Feb 2018 02:26:09 GMT'] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [group delete] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.26] +======= + msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.28] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + accept-language: [en-US] + method: DELETE + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + content-length: ['0'] +<<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml + date: ['Thu, 18 Jan 2018 00:41:08 GMT'] + expires: ['-1'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkVQQzVXNVlaUUU3U1hPUDI1N05KVFNFV1FKS3xDNzBFNzZERDJBNjBEMkZFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] +======= + date: ['Fri, 16 Feb 2018 02:26:10 GMT'] + expires: ['-1'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUlUzUTVKNFlEVkNEQ0lENDc2Q1JDUEFUUUJYRHxEOTU4QjBFMTczMDJFQTIwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] +>>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml + pragma: [no-cache] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] + status: {code: 202, message: Accepted} +version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml deleted file mode 100644 index 2cbc895f5eb..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml +++ /dev/null @@ -1,195 +0,0 @@ -interactions: -- request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [group create] - Connection: [keep-alive] - Content-Length: ['50'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 - response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} - headers: - cache-control: [no-cache] - content-length: ['328'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:01 GMT'] - expires: ['-1'] - pragma: [no-cache] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 201, message: Created} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['514'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:02 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"exclude": true}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] - Connection: [keep-alive] - Content-Length: ['33'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:41:03 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":true}}]}'} - headers: - cache-control: [no-cache] - content-length: ['513'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:04 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"exclude": false}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] - Connection: [keep-alive] - Content-Length: ['34'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:41:05 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['514'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:07 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [group delete] - Connection: [keep-alive] - Content-Length: ['0'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.26] - accept-language: [en-US] - method: DELETE - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - date: ['Thu, 18 Jan 2018 00:41:08 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkVQQzVXNVlaUUU3U1hPUDI1N05KVFNFV1FKS3xDNzBFNzZERDJBNjBEMkZFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] - pragma: [no-cache] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] - status: {code: 202, message: Accepted} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_list_disable_enable_recommendations.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_list_disable_enable_recommendations.yaml deleted file mode 100644 index 030249464fc..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_list_disable_enable_recommendations.yaml +++ /dev/null @@ -1,267 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations/2e6ee8e4-9c0d-fb4d-253e-27c6ed1488ae","name":"2e6ee8e4-9c0d-fb4d-253e-27c6ed1488ae","properties":{"category":"Security","impact":"High","impactedField":"","impactedValue":"","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AZEXPERTSTGEUS/providers/Microsoft.Compute/virtualMachines/EUS-Test/providers/Microsoft.Advisor/recommendations/dba85867-7188-e8ff-3cc2-351336487e7f","name":"dba85867-7188-e8ff-3cc2-351336487e7f","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"EUS-Test","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations/e6a28e1d-9c18-c7fc-cc8d-f2f7e008b7d9","name":"e6a28e1d-9c18-c7fc-cc8d-f2f7e008b7d9","properties":{"category":"Security","impact":"High","impactedField":"","impactedValue":"","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations/01251607-ff25-6192-85bf-e004fe766491","name":"01251607-ff25-6192-85bf-e004fe766491","properties":{"category":"Security","impact":"High","impactedField":"","impactedValue":"","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AZEXPERTSTGWCUS/providers/Microsoft.Compute/virtualMachines/WCUS-Test/providers/Microsoft.Advisor/recommendations/25366bb0-17ae-70cd-4783-ecc5e08ac1ca","name":"25366bb0-17ae-70cd-4783-ecc5e08ac1ca","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"WCUS-Test","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations/b1abc525-e2aa-abdb-ac0c-c2282371e126","name":"b1abc525-e2aa-abdb-ac0c-c2282371e126","properties":{"category":"Security","impact":"High","impactedField":"","impactedValue":"","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AZEXPERTSTGWCUS/providers/Microsoft.Compute/virtualMachines/WCUS-Test/providers/Microsoft.Advisor/recommendations/a6a17e46-8078-f4ab-2527-8d03051e745e","name":"a6a17e46-8078-f4ab-2527-8d03051e745e","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"WCUS-Test","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3bc9d079-1911-e91c-d08d-d3ebb52b3e93","name":"3bc9d079-1911-e91c-d08d-d3ebb52b3e93","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f967503-8b3f-c991-c2be-2a3a0e401a21","name":"3f967503-8b3f-c991-c2be-2a3a0e401a21","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/COSMOSDATA/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/405a11f1-f7e2-4ee3-f7e9-4b51cdaa6efc","name":"405a11f1-f7e2-4ee3-f7e9-4b51cdaa6efc","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/COSMOSDATA/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/6b2263e0-3881-88cd-ded5-6520b1b18dfc","name":"6b2263e0-3881-88cd-ded5-6520b1b18dfc","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/e72e1401-659c-30d9-6cc4-3f6dea42d2bc","name":"e72e1401-659c-30d9-6cc4-3f6dea42d2bc","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/aedd45a5-d2e6-6e6b-55ff-f68991ab2c6b","name":"aedd45a5-d2e6-6e6b-55ff-f68991ab2c6b","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/COSMOSDATA/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/a0ca9267-1ca0-0c39-d8f9-ad7ee177c408","name":"a0ca9267-1ca0-0c39-d8f9-ad7ee177c408","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AZEXPERTSTGEUS/providers/Microsoft.Compute/virtualMachines/EUS-Test/providers/Microsoft.Advisor/recommendations/75900b89-f998-d17b-d149-d94366b52eda","name":"75900b89-f998-d17b-d149-d94366b52eda","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"EUS-Test","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/9d88ef0e-e8c0-a056-c303-fc9ca5e71c2a","name":"9d88ef0e-e8c0-a056-c303-fc9ca5e71c2a","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:16.1814518Z","risk":"None","shortDescription":{"problem":"Your - virtual machine is not configured for backup","solution":"Enable virtual machine - backup to protect your data from corruption and accidental deletion"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cosmosdata/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/73cdeb24-ff47-432a-8eef-c55d4b754df1","name":"73cdeb24-ff47-432a-8eef-c55d4b754df1","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T17:18:16.1814518Z","risk":"None","shortDescription":{"problem":"Your - virtual machine is not configured for backup","solution":"Enable virtual machine - backup to protect your data from corruption and accidental deletion"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c","name":"3f7f8549-a4ec-9548-3b63-09bf5845724c","properties":{"category":"Cost","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T11:02:58.0160597Z","risk":"None","shortDescription":{"problem":"Your - virtual machine has low usage","solution":"Right-size or shutdown underutilized - virtual machines"}},"type":"Microsoft.Advisor/recommendations","hardwareDetails":{"resourceId":"y8fx4nayf4ptcckwy6pri8bbx5z4mwufo9ax4nayrti71j3x5pdwtc7y4imyqeyy6a","size":"Standard_D1_v2"}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/availabilitySets/avset1/providers/Microsoft.Advisor/recommendations/53162ec9-8175-8a19-bf2c-1271a893e24a","name":"53162ec9-8175-8a19-bf2c-1271a893e24a","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/availabilitySets","impactedValue":"avset1","lastUpdated":"2017-11-16T10:56:18.6499735Z","risk":"Warning","shortDescription":{"problem":"This - availability set is not configured for fault tolerance","solution":"Add more - virtual machines for improved fault tolerance"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cosmosdata/providers/Microsoft.Compute/virtualMachines/azatestvm/providers/Microsoft.Advisor/recommendations/fd97b114-f106-e610-ee6a-7deca5f9963d","name":"fd97b114-f106-e610-ee6a-7deca5f9963d","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"azatestvm","lastUpdated":"2017-11-16T10:56:02.056374Z","risk":"None","shortDescription":{"problem":"This - virtual machine is not configured for fault tolerance","solution":"Use availability - sets for improved fault tolerance"}},"type":"Microsoft.Advisor/recommendations"}]}'} - headers: - cache-control: [no-cache] - content-length: ['12585'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:25 GMT'] - expires: ['-1'] - iscutoff: ['False'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations?api-version=2017-04-19&$filter=Category%20eq%20%27cost%27 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c","name":"3f7f8549-a4ec-9548-3b63-09bf5845724c","properties":{"category":"Cost","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T11:02:58.0160597Z","risk":"None","shortDescription":{"problem":"Your - virtual machine has low usage","solution":"Right-size or shutdown underutilized - virtual machines"}},"type":"Microsoft.Advisor/recommendations","hardwareDetails":{"resourceId":"y8fx4nayf4ptcckwy6pri8bbx5z4mwufo9ax4nayrti71j3x5pdwtc7y4imyqeyy6a","size":"Standard_D1_v2"}}]}'} - headers: - cache-control: [no-cache] - content-length: ['779'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:27 GMT'] - expires: ['-1'] - iscutoff: ['False'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"ttl": "1:00:00:00"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation disable] - Connection: [keep-alive] - Content-Length: ['37'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/%2Fsubscriptions%2F658c8950-e79d-4704-a903-1df66ba90258%2FresourceGroups%2Ffunctionaltest%2Fproviders%2FMicrosoft.Compute%2FvirtualMachines%2Fvmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe?api-version=2017-04-19 - response: - body: {string: '{"properties":{"suppressionId":"eacbc09d-e003-8167-fa4e-47d8a9c61f0a","ttl":"1:00:00:00"}}'} - headers: - cache-control: [no-cache] - content-length: ['90'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:30 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation disable] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/%2Fsubscriptions%2F658c8950-e79d-4704-a903-1df66ba90258%2FresourceGroups%2Ffunctionaltest%2Fproviders%2FMicrosoft.Compute%2FvirtualMachines%2Fvmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe?api-version=2017-04-19 - response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe","name":"d8a63867-e3cc-43b4-8400-3d75f3a8f9fe","type":"Microsoft.Advisor/suppressions","properties":{"suppressionId":"eacbc09d-e003-8167-fa4e-47d8a9c61f0a","ttl":"1.00:00:00"}}'} - headers: - cache-control: [no-cache] - content-length: ['452'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:32 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation enable] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/suppressions?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe","name":"d8a63867-e3cc-43b4-8400-3d75f3a8f9fe","type":"Microsoft.Advisor/suppressions","properties":{"suppressionId":"eacbc09d-e003-8167-fa4e-47d8a9c61f0a","ttl":"1.00:00:00"}}]}'} - headers: - cache-control: [no-cache] - content-length: ['464'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:32 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation enable] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations?api-version=2017-04-19&$filter=ResourceId%20eq%20%27%2Fsubscriptions%2F658c8950-e79d-4704-a903-1df66ba90258%2FresourceGroups%2Ffunctionaltest%2Fproviders%2FMicrosoft.Compute%2FvirtualMachines%2Fvmnobackup1%27 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3bc9d079-1911-e91c-d08d-d3ebb52b3e93","name":"3bc9d079-1911-e91c-d08d-d3ebb52b3e93","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f967503-8b3f-c991-c2be-2a3a0e401a21","name":"3f967503-8b3f-c991-c2be-2a3a0e401a21","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/e72e1401-659c-30d9-6cc4-3f6dea42d2bc","name":"e72e1401-659c-30d9-6cc4-3f6dea42d2bc","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/FUNCTIONALTEST/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/aedd45a5-d2e6-6e6b-55ff-f68991ab2c6b","name":"aedd45a5-d2e6-6e6b-55ff-f68991ab2c6b","properties":{"category":"Security","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:15.9001896Z","risk":"None","shortDescription":{"problem":"Improve - the security of your Azure resources","solution":"Follow Security Center recommendations"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/9d88ef0e-e8c0-a056-c303-fc9ca5e71c2a","name":"9d88ef0e-e8c0-a056-c303-fc9ca5e71c2a","properties":{"category":"HighAvailability","impact":"Medium","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T17:18:16.1814518Z","risk":"None","shortDescription":{"problem":"Your - virtual machine is not configured for backup","solution":"Enable virtual machine - backup to protect your data from corruption and accidental deletion"}},"type":"Microsoft.Advisor/recommendations"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c","name":"3f7f8549-a4ec-9548-3b63-09bf5845724c","properties":{"category":"Cost","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T11:02:58.0160597Z","risk":"None","shortDescription":{"problem":"Your - virtual machine has low usage","solution":"Right-size or shutdown underutilized - virtual machines"},"suppressionIds":["eacbc09d-e003-8167-fa4e-47d8a9c61f0a"]},"type":"Microsoft.Advisor/recommendations","hardwareDetails":{"resourceId":"y8fx4nayf4ptcckwy6pri8bbx5z4mwufo9ax4nayrti71j3x5pdwtc7y4imyqeyy6a","size":"Standard_D1_v2"}}]}'} - headers: - cache-control: [no-cache] - content-length: ['4109'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:34 GMT'] - expires: ['-1'] - iscutoff: ['False'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation enable] - Connection: [keep-alive] - Content-Length: ['0'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: DELETE - uri: https://management.azure.com/%2Fsubscriptions%2F658c8950-e79d-4704-a903-1df66ba90258%2FresourceGroups%2Ffunctionaltest%2Fproviders%2FMicrosoft.Compute%2FvirtualMachines%2Fvmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c/suppressions/d8a63867-e3cc-43b4-8400-3d75f3a8f9fe?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Thu, 16 Nov 2017 17:18:35 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/0.1.0 Azure-SDK-For-Python AZURECLI/2.0.21] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/recommendations?api-version=2017-04-19&$filter=Category%20eq%20%27cost%27 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/functionaltest/providers/Microsoft.Compute/virtualMachines/vmnobackup1/providers/Microsoft.Advisor/recommendations/3f7f8549-a4ec-9548-3b63-09bf5845724c","name":"3f7f8549-a4ec-9548-3b63-09bf5845724c","properties":{"category":"Cost","impact":"High","impactedField":"Microsoft.Compute/virtualMachines","impactedValue":"vmnobackup1","lastUpdated":"2017-11-16T11:02:58.0160597Z","risk":"None","shortDescription":{"problem":"Your - virtual machine has low usage","solution":"Right-size or shutdown underutilized - virtual machines"}},"type":"Microsoft.Advisor/recommendations","hardwareDetails":{"resourceId":"y8fx4nayf4ptcckwy6pri8bbx5z4mwufo9ax4nayrti71j3x5pdwtc7y4imyqeyy6a","size":"Standard_D1_v2"}}]}'} - headers: - cache-control: [no-cache] - content-length: ['779'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 16 Nov 2017 17:18:37 GMT'] - expires: ['-1'] - iscutoff: ['False'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - status: {code: 200, message: OK} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py index b83555f2f06..0204c4893a1 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py @@ -5,11 +5,13 @@ import unittest -from azure.cli.testsdk import LiveScenarioTest, ScenarioTest, ResourceGroupPreparer +from azure.cli.testsdk import ( + LiveScenarioTest, ScenarioTest, ResourceGroupPreparer) -from azure.cli.command_modules.advisor.custom import _cli_advisor_build_filter_string, _cli_advisor_parse_operation_id, _cli_advisor_parse_recommendation_uri - -# pylint: disable=line-too-long +from azure.cli.command_modules.advisor.custom import ( + _cli_advisor_build_filter_string, + _cli_advisor_parse_operation_id, + _cli_advisor_parse_recommendation_uri) class AzureAdvisorUnitTest(unittest.TestCase): @@ -19,77 +21,146 @@ def test_build_filter(self): resource_group_name = 'r' category = 'cost' - self.assertEqual(_cli_advisor_build_filter_string(), None) - self.assertEqual(_cli_advisor_build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") - self.assertEqual(_cli_advisor_build_filter_string(resource_group_name=resource_group_name), "ResourceGroup eq 'r'") - self.assertEqual(_cli_advisor_build_filter_string(category=category), "Category eq 'cost'") - self.assertEqual(_cli_advisor_build_filter_string(ids=ids, category=category), "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") - self.assertEqual(_cli_advisor_build_filter_string(resource_group_name=resource_group_name, category=category), "(ResourceGroup eq 'r') and Category eq 'cost'") + self.assertEqual( + _cli_advisor_build_filter_string(), + None) + self.assertEqual( + _cli_advisor_build_filter_string(ids=ids), + "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") + self.assertEqual( + _cli_advisor_build_filter_string( + resource_group_name=resource_group_name), + "ResourceGroup eq 'r'") + self.assertEqual( + _cli_advisor_build_filter_string( + category=category), + "Category eq 'cost'") + self.assertEqual( + _cli_advisor_build_filter_string( + ids=ids, + category=category), + "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") + self.assertEqual( + _cli_advisor_build_filter_string( + resource_group_name=resource_group_name, + category=category), + "(ResourceGroup eq 'r') and Category eq 'cost'") def test__cli_advisor_parse_operation_id(self): - location = 'https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320?api-version=2017-04-19' + location = ("https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/" + "providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320" + "?api-version=2017-04-19") operation_id = _cli_advisor_parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') def test__cli_advisor_parse_recommendation_uri(self): - recommendation_uri = '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test/providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425' + recommendation_uri = ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" + "/providers/Microsoft.Network/expressRouteCircuits/test/" + "providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425" + "/suppressions/5c9c3fce-c1b2-7e45-106c-152ce3c04be5") result = _cli_advisor_parse_recommendation_uri(recommendation_uri) self.assertEqual( result['resourceUri'], - '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test' - ) + ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" + "/providers/Microsoft.Network/expressRouteCircuits/test")) self.assertEqual(result['recommendationId'], 'c4deb869-ea38-f90d-331f-91770021d425') class AzureAdvisorLiveScenarioTest(LiveScenarioTest): - def test_list_disable_enable_recommendations(self): - output = self.cmd('advisor recommendation list --refresh').get_output_in_json() - self.assertGreater(len(output), 1) - output = self.cmd('advisor recommendation list --category cost').get_output_in_json() - self.assertGreater(len(output), 0) + def test_recommendations(self): + # List should return at least one recommendation with filters + output = self.cmd('advisor recommendation list --category Security', + checks=self.check("[0].category", 'Security')).get_output_in_json() + # Set the recommendation details to use with further commands + # Ignore the first one since that is for the whole subscription + ids = _cli_advisor_parse_recommendation_uri(output[1]['id'])['resourceUri'] + name = output[1]['name'] + group = output[1]['resourceGroup'] self.kwargs.update({ - 'recommendation_id': output[0]['id'] + 'ids': ids, + 'name': name, + 'group': group }) - disableCmd = 'advisor recommendation disable --ids {recommendation_id} --days 1' - enableCmd = 'advisor recommendation enable --ids {recommendation_id}' - output = self.cmd(disableCmd).get_output_in_json() - self.assertEqual(output[0]['ttl'], '1.00:00:00') - self.cmd(enableCmd) - output = self.cmd('advisor recommendation list --category cost').get_output_in_json() - self.assertGreater(len(output), 0) - self.assertEqual(output[0]['suppressionIds'], None) + + # Disable with specified duration should create a suppression + self.cmd('advisor recommendation disable -n {name} -g {group} --days 1', + checks = [self.check("name", name), + self.check("resourceGroup", group), + self.exists("suppressionIds")]) + + # Disable again should create another suppression + self.cmd('advisor recommendation disable -n {name} -g {group}', + checks = [self.check("name", name), + self.check("resourceGroup", group), + self.greater_than("length(suppressionIds)", 1)]) + + # Enable should remove all suppressions + self.cmd('advisor recommendation enable -n {name} -g {group}') + self.cmd('advisor recommendation list --ids {ids}', + checks = [self.check("[0].name", name), + self.check("[0].resourceGroup", group), + self.check("[0].suppressionIds", None)]) + + # Enable again should be a no op + self.cmd('advisor recommendation enable -n {name} -g {group}') + self.cmd('advisor recommendation list --ids {ids}', + checks = [self.check("[0].name", name), + self.check("[0].resourceGroup", group), + self.check("[0].suppressionIds", None)]) + + # List should return at least one recommendation without any filters + self.cmd('advisor recommendation list --refresh', + checks=self.check("[?category=='Security'].category | [0]", 'Security')) class AzureAdvisorScenarioTest(ScenarioTest): - def test_list_update_configurations_subscription(self): - output = self.cmd('advisor configuration list').get_output_in_json() - self.assertGreater(len(output), 1) - self.cmd('advisor configuration update --low-cpu-threshold 20') - output = self.cmd('advisor configuration list').get_output_in_json() - for entry in output['value']: - if entry['properties']['lowCpuThreshold']: - self.assertEqual(entry['properties']['lowCpuThreshold'], '20') - self.cmd('advisor configuration update --low-cpu-threshold 5') - output = self.cmd('advisor configuration list').get_output_in_json() - for entry in output['value']: - if entry['properties']['lowCpuThreshold']: - self.assertEqual(entry['properties']['lowCpuThreshold'], '5') + def test_configurations_subscription(self): + subscriptionId = self.cmd('account show').get_output_in_json()['id'] + + # Show should always return a default + self.cmd('advisor configuration show', + checks = [self.check("name", subscriptionId)]) + + # Show should reflect the changes made by Update + self.cmd('advisor configuration update --low-cpu-threshold 15 --exclude') + self.cmd('advisor configuration show', + checks = [self.check("name", subscriptionId), + self.check("properties.lowCpuThreshold", "15"), + self.check("properties.exclude", True)]) + + # Show should reflect the changes made by Update + self.cmd('advisor configuration update --low-cpu-threshold 5 --include') + self.cmd('advisor configuration show', + checks = [self.check("name", subscriptionId), + self.check("properties.lowCpuThreshold", "5"), + self.check("properties.exclude", False)]) + + # List should reflect the changes made by Update + self.cmd('advisor configuration list', + checks = [self.check("[0].name", subscriptionId), + self.check("[0].properties.lowCpuThreshold", "5"), + self.check("[0].properties.exclude", False)]) @ResourceGroupPreparer(name_prefix='cli_test_advisor') - def test_list_update_configurations_resource_group(self, resource_group): - output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() - self.assertGreater(len(output), 0) - self.cmd('advisor configuration update --exclude --resource-group {rg}') - output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() - self.assertGreater(len(output), 0) - self.assertTrue(output['value'][0]['properties']['exclude']) - self.cmd('advisor configuration update --include --resource-group {rg}') - output = self.cmd('advisor configuration list --resource-group {rg}').get_output_in_json() - self.assertGreater(len(output), 0) - self.assertTrue(not output['value'][0]['properties']['exclude']) + def test_configurations_subscription(self, resource_group): + # Show should always return a default even for a brand new resource group + self.cmd('advisor configuration show -g {rg}', + checks = [self.check("resourceGroup", resource_group)]) + + # Show should reflect the changes made by Update + self.cmd('advisor configuration update --exclude -g {rg}') + self.cmd('advisor configuration show -g {rg}', + checks = [self.check("resourceGroup", resource_group), + self.check("properties.exclude", True)]) + + # Show should reflect the changes made by Update + self.cmd('advisor configuration update --include -g {rg}') + self.cmd('advisor configuration show -g {rg}', + checks = [self.check("resourceGroup", resource_group), + self.check("properties.exclude", False)]) if __name__ == '__main__': From be1ab4a853f0b691e9ee446bc8124d91abf63dde Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Fri, 16 Feb 2018 09:01:23 -0800 Subject: [PATCH 17/22] Fix indentation errors. --- .../tests/latest/test_advisor_commands.py | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py index 0204c4893a1..cc978a59412 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py @@ -23,14 +23,14 @@ def test_build_filter(self): self.assertEqual( _cli_advisor_build_filter_string(), - None) + None) self.assertEqual( _cli_advisor_build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") self.assertEqual( _cli_advisor_build_filter_string( resource_group_name=resource_group_name), - "ResourceGroup eq 'r'") + "ResourceGroup eq 'r'") self.assertEqual( _cli_advisor_build_filter_string( category=category), @@ -48,21 +48,21 @@ def test_build_filter(self): def test__cli_advisor_parse_operation_id(self): location = ("https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/" - "providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320" - "?api-version=2017-04-19") + "providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320" + "?api-version=2017-04-19") operation_id = _cli_advisor_parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') def test__cli_advisor_parse_recommendation_uri(self): recommendation_uri = ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" - "/providers/Microsoft.Network/expressRouteCircuits/test/" - "providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425" - "/suppressions/5c9c3fce-c1b2-7e45-106c-152ce3c04be5") + "/providers/Microsoft.Network/expressRouteCircuits/test/" + "providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425" + "/suppressions/5c9c3fce-c1b2-7e45-106c-152ce3c04be5") result = _cli_advisor_parse_recommendation_uri(recommendation_uri) self.assertEqual( result['resourceUri'], ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" - "/providers/Microsoft.Network/expressRouteCircuits/test")) + "/providers/Microsoft.Network/expressRouteCircuits/test")) self.assertEqual(result['recommendationId'], 'c4deb869-ea38-f90d-331f-91770021d425') @@ -86,29 +86,29 @@ def test_recommendations(self): # Disable with specified duration should create a suppression self.cmd('advisor recommendation disable -n {name} -g {group} --days 1', - checks = [self.check("name", name), - self.check("resourceGroup", group), - self.exists("suppressionIds")]) + checks=[self.check("name", name), + self.check("resourceGroup", group), + self.exists("suppressionIds")]) # Disable again should create another suppression self.cmd('advisor recommendation disable -n {name} -g {group}', - checks = [self.check("name", name), - self.check("resourceGroup", group), - self.greater_than("length(suppressionIds)", 1)]) + checks=[self.check("name", name), + self.check("resourceGroup", group), + self.greater_than("length(suppressionIds)", 1)]) # Enable should remove all suppressions self.cmd('advisor recommendation enable -n {name} -g {group}') self.cmd('advisor recommendation list --ids {ids}', - checks = [self.check("[0].name", name), - self.check("[0].resourceGroup", group), - self.check("[0].suppressionIds", None)]) + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", group), + self.check("[0].suppressionIds", None)]) # Enable again should be a no op self.cmd('advisor recommendation enable -n {name} -g {group}') self.cmd('advisor recommendation list --ids {ids}', - checks = [self.check("[0].name", name), - self.check("[0].resourceGroup", group), - self.check("[0].suppressionIds", None)]) + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", group), + self.check("[0].suppressionIds", None)]) # List should return at least one recommendation without any filters self.cmd('advisor recommendation list --refresh', @@ -122,45 +122,45 @@ def test_configurations_subscription(self): # Show should always return a default self.cmd('advisor configuration show', - checks = [self.check("name", subscriptionId)]) + checks=[self.check("name", subscriptionId)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --low-cpu-threshold 15 --exclude') self.cmd('advisor configuration show', - checks = [self.check("name", subscriptionId), - self.check("properties.lowCpuThreshold", "15"), - self.check("properties.exclude", True)]) + checks=[self.check("name", subscriptionId), + self.check("properties.lowCpuThreshold", "15"), + self.check("properties.exclude", True)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --low-cpu-threshold 5 --include') self.cmd('advisor configuration show', - checks = [self.check("name", subscriptionId), - self.check("properties.lowCpuThreshold", "5"), - self.check("properties.exclude", False)]) + checks=[self.check("name", subscriptionId), + self.check("properties.lowCpuThreshold", "5"), + self.check("properties.exclude", False)]) # List should reflect the changes made by Update self.cmd('advisor configuration list', - checks = [self.check("[0].name", subscriptionId), - self.check("[0].properties.lowCpuThreshold", "5"), - self.check("[0].properties.exclude", False)]) + checks=[self.check("[0].name", subscriptionId), + self.check("[0].properties.lowCpuThreshold", "5"), + self.check("[0].properties.exclude", False)]) @ResourceGroupPreparer(name_prefix='cli_test_advisor') def test_configurations_subscription(self, resource_group): # Show should always return a default even for a brand new resource group self.cmd('advisor configuration show -g {rg}', - checks = [self.check("resourceGroup", resource_group)]) + checks=[self.check("resourceGroup", resource_group)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --exclude -g {rg}') self.cmd('advisor configuration show -g {rg}', - checks = [self.check("resourceGroup", resource_group), - self.check("properties.exclude", True)]) + checks=[self.check("resourceGroup", resource_group), + self.check("properties.exclude", True)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --include -g {rg}') self.cmd('advisor configuration show -g {rg}', - checks = [self.check("resourceGroup", resource_group), - self.check("properties.exclude", False)]) + checks=[self.check("resourceGroup", resource_group), + self.check("properties.exclude", False)]) if __name__ == '__main__': From 24cc6b9e6ca6b316b2beeea890149f18061b24db Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Fri, 23 Feb 2018 17:21:16 -0800 Subject: [PATCH 18/22] Add support for ids. --- .../cli/command_modules/advisor/_params.py | 11 +- .../command_modules/advisor/_validators.py | 5 + .../cli/command_modules/advisor/commands.py | 16 +- .../cli/command_modules/advisor/custom.py | 149 +++++----- .../test_configurations_resource_group.yaml | 259 ++++++++++++++++++ .../test_configurations_subscription.yaml | 114 ++++++-- .../tests/latest/test_advisor_commands.py | 125 +++++---- 7 files changed, 517 insertions(+), 162 deletions(-) create mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py index 50a69e42a79..7bf272692bc 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_params.py @@ -11,6 +11,7 @@ from ._validators import \ (validate_include_or_exclude, + validate_ids_or_names, validate_ids_or_resource_group, validate_threshold_or_resource_group) @@ -20,7 +21,7 @@ def load_arguments(self, _): help='One or more resource IDs (space-delimited). If provided, no other ' '"Resource Id" arguments should be specified.') - name_arg_type = CLIArgumentType(options_list=['--name', '-n'], id_part='child_name_1', + name_arg_type = CLIArgumentType(options_list=['--name', '-n'], help='The name of the recommendation as output by the list command.', completer=get_resource_name_completion_list('Microsoft.Advisor/recommendations')) @@ -32,12 +33,16 @@ def load_arguments(self, _): help='Generate new recommendations.') with self.argument_context('advisor recommendation disable') as c: - c.argument('recommendation_name', name_arg_type) + c.argument('ids', ids_arg_type, arg_group="Resource Id", validator=validate_ids_or_names) + c.argument('recommendation_name', name_arg_type, arg_group="Resource Id") + c.argument('resource_group_name', arg_group="Resource Id") c.argument('days', options_list=['--days', '-d'], type=int, help='Number of days to disable. If not specified, the recommendation is disabled forever.') with self.argument_context('advisor recommendation enable') as c: - c.argument('recommendation_name', name_arg_type) + c.argument('ids', ids_arg_type, arg_group="Resource Id", validator=validate_ids_or_names) + c.argument('resource_group_name', arg_group="Resource Id") + c.argument('recommendation_name', name_arg_type, arg_group="Resource Id") with self.argument_context('advisor configuration update') as c: c.argument('low_cpu_threshold', options_list=['--low-cpu-threshold', '-l'], diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py index af7cc079cac..165f89722a5 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_validators.py @@ -11,6 +11,11 @@ def validate_include_or_exclude(namespace): raise CLIError('usage error: --include | --exclude') +def validate_ids_or_names(namespace): + if namespace.ids and (namespace.recommendation_name or namespace.resource_group_name): + raise CLIError('usage error: --ids | --name [--resource-group]') + + def validate_ids_or_resource_group(namespace): if namespace.ids and namespace.resource_group_name: raise CLIError('usage error: --ids | --resource-group') diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py index e7ad86e9080..4d6084dcc39 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/commands.py @@ -14,20 +14,20 @@ def load_command_table(self, _): advisor_custom = CliCommandType(operations_tmpl='azure.cli.command_modules.advisor.custom#{}') with self.command_group('advisor recommendation') as g: - g.custom_command('list', 'cli_advisor_list_recommendations', + g.custom_command('list', 'list_recommendations', client_factory=recommendations_mgmt_client_factory) - g.custom_command('disable', 'cli_advisor_disable_recommendations', + g.custom_command('disable', 'disable_recommendations', client_factory=advisor_mgmt_client_factory) - g.custom_command('enable', 'cli_advisor_enable_recommendations', + g.custom_command('enable', 'enable_recommendations', client_factory=advisor_mgmt_client_factory) with self.command_group('advisor configuration', client_factory=configurations_mgmt_client_factory) as g: - g.custom_command('list', 'cli_advisor_list_configuration') - g.custom_command('show', 'cli_advisor_show_configuration') + g.custom_command('list', 'list_configuration') + g.custom_command('show', 'show_configuration') g.generic_update_command('update', - getter_name='cli_advisor_show_configuration', + getter_name='show_configuration', getter_type=advisor_custom, - setter_name='_cli_advisor_set_configuration', + setter_name='_set_configuration', setter_type=advisor_custom, - custom_func_name='cli_advisor_update_configuration', + custom_func_name='update_configuration', custom_func_type=advisor_custom) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py index 1b5bc75a102..5ddb4eb42b7 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/custom.py @@ -4,86 +4,73 @@ # -------------------------------------------------------------------------------------------- import uuid -from knack.util import CLIError -def cli_advisor_list_recommendations(client, ids=None, resource_group_name=None, - category=None, refresh=None): +def list_recommendations(client, ids=None, resource_group_name=None, + category=None, refresh=None): if refresh: - _cli_advisor_generate_recommendations(client) - scope = _cli_advisor_build_filter_string(ids, resource_group_name, category) + _generate_recommendations(client) + scope = _build_filter_string(ids, resource_group_name, category) return client.list(scope) -def cli_advisor_disable_recommendations(client, resource_group_name, - recommendation_name, days=None): - recs = cli_advisor_list_recommendations( +def disable_recommendations(client, ids=None, recommendation_name=None, + resource_group_name=None, days=None): + recs = _get_recommendations( client=client.recommendations, - resource_group_name=resource_group_name) - rec = next((r for r in recs if r.name == recommendation_name), None) - - if not rec: - raise CLIError( - "Recommendation with name {} in resource group {} not found".format( - recommendation_name, - resource_group_name)) - - suppressionName = str(uuid.uuid4()) - ttl = '{}:00:00:00'.format(days) if days else '' - - result = _cli_advisor_parse_recommendation_uri(rec.id) - resourceUri = result['resourceUri'] - recommendationId = result['recommendationId'] - - sup = client.suppressions.create( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName, - ttl=ttl - ) - - if rec.suppression_ids: - rec.suppression_ids.append(sup.suppression_id) - else: - rec.suppression_ids = [sup.suppression_id] + ids=ids, + resource_group_name=resource_group_name, + recommendation_name=recommendation_name) - return rec + for rec in recs: + suppression_name = str(uuid.uuid4()) + ttl = '{}:00:00:00'.format(days) if days else '' + result = _parse_recommendation_uri(rec.id) + resource_uri = result['resource_uri'] + recommendation_id = result['recommendation_id'] -def cli_advisor_enable_recommendations(client, resource_group_name, recommendation_name): - allSups = list(client.suppressions.list()) + sup = client.suppressions.create( + resource_uri=resource_uri, + recommendation_id=recommendation_id, + name=suppression_name, + ttl=ttl + ) - recs = cli_advisor_list_recommendations( - client=client.recommendations, - resource_group_name=resource_group_name) - rec = next((r for r in recs if r.name == recommendation_name), None) + if rec.suppression_ids: + rec.suppression_ids.append(sup.suppression_id) + else: + rec.suppression_ids = [sup.suppression_id] - if rec: - matches = [x for x in allSups if x.suppression_id in rec.suppression_ids] - else: - matches = [s for s in allSups if 'Microsoft.Advisor/recommendations/{}'.format(recommendation_name) in s.id] + return recs - if matches: - for match in matches: - result = _cli_advisor_parse_recommendation_uri(match.id) - client.suppressions.delete( - resource_uri=result['resourceUri'], - recommendation_id=result['recommendationId'], - name=match.name - ) - rec = cli_advisor_list_recommendations( - client=client.recommendations, - ids=result['resourceUri']) +def enable_recommendations(client, ids=None, resource_group_name=None, recommendation_name=None): + recs = _get_recommendations( + client=client.recommendations, + ids=ids, + resource_group_name=resource_group_name, + recommendation_name=recommendation_name) + all_sups = list(client.suppressions.list()) + + for rec in recs: + for sup in all_sups: + if sup.suppression_id in rec.suppression_ids: + result = _parse_recommendation_uri(rec.id) + client.suppressions.delete( + resource_uri=result['resource_uri'], + recommendation_id=result['recommendation_id'], + name=sup.name) + rec.suppression_ids = None - return rec + return recs -def cli_advisor_list_configuration(client): +def list_configuration(client): return client.list_by_subscription() -def cli_advisor_show_configuration(client, resource_group_name=None): +def show_configuration(client, resource_group_name=None): output = None if resource_group_name: output = client.list_by_resource_group(resource_group_name) @@ -93,8 +80,8 @@ def cli_advisor_show_configuration(client, resource_group_name=None): return list(output)[0] -def cli_advisor_update_configuration(instance, low_cpu_threshold=None, - exclude=None, include=None): +def update_configuration(instance, low_cpu_threshold=None, + exclude=None, include=None): instance.properties.low_cpu_threshold = low_cpu_threshold instance.properties.exclude = exclude if include: @@ -103,7 +90,7 @@ def cli_advisor_update_configuration(instance, low_cpu_threshold=None, return instance -def _cli_advisor_build_filter_string(ids=None, resource_group_name=None, category=None): +def _build_filter_string(ids=None, resource_group_name=None, category=None): idFilter = None if ids: @@ -123,7 +110,7 @@ def _cli_advisor_build_filter_string(ids=None, resource_group_name=None, categor return None -def _cli_advisor_parse_operation_id(location): +def _parse_operation_id(location): # extract the operation ID from the Location header # it is a GUID (i.e. a string of length 36) immediately preceding the api-version query parameter end = location.find('?api-version') @@ -132,21 +119,21 @@ def _cli_advisor_parse_operation_id(location): return operation_id -def _cli_advisor_parse_recommendation_uri(recommendationUri): - resourceUri = recommendationUri[:recommendationUri.find("/providers/Microsoft.Advisor/recommendations")] - rStart = recommendationUri.find("/recommendations/") + len('/recommendations/') +def _parse_recommendation_uri(recommendation_uri): + resource_uri = recommendation_uri[:recommendation_uri.find("/providers/Microsoft.Advisor/recommendations")] + rStart = recommendation_uri.find("/recommendations/") + len('/recommendations/') # recommendation ID is a GUID (i.e. a string of length 36) rEnd = rStart + 36 - recommendationId = recommendationUri[rStart:rEnd] - return {'resourceUri': resourceUri, 'recommendationId': recommendationId} + recommendation_id = recommendation_uri[rStart:rEnd] + return {'resource_uri': resource_uri, 'recommendation_id': recommendation_id} -def _cli_advisor_generate_recommendations(client): +def _generate_recommendations(client): from msrestazure.azure_exceptions import CloudError response = client.generate(raw=True) location = response.headers['Location'] - operation_id = _cli_advisor_parse_operation_id(location) + operation_id = _parse_operation_id(location) try: client.get_generate_status(operation_id=operation_id) @@ -157,10 +144,28 @@ def _cli_advisor_generate_recommendations(client): raise ex -def _cli_advisor_set_configuration(client, resource_group_name=None, parameters=None): +def _set_configuration(client, resource_group_name=None, parameters=None): if resource_group_name: return client.create_in_resource_group( config_contract=parameters, resource_group=resource_group_name) return client.create_in_subscription(parameters) + + +def _get_recommendations(client, ids=None, resource_group_name=None, recommendation_name=None): + if ids: + resource_ids = [_parse_recommendation_uri(id_arg)['resource_uri'] for id_arg in ids] + recs = list_recommendations( + client=client, + ids=resource_ids + ) + return [r for r in recs if r.id in ids] + + if recommendation_name: + recs = list_recommendations( + client=client, + resource_group_name=resource_group_name) + return [r for r in recs if r.name == recommendation_name] + + return None diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml new file mode 100644 index 00000000000..848f11bfa60 --- /dev/null +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml @@ -0,0 +1,259 @@ +interactions: +- request: + body: '{"location": "westus", "tags": {"use": "az-test"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [group create] + Connection: [keep-alive] + Content-Length: ['50'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.28] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + response: + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + headers: + cache-control: [no-cache] + content-length: ['328'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:31 GMT'] + expires: ['-1'] + pragma: [no-cache] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] + status: {code: 201, message: Created} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:33 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:34 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +- request: + body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "properties": {"exclude": true}}''' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['509'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Sat, 24 Feb 2018 01:19:35 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['198'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + headers: + cache-control: [no-cache] + content-length: ['513'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:35 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['597'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + headers: + cache-control: [no-cache] + content-length: ['513'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:38 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +- request: + body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", + "properties": {"exclude": false}}''' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['510'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Sat, 24 Feb 2018 01:19:39 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['198'] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['514'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:40 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [group delete] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.28] + accept-language: [en-US] + method: DELETE + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + content-length: ['0'] + date: ['Sat, 24 Feb 2018 01:19:42 GMT'] + expires: ['-1'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkRYSjNPUlpMSVVENTVZWUZKS1JWM0hTWTRWS3w5OEMxNzQ2RDE4QTVFRTNBLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + pragma: [no-cache] + strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] + status: {code: 202, message: Accepted} +version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml index e834647686c..8434a69279c 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml @@ -1,5 +1,6 @@ interactions: - request: +<<<<<<< HEAD body: '{"location": "westus", "tags": {"use": "az-test"}}' headers: Accept: [application/json] @@ -36,6 +37,8 @@ interactions: x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: +======= +>>>>>>> Add support for ids. body: null headers: Accept: [application/json] @@ -51,22 +54,30 @@ interactions: >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} ======= body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza","properties":{"exclude":false}}]}'} +>>>>>>> Add support for ids. headers: cache-control: [no-cache] - content-length: ['514'] + content-length: ['798'] content-type: [application/json; charset=utf-8] +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml date: ['Thu, 18 Jan 2018 00:41:02 GMT'] ======= date: ['Fri, 16 Feb 2018 02:26:03 GMT'] >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + date: ['Sat, 24 Feb 2018 01:19:43 GMT'] +>>>>>>> Add support for ids. expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -88,14 +99,14 @@ interactions: msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisordxj3orzliud55yyfjkrv3hsy4vk6gcdekzfayfcivqf45qrtvbvfz5m5cza","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['514'] + content-length: ['798'] content-type: [application/json; charset=utf-8] - date: ['Fri, 16 Feb 2018 02:26:04 GMT'] + date: ['Sat, 24 Feb 2018 01:19:45 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -103,18 +114,18 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] status: {code: 200, message: OK} - request: - body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", - "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", - "properties": {"exclude": true}}''' + body: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258", + "properties": {"exclude": true, "low_cpu_threshold": "15"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Length: ['509'] + Content-Length: ['293'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml @@ -124,16 +135,20 @@ interactions: >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml accept-language: [en-US] method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: body: {string: ''} headers: cache-control: [no-cache] +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml date: ['Thu, 18 Jan 2018 00:41:03 GMT'] ======= date: ['Fri, 16 Feb 2018 02:26:05 GMT'] >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + date: ['Sat, 24 Feb 2018 01:19:43 GMT'] +>>>>>>> Add support for ids. expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -153,14 +168,14 @@ interactions: msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"15","exclude":true}}]}'} headers: cache-control: [no-cache] - content-length: ['513'] + content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Fri, 16 Feb 2018 02:26:06 GMT'] + date: ['Sat, 24 Feb 2018 01:19:47 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -186,22 +201,30 @@ interactions: >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":true}}]}'} ======= body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"15","exclude":true}}]}'} +>>>>>>> Add support for ids. headers: cache-control: [no-cache] - content-length: ['513'] + content-length: ['295'] content-type: [application/json; charset=utf-8] +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml date: ['Thu, 18 Jan 2018 00:41:04 GMT'] ======= date: ['Fri, 16 Feb 2018 02:26:08 GMT'] >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + date: ['Sat, 24 Feb 2018 01:19:47 GMT'] +>>>>>>> Add support for ids. expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -212,15 +235,15 @@ interactions: x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: - body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", - "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", - "properties": {"exclude": false}}''' + body: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258", + "properties": {"exclude": false, "low_cpu_threshold": "5"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Length: ['510'] + Content-Length: ['293'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml @@ -230,16 +253,20 @@ interactions: >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml accept-language: [en-US] method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: body: {string: ''} headers: cache-control: [no-cache] +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml date: ['Thu, 18 Jan 2018 00:41:05 GMT'] ======= date: ['Fri, 16 Feb 2018 02:26:08 GMT'] >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + date: ['Sat, 24 Feb 2018 01:19:50 GMT'] +>>>>>>> Add support for ids. expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -263,22 +290,30 @@ interactions: >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisor000001","properties":{"exclude":false}}]}'} ======= body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}}]}'} +>>>>>>> Add support for ids. headers: cache-control: [no-cache] - content-length: ['514'] + content-length: ['295'] content-type: [application/json; charset=utf-8] +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml date: ['Thu, 18 Jan 2018 00:41:07 GMT'] ======= date: ['Fri, 16 Feb 2018 02:26:09 GMT'] >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + date: ['Sat, 24 Feb 2018 01:19:50 GMT'] +>>>>>>> Add support for ids. expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -293,11 +328,11 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [group delete] + CommandName: [advisor configuration list] Connection: [keep-alive] - Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 +<<<<<<< HEAD <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python AZURECLI/2.0.26] @@ -305,13 +340,17 @@ interactions: msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python AZURECLI/2.0.28] >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] +>>>>>>> Add support for ids. accept-language: [en-US] - method: DELETE - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: ''} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}}]}'} headers: cache-control: [no-cache] +<<<<<<< HEAD content-length: ['0'] <<<<<<< HEAD:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_resource_group.yaml date: ['Thu, 18 Jan 2018 00:41:08 GMT'] @@ -322,8 +361,23 @@ interactions: expires: ['-1'] location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUlUzUTVKNFlEVkNEQ0lENDc2Q1JDUEFUUUJYRHxEOTU4QjBFMTczMDJFQTIwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] >>>>>>> Addressing review feedback.:src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +======= + content-length: ['295'] + content-type: [application/json; charset=utf-8] + date: ['Sat, 24 Feb 2018 01:19:51 GMT'] + expires: ['-1'] +>>>>>>> Add support for ids. pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] strict-transport-security: [max-age=31536000; includeSubDomains] +<<<<<<< HEAD x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} +======= + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} +>>>>>>> Add support for ids. version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py index cc978a59412..63268ba6dfb 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/test_advisor_commands.py @@ -9,9 +9,9 @@ LiveScenarioTest, ScenarioTest, ResourceGroupPreparer) from azure.cli.command_modules.advisor.custom import ( - _cli_advisor_build_filter_string, - _cli_advisor_parse_operation_id, - _cli_advisor_parse_recommendation_uri) + _build_filter_string, + _parse_operation_id, + _parse_recommendation_uri) class AzureAdvisorUnitTest(unittest.TestCase): @@ -22,48 +22,48 @@ def test_build_filter(self): category = 'cost' self.assertEqual( - _cli_advisor_build_filter_string(), + _build_filter_string(), None) self.assertEqual( - _cli_advisor_build_filter_string(ids=ids), + _build_filter_string(ids=ids), "ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c'") self.assertEqual( - _cli_advisor_build_filter_string( + _build_filter_string( resource_group_name=resource_group_name), "ResourceGroup eq 'r'") self.assertEqual( - _cli_advisor_build_filter_string( + _build_filter_string( category=category), "Category eq 'cost'") self.assertEqual( - _cli_advisor_build_filter_string( + _build_filter_string( ids=ids, category=category), "(ResourceId eq 'a' or ResourceId eq 'b' or ResourceId eq 'c') and Category eq 'cost'") self.assertEqual( - _cli_advisor_build_filter_string( + _build_filter_string( resource_group_name=resource_group_name, category=category), "(ResourceGroup eq 'r') and Category eq 'cost'") - def test__cli_advisor_parse_operation_id(self): + def test__parse_operation_id(self): location = ("https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/" "providers/Microsoft.Advisor/generateRecommendations/a9544ca5-5837-4cb4-94d6-bad2b6e76320" "?api-version=2017-04-19") - operation_id = _cli_advisor_parse_operation_id(location) + operation_id = _parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') - def test__cli_advisor_parse_recommendation_uri(self): + def test__parse_recommendation_uri(self): recommendation_uri = ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" "/providers/Microsoft.Network/expressRouteCircuits/test/" "providers/Microsoft.Advisor/recommendations/c4deb869-ea38-f90d-331f-91770021d425" "/suppressions/5c9c3fce-c1b2-7e45-106c-152ce3c04be5") - result = _cli_advisor_parse_recommendation_uri(recommendation_uri) + result = _parse_recommendation_uri(recommendation_uri) self.assertEqual( - result['resourceUri'], + result['resource_uri'], ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" "/providers/Microsoft.Network/expressRouteCircuits/test")) - self.assertEqual(result['recommendationId'], 'c4deb869-ea38-f90d-331f-91770021d425') + self.assertEqual(result['recommendation_id'], 'c4deb869-ea38-f90d-331f-91770021d425') class AzureAdvisorLiveScenarioTest(LiveScenarioTest): @@ -74,78 +74,105 @@ def test_recommendations(self): checks=self.check("[0].category", 'Security')).get_output_in_json() # Set the recommendation details to use with further commands - # Ignore the first one since that is for the whole subscription - ids = _cli_advisor_parse_recommendation_uri(output[1]['id'])['resourceUri'] - name = output[1]['name'] - group = output[1]['resourceGroup'] + rec = output[0] + name = rec['name'] + recommendation_id = rec['id'] + resource_id = _parse_recommendation_uri(recommendation_id) self.kwargs.update({ - 'ids': ids, 'name': name, - 'group': group + 'recommendation_id': recommendation_id, + 'resource_id': resource_id }) # Disable with specified duration should create a suppression - self.cmd('advisor recommendation disable -n {name} -g {group} --days 1', - checks=[self.check("name", name), - self.check("resourceGroup", group), - self.exists("suppressionIds")]) + self.cmd('advisor recommendation disable --ids {recommendation_id} --days 1', + checks=[self.check("[0].id", recommendation_id), + self.exists("[0].suppressionIds")]) # Disable again should create another suppression - self.cmd('advisor recommendation disable -n {name} -g {group}', - checks=[self.check("name", name), - self.check("resourceGroup", group), - self.greater_than("length(suppressionIds)", 1)]) + self.cmd('advisor recommendation disable --ids {recommendation_id}', + checks=[self.check("[0].id", recommendation_id), + self.greater_than("length([0].suppressionIds)", 1)]) # Enable should remove all suppressions - self.cmd('advisor recommendation enable -n {name} -g {group}') - self.cmd('advisor recommendation list --ids {ids}', - checks=[self.check("[0].name", name), - self.check("[0].resourceGroup", group), + self.cmd('advisor recommendation enable --ids {recommendation_id}', + checks=[self.check("[0].id", recommendation_id), self.check("[0].suppressionIds", None)]) # Enable again should be a no op - self.cmd('advisor recommendation enable -n {name} -g {group}') - self.cmd('advisor recommendation list --ids {ids}', + self.cmd('advisor recommendation enable --ids {recommendation_id}', + checks=[self.check("[0].id", recommendation_id), + self.check("[0].suppressionIds", None)]) + + def test_recommendations_resource_group(self): + resource_group = 'AzExpertStg' + self.kwargs.update({ + 'resource_group': resource_group + }) + + # List should return at least one recommendation with filters + output = self.cmd('advisor recommendation list --resource-group {resource_group}', + checks=self.check("[0].resourceGroup", resource_group)).get_output_in_json() + + # Set the recommendation details to use with further commands + resource_id = _parse_recommendation_uri(output[0]['id'])['resource_uri'] + name = output[0]['name'] + self.kwargs.update({ + 'resource_id': resource_id, + 'name': name + }) + + # Disable with specified duration should create a suppression + self.cmd('advisor recommendation disable -n {name} -g {resource_group} --days 1', + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", resource_group), + self.exists("[0].suppressionIds")]) + + # Disable again should create another suppression + self.cmd('advisor recommendation disable -n {name} -g {resource_group}', checks=[self.check("[0].name", name), - self.check("[0].resourceGroup", group), + self.check("[0].resourceGroup", resource_group), + self.greater_than("length([0].suppressionIds)", 1)]) + + # Enable should remove all suppressions + self.cmd('advisor recommendation enable -n {name} -g {resource_group}', + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", resource_group), self.check("[0].suppressionIds", None)]) - # List should return at least one recommendation without any filters - self.cmd('advisor recommendation list --refresh', - checks=self.check("[?category=='Security'].category | [0]", 'Security')) + # Enable again should be a no op + self.cmd('advisor recommendation enable -n {name} -g {resource_group}', + checks=[self.check("[0].name", name), + self.check("[0].resourceGroup", resource_group), + self.check("[0].suppressionIds", None)]) class AzureAdvisorScenarioTest(ScenarioTest): def test_configurations_subscription(self): - subscriptionId = self.cmd('account show').get_output_in_json()['id'] - # Show should always return a default self.cmd('advisor configuration show', - checks=[self.check("name", subscriptionId)]) + checks=[self.check("type", "Microsoft.Advisor/Configurations")]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --low-cpu-threshold 15 --exclude') self.cmd('advisor configuration show', - checks=[self.check("name", subscriptionId), - self.check("properties.lowCpuThreshold", "15"), + checks=[self.check("properties.lowCpuThreshold", "15"), self.check("properties.exclude", True)]) # Show should reflect the changes made by Update self.cmd('advisor configuration update --low-cpu-threshold 5 --include') self.cmd('advisor configuration show', - checks=[self.check("name", subscriptionId), - self.check("properties.lowCpuThreshold", "5"), + checks=[self.check("properties.lowCpuThreshold", "5"), self.check("properties.exclude", False)]) # List should reflect the changes made by Update self.cmd('advisor configuration list', - checks=[self.check("[0].name", subscriptionId), - self.check("[0].properties.lowCpuThreshold", "5"), + checks=[self.check("[0].properties.lowCpuThreshold", "5"), self.check("[0].properties.exclude", False)]) @ResourceGroupPreparer(name_prefix='cli_test_advisor') - def test_configurations_subscription(self, resource_group): + def test_configurations_resource_group(self, resource_group): # Show should always return a default even for a brand new resource group self.cmd('advisor configuration show -g {rg}', checks=[self.check("resourceGroup", resource_group)]) From 710f4c4e3f7aedec07ccadd2391ad1521fd41998 Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Mon, 26 Feb 2018 13:28:25 -0800 Subject: [PATCH 19/22] Fix test failures. --- .../test_configurations_resource_group.yaml | 56 ++--- .../test_configurations_subscription.yaml | 137 +++++++++--- .../test_generate_recommendations.yaml | 55 ----- ...t_get_set_configurations_subscription.yaml | 141 ------------- ..._update_configurations_resource_group.yaml | 195 ------------------ ...st_update_configurations_subscription.yaml | 141 ------------- 6 files changed, 142 insertions(+), 583 deletions(-) delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml delete mode 100644 src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml index 848f11bfa60..c3a254dffbc 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml @@ -10,7 +10,7 @@ interactions: Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.28] + AZURECLI/2.0.29] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 @@ -20,12 +20,12 @@ interactions: cache-control: [no-cache] content-length: ['328'] content-type: [application/json; charset=utf-8] - date: ['Sat, 24 Feb 2018 01:19:31 GMT'] + date: ['Mon, 26 Feb 2018 21:25:54 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: body: null @@ -36,7 +36,7 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -46,7 +46,7 @@ interactions: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Sat, 24 Feb 2018 01:19:33 GMT'] + date: ['Mon, 26 Feb 2018 21:25:56 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -54,7 +54,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: body: null @@ -65,7 +65,7 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -75,7 +75,7 @@ interactions: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Sat, 24 Feb 2018 01:19:34 GMT'] + date: ['Mon, 26 Feb 2018 21:25:57 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -83,7 +83,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", @@ -97,7 +97,7 @@ interactions: Content-Length: ['509'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -105,13 +105,13 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Sat, 24 Feb 2018 01:19:35 GMT'] + date: ['Mon, 26 Feb 2018 21:25:58 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['198'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] status: {code: 204, message: No Content} - request: body: null @@ -122,7 +122,7 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -132,7 +132,7 @@ interactions: cache-control: [no-cache] content-length: ['513'] content-type: [application/json; charset=utf-8] - date: ['Sat, 24 Feb 2018 01:19:35 GMT'] + date: ['Mon, 26 Feb 2018 21:25:59 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -140,7 +140,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['597'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: body: null @@ -151,7 +151,7 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -161,7 +161,7 @@ interactions: cache-control: [no-cache] content-length: ['513'] content-type: [application/json; charset=utf-8] - date: ['Sat, 24 Feb 2018 01:19:38 GMT'] + date: ['Mon, 26 Feb 2018 21:26:00 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -169,7 +169,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001", @@ -183,7 +183,7 @@ interactions: Content-Length: ['510'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -191,13 +191,13 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Sat, 24 Feb 2018 01:19:39 GMT'] + date: ['Mon, 26 Feb 2018 21:26:01 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['198'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] status: {code: 204, message: No Content} - request: body: null @@ -208,7 +208,7 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.28] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -218,7 +218,7 @@ interactions: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Sat, 24 Feb 2018 01:19:40 GMT'] + date: ['Mon, 26 Feb 2018 21:26:03 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -226,7 +226,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: body: null @@ -239,7 +239,7 @@ interactions: Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.28] + AZURECLI/2.0.29] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 @@ -248,12 +248,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Sat, 24 Feb 2018 01:19:42 GMT'] + date: ['Mon, 26 Feb 2018 21:26:04 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkRYSjNPUlpMSVVENTVZWUZKS1JWM0hTWTRWS3w5OEMxNzQ2RDE4QTVFRTNBLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUjZXNlJCTUJUQklYQTZYTDZETkw1RzRXR0dKNnxFMURERDhBMUE3Q0I1N0M1LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1196'] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml index 8e10a023c34..7a4022fcb05 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml @@ -4,21 +4,50 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration list] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme","properties":{"exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['798'] + content-type: [application/json; charset=utf-8] + date: ['Mon, 26 Feb 2018 21:26:06 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['1756'] + content-length: ['798'] content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:54 GMT'] + date: ['Mon, 26 Feb 2018 21:26:07 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -29,16 +58,18 @@ interactions: x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: - body: '{"properties": {"low_cpu_threshold": "20"}}' + body: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258", + "properties": {"exclude": true, "low_cpu_threshold": "15"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Length: ['43'] + Content-Length: ['293'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -46,7 +77,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Tue, 23 Jan 2018 22:37:56 GMT'] + date: ['Mon, 26 Feb 2018 21:26:08 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -59,21 +90,21 @@ interactions: headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration list] + CommandName: [advisor configuration show] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"15","exclude":true}}]}'} headers: cache-control: [no-cache] - content-length: ['1757'] + content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:57 GMT'] + date: ['Mon, 26 Feb 2018 21:26:09 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -84,16 +115,47 @@ interactions: x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: - body: '{"properties": {"low_cpu_threshold": "5"}}' + body: null headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Length: ['42'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"15","exclude":true}}]}'} + headers: + cache-control: [no-cache] + content-length: ['295'] + content-type: [application/json; charset=utf-8] + date: ['Mon, 26 Feb 2018 21:26:10 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + status: {code: 200, message: OK} +- request: + body: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258", + "type": "Microsoft.Advisor/Configurations", "name": "658c8950-e79d-4704-a903-1df66ba90258", + "properties": {"exclude": false, "low_cpu_threshold": "5"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration update] + Connection: [keep-alive] + Content-Length: ['293'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -101,7 +163,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Tue, 23 Jan 2018 22:37:58 GMT'] + date: ['Mon, 26 Feb 2018 21:26:10 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -109,6 +171,35 @@ interactions: x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + CommandName: [advisor configuration show] + Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] + User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + accept-language: [en-US] + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 + response: + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}}]}'} + headers: + cache-control: [no-cache] + content-length: ['295'] + content-type: [application/json; charset=utf-8] + date: ['Mon, 26 Feb 2018 21:26:12 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-HTTPAPI/2.0] + strict-transport-security: [max-age=31536000; includeSubDomains] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + status: {code: 200, message: OK} - request: body: null headers: @@ -118,17 +209,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] + msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}}]}'} headers: cache-control: [no-cache] - content-length: ['1756'] + content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:59 GMT'] + date: ['Mon, 26 Feb 2018 21:26:11 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -138,4 +229,4 @@ interactions: x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} -version: 1 \ No newline at end of file +version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml deleted file mode 100644 index d58f238cb67..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_generate_recommendations.yaml +++ /dev/null @@ -1,55 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation generate] - Connection: [keep-alive] - Content-Length: ['0'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: POST - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - date: ['Thu, 18 Jan 2018 00:40:59 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/6180573c-fbd7-45b8-88ef-32c7a8789d43?api-version=2017-04-19'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor recommendation generate] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/generateRecommendations/6180573c-fbd7-45b8-88ef-32c7a8789d43?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:40:59 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['359'] - status: {code: 204, message: No Content} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml deleted file mode 100644 index 7e4258718b0..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_get_set_configurations_subscription.yaml +++ /dev/null @@ -1,141 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1804'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:09 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"low_cpu_threshold": "20"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] - Connection: [keep-alive] - Content-Length: ['43'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:41:10 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1805'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:11 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"low_cpu_threshold": "5"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration set] - Connection: [keep-alive] - Content-Length: ['42'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Thu, 18 Jan 2018 00:41:12 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration get] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisoralrv2rr3czuas4u272e5gq7sczyz5sk7dfnkp7mt5qgildyebpzr3ghy5ut","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorpsibuvw42bho272s4dtfdnhrqx3vcrpzuf4hm3dgkte4umuu2bnz7p2ydqx","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74/providers/Microsoft.Advisor/configurations/70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","type":"Microsoft.Advisor/Configurations","name":"70b0b95c-8a41-41c0-8e3f-3ed8351a2d61-cli_test_advisorepc5w5yzqe7sxop257njtsewqjkfr7qmaselzurr3v2shwhnvg22yt55v74","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1804'] - content-type: [application/json; charset=utf-8] - date: ['Thu, 18 Jan 2018 00:41:13 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml deleted file mode 100644 index d5f26ca2567..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_resource_group.yaml +++ /dev/null @@ -1,195 +0,0 @@ -interactions: -- request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [group create] - Connection: [keep-alive] - Content-Length: ['50'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 - response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} - headers: - cache-control: [no-cache] - content-length: ['328'] - content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:47 GMT'] - expires: ['-1'] - pragma: [no-cache] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 201, message: Created} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['514'] - content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:48 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"exclude": true}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration update] - Connection: [keep-alive] - Content-Length: ['33'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Tue, 23 Jan 2018 22:37:49 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":true}}]}'} - headers: - cache-control: [no-cache] - content-length: ['513'] - content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:51 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"exclude": false}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration update] - Connection: [keep-alive] - Content-Length: ['34'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Tue, 23 Jan 2018 22:37:51 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor000001","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['514'] - content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:53 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [group delete] - Connection: [keep-alive] - Content-Length: ['0'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.26] - accept-language: [en-US] - method: DELETE - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2017-05-10 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - date: ['Tue, 23 Jan 2018 22:37:53 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUk9NVFUyVkJXUDZZRkFLQ0tCVFJGVUZJNkJZQnxDRUUxOUM4OTVDQ0Y2MENDLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] - pragma: [no-cache] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] - status: {code: 202, message: Accepted} -version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml deleted file mode 100644 index 8cbaf867d4e..00000000000 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/recordings/latest/test_list_update_configurations_subscription.yaml +++ /dev/null @@ -1,141 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1756'] - content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:54 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"low_cpu_threshold": "20"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration update] - Connection: [keep-alive] - Content-Length: ['43'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Tue, 23 Jan 2018 22:37:56 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"20","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1757'] - content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:57 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -- request: - body: '{"properties": {"low_cpu_threshold": "5"}}' - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration update] - Connection: [keep-alive] - Content-Length: ['42'] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: PUT - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - date: ['Tue, 23 Jan 2018 22:37:58 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['199'] - status: {code: 204, message: No Content} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [advisor configuration list] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.15 azure-mgmt-advisor/1.0.0 Azure-SDK-For-Python AZURECLI/2.0.26] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 - response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test_mgmt_advisor_test_configurations_resourcegroup27471558/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-test_mgmt_advisor_test_configurations_resourcegroup27471558","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisorzrzsmixlmhmtxcky54ghrruhgd2ivvesghf3pt2uoqv4cfwmrl3kzoulkw5","properties":{"exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisoromtu2vbwp6yfakckbtrfufi6bybjkonimhxiyi3tj6rfjhkn3emmfo6avth","properties":{"exclude":false}}]}'} - headers: - cache-control: [no-cache] - content-length: ['1756'] - content-type: [application/json; charset=utf-8] - date: ['Tue, 23 Jan 2018 22:37:59 GMT'] - expires: ['-1'] - pragma: [no-cache] - server: [Microsoft-HTTPAPI/2.0] - strict-transport-security: [max-age=31536000; includeSubDomains] - transfer-encoding: [chunked] - vary: [Accept-Encoding] - x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] - status: {code: 200, message: OK} -version: 1 From ded97f4dc514e3a84fb1dbda9e6f5b4bdafaa0d6 Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Tue, 16 Oct 2018 09:38:21 -0700 Subject: [PATCH 20/22] Update to latest SDK version --- .../test_configurations_resource_group.yaml | 78 +++++++++---------- .../test_configurations_subscription.yaml | 64 +++++++-------- .../azure-cli-advisor/setup.py | 4 +- 3 files changed, 68 insertions(+), 78 deletions(-) diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml index 70cdb9ec6bb..93df0e0a39f 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml @@ -1,26 +1,27 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-10-16T16:36:01Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 resourcemanagementclient/2.0.0 Azure-SDK-For-Python + AZURECLI/2.0.48] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2018-05-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001","name":"cli_test_advisor000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-10-16T16:36:01Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:25:54 GMT'] + date: ['Tue, 16 Oct 2018 16:36:02 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -34,9 +35,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration show] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -46,7 +46,7 @@ interactions: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:25:56 GMT'] + date: ['Tue, 16 Oct 2018 16:36:03 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -54,7 +54,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] status: {code: 200, message: OK} - request: body: null @@ -63,9 +63,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -75,7 +74,7 @@ interactions: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:25:57 GMT'] + date: ['Tue, 16 Oct 2018 16:36:04 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -96,8 +95,8 @@ interactions: Connection: [keep-alive] Content-Length: ['509'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -105,7 +104,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 26 Feb 2018 21:25:58 GMT'] + date: ['Tue, 16 Oct 2018 16:36:05 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -120,9 +119,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration show] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -132,7 +130,7 @@ interactions: cache-control: [no-cache] content-length: ['513'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:25:59 GMT'] + date: ['Tue, 16 Oct 2018 16:36:05 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -149,9 +147,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -161,7 +158,7 @@ interactions: cache-control: [no-cache] content-length: ['513'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:26:00 GMT'] + date: ['Tue, 16 Oct 2018 16:36:05 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -182,8 +179,8 @@ interactions: Connection: [keep-alive] Content-Length: ['510'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -191,7 +188,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 26 Feb 2018 21:26:01 GMT'] + date: ['Tue, 16 Oct 2018 16:36:07 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -206,9 +203,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration show] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor000001/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -218,7 +214,7 @@ interactions: cache-control: [no-cache] content-length: ['514'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:26:03 GMT'] + date: ['Tue, 16 Oct 2018 16:36:07 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -237,9 +233,9 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 resourcemanagementclient/2.0.0 Azure-SDK-For-Python + AZURECLI/2.0.48] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_advisor000001?api-version=2018-05-01 @@ -248,12 +244,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Mon, 26 Feb 2018 21:26:04 GMT'] + date: ['Tue, 16 Oct 2018 16:36:08 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUjZXNlJCTUJUQklYQTZYTDZETkw1RzRXR0dKNnxFMURERDhBMUE3Q0I1N0M1LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2018-05-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUkUyMkg0NU5WSVJXU05KVFJXVzRWREFHR1pQQXw3RjExMzQxMkZBNTM4MzQwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2018-05-01'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-deletes: ['14999'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml index 7a4022fcb05..12a23c37ece 100644 --- a/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml @@ -6,19 +6,18 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration show] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisore22h45nvirwsnjtrww4vdaggzpayn7klavyd7jceba4e2kqp7roq2yivksr/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisore22h45nvirwsnjtrww4vdaggzpayn7klavyd7jceba4e2kqp7roq2yivksr","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisore22h45nvirwsnjtrww4vdaggzpayn7klavyd7jceba4e2kqp7roq2yivksr","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['798'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:26:06 GMT'] + date: ['Tue, 16 Oct 2018 16:36:09 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -35,19 +34,18 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 response: - body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisor6w6rbmbtbixa6xl6dnl5g4wggj6wxcvuv2h656wujhxqnhottbgusvinhme","properties":{"exclude":false}}]}'} + body: {string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258","properties":{"low_cpu_threshold":"5","exclude":false}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_advisore22h45nvirwsnjtrww4vdaggzpayn7klavyd7jceba4e2kqp7roq2yivksr/providers/Microsoft.Advisor/configurations/658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisore22h45nvirwsnjtrww4vdaggzpayn7klavyd7jceba4e2kqp7roq2yivksr","type":"Microsoft.Advisor/Configurations","name":"658c8950-e79d-4704-a903-1df66ba90258-cli_test_advisore22h45nvirwsnjtrww4vdaggzpayn7klavyd7jceba4e2kqp7roq2yivksr","properties":{"exclude":false}}]}'} headers: cache-control: [no-cache] content-length: ['798'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:26:07 GMT'] + date: ['Tue, 16 Oct 2018 16:36:10 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -68,8 +66,8 @@ interactions: Connection: [keep-alive] Content-Length: ['293'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -77,7 +75,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 26 Feb 2018 21:26:08 GMT'] + date: ['Tue, 16 Oct 2018 16:36:11 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -92,9 +90,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration show] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -104,7 +101,7 @@ interactions: cache-control: [no-cache] content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:26:09 GMT'] + date: ['Tue, 16 Oct 2018 16:36:12 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -112,7 +109,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] status: {code: 200, message: OK} - request: body: null @@ -121,9 +118,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration update] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -133,7 +129,7 @@ interactions: cache-control: [no-cache] content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:26:10 GMT'] + date: ['Tue, 16 Oct 2018 16:36:13 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -154,8 +150,8 @@ interactions: Connection: [keep-alive] Content-Length: ['293'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -163,7 +159,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 26 Feb 2018 21:26:10 GMT'] + date: ['Tue, 16 Oct 2018 16:36:13 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -178,9 +174,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration show] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -190,7 +185,7 @@ interactions: cache-control: [no-cache] content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:26:12 GMT'] + date: ['Tue, 16 Oct 2018 16:36:15 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -198,7 +193,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: body: null @@ -207,9 +202,8 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [advisor configuration list] Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.3 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.18 - msrest_azure/0.4.21 azure-mgmt-advisor/1.0.1 Azure-SDK-For-Python AZURECLI/2.0.29] + User-Agent: [python/3.6.3 (Windows-10-10.0.17763-SP0) requests/2.18.4 msrest/0.5.1 + msrest_azure/0.4.34 azure-mgmt-advisor/2.0.0 Azure-SDK-For-Python AZURECLI/2.0.48] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Advisor/configurations?api-version=2017-04-19 @@ -219,7 +213,7 @@ interactions: cache-control: [no-cache] content-length: ['295'] content-type: [application/json; charset=utf-8] - date: ['Mon, 26 Feb 2018 21:26:11 GMT'] + date: ['Tue, 16 Oct 2018 16:36:15 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -227,6 +221,6 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] + x-ms-ratelimit-remaining-subscription-resource-requests: ['598'] status: {code: 200, message: OK} version: 1 diff --git a/src/command_modules/azure-cli-advisor/setup.py b/src/command_modules/azure-cli-advisor/setup.py index 47d353a70d0..4df29de270b 100644 --- a/src/command_modules/azure-cli-advisor/setup.py +++ b/src/command_modules/azure-cli-advisor/setup.py @@ -14,7 +14,7 @@ logger.warn("Wheel is not available, disabling bdist_wheel hook") cmdclass = {} -VERSION = "0.6.0" +VERSION = "2.0.0" # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers @@ -33,7 +33,7 @@ DEPENDENCIES = [ 'azure-cli-core', - 'azure-mgmt-advisor==1.0.1' + 'azure-mgmt-advisor==2.0.0' ] with open('README.rst', 'r', encoding='utf-8') as f: From 7b4fc7a9e0c6adb41b46ec6da05f1308969e7a5c Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Tue, 16 Oct 2018 09:57:35 -0700 Subject: [PATCH 21/22] Update history --- src/command_modules/azure-cli-advisor/HISTORY.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/command_modules/azure-cli-advisor/HISTORY.rst b/src/command_modules/azure-cli-advisor/HISTORY.rst index a0da7a4d05d..889e74614de 100644 --- a/src/command_modules/azure-cli-advisor/HISTORY.rst +++ b/src/command_modules/azure-cli-advisor/HISTORY.rst @@ -3,6 +3,10 @@ Release History =============== +2.0.0 +++++++ +* GA release. + 0.6.0 +++++ * BREAKING CHANGE: 'show' commands log error message and fail with exit code of 3 upon a missing resource. From ed97fd637de1e344b075e4b0ca7fac2b6eadca40 Mon Sep 17 00:00:00 2001 From: Prasanna-Padmanabhan <31525198+Prasanna-Padmanabhan@users.noreply.github.com> Date: Tue, 16 Oct 2018 11:50:54 -0700 Subject: [PATCH 22/22] Reference new package version --- src/command_modules/azure-cli-advisor/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command_modules/azure-cli-advisor/setup.py b/src/command_modules/azure-cli-advisor/setup.py index 4df29de270b..a6f8fd45a7b 100644 --- a/src/command_modules/azure-cli-advisor/setup.py +++ b/src/command_modules/azure-cli-advisor/setup.py @@ -33,7 +33,7 @@ DEPENDENCIES = [ 'azure-cli-core', - 'azure-mgmt-advisor==2.0.0' + 'azure-mgmt-advisor==2.0.1' ] with open('README.rst', 'r', encoding='utf-8') as f: