diff --git a/src/command_modules/azure-cli-advisor/HISTORY.rst b/src/command_modules/azure-cli-advisor/HISTORY.rst index 969f96aabc8..4137fb6d8f9 100644 --- a/src/command_modules/azure-cli-advisor/HISTORY.rst +++ b/src/command_modules/azure-cli-advisor/HISTORY.rst @@ -3,6 +3,14 @@ Release History =============== +0.5.0 +++++++ +* 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.2 +++++ * Minor fixes. 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..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,17 +10,17 @@ 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, 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/_help.py b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/_help.py index 856bf8b19a7..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 @@ -7,7 +7,7 @@ helps['advisor'] = """ type: group - short-summary: (PREVIEW) Manage Azure Advisor. + short-summary: Manage Azure Advisor. """ helps['advisor configuration'] = """ @@ -20,19 +20,26 @@ 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 for the entire subscription. """ -helps['advisor configuration set'] = """ +helps['advisor configuration show'] = """ type: command - short-summary: Set Azure Advisor configuration. + short-summary: Show Azure Advisor configuration for the given subscription or resource group. """ -helps['advisor recommendation generate'] = """ +helps['advisor configuration update'] = """ type: command - short-summary: Generate Azure Advisor recommendations. + 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 aaee7e686f4..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 @@ -5,9 +5,15 @@ 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, validate_ids_or_resource_group +from ._validators import \ + (validate_include_or_exclude, + validate_ids_or_names, + validate_ids_or_resource_group, + validate_threshold_or_resource_group) def load_arguments(self, _): @@ -15,22 +21,33 @@ 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'], + 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', '-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('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('ids', ids_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 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..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,16 @@ 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') + + +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..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 @@ -6,21 +6,28 @@ 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) 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('generate', 'cli_advisor_generate_recommendations', - client_factory=recommendations_mgmt_client_factory) - 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', - client_factory=suppressions_mgmt_client_factory) - g.custom_command('enable', 'cli_advisor_enable_recommendations', + g.custom_command('disable', 'disable_recommendations', + client_factory=advisor_mgmt_client_factory) + 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('get', 'cli_advisor_get_configurations') - g.custom_command('set', 'cli_advisor_set_configurations') + g.custom_command('list', 'list_configuration') + g.custom_command('show', 'show_configuration') + g.generic_update_command('update', + getter_name='show_configuration', + getter_type=advisor_custom, + setter_name='_set_configuration', + setter_type=advisor_custom, + 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 db17f05b583..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 @@ -5,102 +5,92 @@ import uuid -from msrestazure.azure_exceptions import CloudError -from azure.mgmt.advisor.models import ConfigData, ConfigDataProperties +def 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_generate_recommendations(client): - response = client.generate(raw=True) - location = response.headers['Location'] - operation_id = parse_operation_id(location) +def disable_recommendations(client, ids=None, recommendation_name=None, + resource_group_name=None, days=None): + recs = _get_recommendations( + client=client.recommendations, + ids=ids, + resource_group_name=resource_group_name, + recommendation_name=recommendation_name) - 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): - scope = build_filter_string(ids, resource_group_name, category) - return client.list(scope) + 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_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, + sup = client.suppressions.create( + resource_uri=resource_uri, + recommendation_id=recommendation_id, + name=suppression_name, ttl=ttl ) - suppressions.append(client.get( - resource_uri=resourceUri, - recommendation_id=recommendationId, - name=suppressionName - )) - return suppressions - - -def cli_advisor_enable_recommendations(client, ids): - enabledRecs = [] - allSups = list(client.suppressions.list()) - 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 = 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 - ) + + if rec.suppression_ids: + rec.suppression_ids.append(sup.suppression_id) + else: + rec.suppression_ids = [sup.suppression_id] + + return recs + + +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 - enabledRecs.append(rec) - return enabledRecs + return recs -def cli_advisor_get_configurations(client, resource_group_name=None): - if resource_group_name: - return client.list_by_resource_group(resource_group_name) + +def list_configuration(client): return client.list_by_subscription() -def cli_advisor_set_configurations(client, resource_group_name=None, - low_cpu_threshold=None, exclude=None, include=None): +def show_configuration(client, resource_group_name=None): + output = None + if resource_group_name: + 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] - cfg = ConfigData() - cfg.properties = ConfigDataProperties() - cfg.properties.low_cpu_threshold = low_cpu_threshold - cfg.properties.exclude = exclude +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: - cfg.properties.exclude = False - - if resource_group_name: - return client.create_in_resource_group( - config_contract=cfg, - resource_group=resource_group_name) + instance.properties.exclude = False - return client.create_in_subscription(cfg) + return instance -def 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: @@ -120,7 +110,7 @@ def build_filter_string(ids=None, resource_group_name=None, category=None): return None -def 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') @@ -129,7 +119,53 @@ def parse_operation_id(location): return operation_id -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 _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 + recommendation_id = recommendation_uri[rStart:rEnd] + return {'resource_uri': resource_uri, 'recommendation_id': recommendation_id} + + +def _generate_recommendations(client): + from msrestazure.azure_exceptions import CloudError + + 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 _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_get_set_configurations_resource_group.yaml b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_resource_group.yaml similarity index 51% 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_resource_group.yaml index a58e2291dd7..c3a254dffbc 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_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.21 resourcemanagementclient/1.2.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?api-version=2017-05-10 @@ -20,10 +20,11 @@ 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: ['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: ['1199'] status: {code: 201, message: Created} - request: @@ -31,21 +32,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.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 + 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: ['Mon, 26 Feb 2018 21:25:56 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.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 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: ['Mon, 26 Feb 2018 21:25:57 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -56,16 +86,18 @@ interactions: x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: - body: '{"properties": {"exclude": true}}' + 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.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 @@ -73,7 +105,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:47 GMT'] + date: ['Mon, 26 Feb 2018 21:25:58 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -86,21 +118,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.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 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: ['Mon, 26 Feb 2018 21:25:59 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -111,16 +143,47 @@ interactions: x-ms-ratelimit-remaining-subscription-resource-requests: ['599'] status: {code: 200, message: OK} - request: - body: '{"properties": {"exclude": false}}' + body: null 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] - 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.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 + 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: ['Mon, 26 Feb 2018 21:26:00 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": 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.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 @@ -128,7 +191,7 @@ interactions: body: {string: ''} headers: cache-control: [no-cache] - date: ['Mon, 11 Dec 2017 22:58:48 GMT'] + date: ['Mon, 26 Feb 2018 21:26:01 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -141,21 +204,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.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 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: ['Mon, 26 Feb 2018 21:26:03 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0] @@ -174,9 +237,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.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 @@ -185,11 +248,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Mon, 11 Dec 2017 22:58:50 GMT'] + date: ['Mon, 26 Feb 2018 21:26:04 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/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGQURWSVNPUjZXNlJCTUJUQklYQTZYTDZETkw1RzRXR0dKNnxFMURERDhBMUE3Q0I1N0M1LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-content-type-options: [nosniff] + 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 new file mode 100644 index 00000000000..7a4022fcb05 --- /dev/null +++ b/src/command_modules/azure-cli-advisor/azure/cli/command_modules/advisor/tests/latest/recordings/test_configurations_subscription.yaml @@ -0,0 +1,232 @@ +interactions: +- 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}},{"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.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: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: '{"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: ['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 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Mon, 26 Feb 2018 21:26:08 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 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":"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: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: 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.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 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + 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] + 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: + 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.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: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} +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 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 42f6a97d414..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 @@ -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 build_filter_string, parse_operation_id, parse_recommendation_uri - -# pylint: disable=line-too-long +from azure.cli.command_modules.advisor.custom import ( + _build_filter_string, + _parse_operation_id, + _parse_recommendation_uri) class AzureAdvisorUnitTest(unittest.TestCase): @@ -19,81 +21,173 @@ 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'") - - 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 = parse_operation_id(location) + 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'") + + 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 = _parse_operation_id(location) self.assertEqual(operation_id, 'a9544ca5-5837-4cb4-94d6-bad2b6e76320') - 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' - result = parse_recommendation_uri(recommendation_uri) + 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 = _parse_recommendation_uri(recommendation_uri) self.assertEqual( - result['resourceUri'], - '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/providers/Microsoft.Network/expressRouteCircuits/test' - ) - self.assertEqual(result['recommendationId'], 'c4deb869-ea38-f90d-331f-91770021d425') + result['resource_uri'], + ("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo" + "/providers/Microsoft.Network/expressRouteCircuits/test")) + self.assertEqual(result['recommendation_id'], 'c4deb869-ea38-f90d-331f-91770021d425') 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() - 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 + rec = output[0] + name = rec['name'] + recommendation_id = rec['id'] + resource_id = _parse_recommendation_uri(recommendation_id) + self.kwargs.update({ + 'name': name, + 'recommendation_id': recommendation_id, + 'resource_id': resource_id + }) + + # Disable with specified duration should create a suppression + 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 --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 --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 --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({ - 'recommendation_id': output[0]['id'] + 'resource_group': resource_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) + + # 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", 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)]) + + # 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_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() - self.assertGreater(len(output), 1) - self.cmd('advisor configuration set --low-cpu-threshold 20') - output = self.cmd('advisor configuration get').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() - for entry in output['value']: - if entry['properties']['lowCpuThreshold']: - self.assertEqual(entry['properties']['lowCpuThreshold'], '5') + def test_configurations_subscription(self): + # Show should always return a default + self.cmd('advisor configuration show', + 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("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("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].properties.lowCpuThreshold", "5"), + self.check("[0].properties.exclude", False)]) @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() - 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.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.assertGreater(len(output), 0) - self.assertTrue(not output['value'][0]['properties']['exclude']) + 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)]) + + # 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__': diff --git a/src/command_modules/azure-cli-advisor/setup.py b/src/command_modules/azure-cli-advisor/setup.py index 3f01eae189b..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 = "0.1.2" +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==0.1.0' + 'azure-mgmt-advisor==1.0.1' ] with open('README.rst', 'r', encoding='utf-8') as f: