From 48b348b7ddadaef841ce61358b79746930e7cfc0 Mon Sep 17 00:00:00 2001 From: Sisira Panchagnula Date: Tue, 18 Feb 2020 17:01:10 -0800 Subject: [PATCH 1/3] Fixing issue where trying to create a webapp with certain runtimes was failing updating history Upating to make sure NODE works as well when trying to set app_Settings Pylint fixes --- src/azure-cli/HISTORY.rst | 3 + .../cli/command_modules/appservice/custom.py | 704 ++++++++++++------ 2 files changed, 472 insertions(+), 235 deletions(-) diff --git a/src/azure-cli/HISTORY.rst b/src/azure-cli/HISTORY.rst index 95a5f345787..8a1e5b8e3ec 100644 --- a/src/azure-cli/HISTORY.rst +++ b/src/azure-cli/HISTORY.rst @@ -3,6 +3,9 @@ Release History =============== +**AppService** +az webapp create : Fixing issue when running the command with --runtime + 2.1.0 ++++++ diff --git a/src/azure-cli/azure/cli/command_modules/appservice/custom.py b/src/azure-cli/azure/cli/command_modules/appservice/custom.py index d3ed0ff0bb0..7f87ec9194b 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/custom.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/custom.py @@ -76,14 +76,17 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi SiteConfig, SkuDescription, Site, NameValuePair = cmd.get_models( 'SiteConfig', 'SkuDescription', 'Site', 'NameValuePair') if deployment_source_url and deployment_local_git: - raise CLIError('usage error: --deployment-source-url | --deployment-local-git') + raise CLIError( + 'usage error: --deployment-source-url | --deployment-local-git') - docker_registry_server_url = parse_docker_image_name(deployment_container_image_name) + docker_registry_server_url = parse_docker_image_name( + deployment_container_image_name) client = web_client_factory(cmd.cli_ctx) if is_valid_resource_id(plan): parse_result = parse_resource_id(plan) - plan_info = client.app_service_plans.get(parse_result['resource_group'], parse_result['name']) + plan_info = client.app_service_plans.get( + parse_result['resource_group'], parse_result['name']) else: plan_info = client.app_service_plans.get(resource_group_name, plan) if not plan_info: @@ -97,7 +100,7 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi site_config.always_on = True webapp_def = Site(location=location, site_config=site_config, server_farm_id=plan_info.id, tags=tags, https_only=using_webapp_up) - helper = _StackRuntimeHelper(cmd, client, linux=is_linux) + helper = _StackRuntimeHelper(cmd=cmd, client=client, linux=is_linux) if is_linux: if not validate_container_app_create_options(runtime, deployment_container_image_name, @@ -114,15 +117,19 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi raise CLIError("Linux Runtime '{}' is not supported." "Please invoke 'list-runtimes' to cross check".format(runtime)) elif deployment_container_image_name: - site_config.linux_fx_version = _format_fx_version(deployment_container_image_name) + site_config.linux_fx_version = _format_fx_version( + deployment_container_image_name) site_config.app_settings.append(NameValuePair(name="WEBSITES_ENABLE_APP_SERVICE_STORAGE", value="false")) elif multicontainer_config_type and multicontainer_config_file: - encoded_config_file = _get_linux_multicontainer_encoded_config_from_file(multicontainer_config_file) - site_config.linux_fx_version = _format_fx_version(encoded_config_file, multicontainer_config_type) + encoded_config_file = _get_linux_multicontainer_encoded_config_from_file( + multicontainer_config_file) + site_config.linux_fx_version = _format_fx_version( + encoded_config_file, multicontainer_config_type) elif plan_info.is_xenon: # windows container webapp - site_config.windows_fx_version = _format_fx_version(deployment_container_image_name) + site_config.windows_fx_version = _format_fx_version( + deployment_container_image_name) elif runtime: # windows webapp with runtime specified if any([startup_file, deployment_container_image_name, multicontainer_config_file, multicontainer_config_type]): @@ -131,7 +138,8 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi "only appliable on linux webapp") match = helper.resolve(runtime) if not match: - raise CLIError("Runtime '{}' is not supported. Please invoke 'list-runtimes' to cross check".format(runtime)) # pylint: disable=line-too-long + raise CLIError("Runtime '{}' is not supported. Please invoke 'list-runtimes' to cross check".format( + runtime)) # pylint: disable=line-too-long match['setter'](cmd, match, site_config) # Be consistent with portal: any windows webapp should have this even it doesn't have node in the stack if not match['displayName'].startswith('node'): @@ -146,12 +154,14 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi logger.info('Will set appsetting %s', setting) if using_webapp_up: # when the routine is invoked as a help method for webapp up logger.info("will set appsetting for enabling build") - site_config.app_settings.append(NameValuePair(name="SCM_DO_BUILD_DURING_DEPLOYMENT", value=True)) + site_config.app_settings.append(NameValuePair( + name="SCM_DO_BUILD_DURING_DEPLOYMENT", value=True)) if language is not None and language.lower() == 'dotnetcore': site_config.app_settings.append(NameValuePair(name='ANCM_ADDITIONAL_ERROR_PAGE_LINK', value='https://{}.scm.azurewebsites.net/detectors'.format(name))) - poller = client.web_apps.create_or_update(resource_group_name, name, webapp_def) + poller = client.web_apps.create_or_update( + resource_group_name, name, webapp_def) webapp = LongRunningOperation(cmd.cli_ctx)(poller) # Ensure SCC operations follow right after the 'create', no precedent appsetting update commands @@ -172,8 +182,10 @@ def validate_container_app_create_options(runtime=None, deployment_container_ima multicontainer_config_type=None, multicontainer_config_file=None): if bool(multicontainer_config_type) != bool(multicontainer_config_file): return False - opts = [runtime, deployment_container_image_name, multicontainer_config_type] - return len([x for x in opts if x]) == 1 # you can only specify one out the combinations + opts = [runtime, deployment_container_image_name, + multicontainer_config_type] + # you can only specify one out the combinations + return len([x for x in opts if x]) == 1 def parse_docker_image_name(deployment_container_image_name): @@ -201,7 +213,8 @@ def update_app_settings(cmd, resource_group_name, name, settings=None, slot=None for s in src: try: temp = shell_safe_json_parse(s) - if isinstance(temp, list): # a bit messy, but we'd like accept the output of the "list" command + # a bit messy, but we'd like accept the output of the "list" command + if isinstance(temp, list): for t in temp: if t.get('slotSetting', True): slot_result[t['name']] = t['value'] @@ -226,11 +239,13 @@ def update_app_settings(cmd, resource_group_name, name, settings=None, slot=None app_settings_slot_cfg_names = [] if slot_result: new_slot_setting_names = slot_result.keys() - slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names( + resource_group_name, name) slot_cfg_names.app_setting_names = slot_cfg_names.app_setting_names or [] slot_cfg_names.app_setting_names += new_slot_setting_names app_settings_slot_cfg_names = slot_cfg_names.app_setting_names - client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names( + resource_group_name, name, slot_cfg_names) return _build_app_settings_output(result.properties, app_settings_slot_cfg_names) @@ -256,12 +271,14 @@ def add_azure_storage_account(cmd, resource_group_name, name, custom_id, storage slot, client) if slot_setting: - slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names( + resource_group_name, name) slot_cfg_names.azure_storage_config_names = slot_cfg_names.azure_storage_config_names or [] if custom_id not in slot_cfg_names.azure_storage_config_names: slot_cfg_names.azure_storage_config_names.append(custom_id) - client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names( + resource_group_name, name, slot_cfg_names) return result.properties @@ -273,7 +290,8 @@ def update_azure_storage_account(cmd, resource_group_name, name, custom_id, stor azure_storage_accounts = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_azure_storage_accounts', slot) - existing_account_config = azure_storage_accounts.properties.pop(custom_id, None) + existing_account_config = azure_storage_accounts.properties.pop( + custom_id, None) if not existing_account_config: raise CLIError("No Azure storage account configuration found with the id '{}'. " @@ -296,11 +314,13 @@ def update_azure_storage_account(cmd, resource_group_name, name, custom_id, stor slot, client) if slot_setting: - slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names( + resource_group_name, name) slot_cfg_names.azure_storage_config_names = slot_cfg_names.azure_storage_config_names or [] if custom_id not in slot_cfg_names.azure_storage_config_names: slot_cfg_names.azure_storage_config_names.append(custom_id) - client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names( + resource_group_name, name, slot_cfg_names) return result.properties @@ -340,7 +360,8 @@ def enable_zip_deploy_webapp(cmd, resource_group_name, name, src, timeout=None, def enable_zip_deploy(cmd, resource_group_name, name, src, timeout=None, slot=None): logger.warning("Getting scm site credentials for zip deployment") - user_name, password = _get_site_credential(cmd.cli_ctx, resource_group_name, name, slot) + user_name, password = _get_site_credential( + cmd.cli_ctx, resource_group_name, name, slot) try: scm_url = _get_scm_url(cmd, resource_group_name, name, slot) @@ -351,7 +372,8 @@ def enable_zip_deploy(cmd, resource_group_name, name, src, timeout=None, slot=No deployment_status_url = scm_url + '/api/deployments/latest' import urllib3 - authorization = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(user_name, password)) + authorization = urllib3.util.make_headers( + basic_auth='{0}:{1}'.format(user_name, password)) headers = authorization headers['content-type'] = 'application/octet-stream' headers['User-Agent'] = UA_AGENT @@ -362,9 +384,12 @@ def enable_zip_deploy(cmd, resource_group_name, name, src, timeout=None, slot=No # Read file content with open(os.path.realpath(os.path.expanduser(src)), 'rb') as fs: zip_content = fs.read() - logger.warning("Starting zip deployment. This operation can take a while to complete ...") - res = requests.post(zip_url, data=zip_content, headers=headers, verify=not should_disable_connection_verify()) - logger.warning("Deployment endpoint responded with status code %d", res.status_code) + logger.warning( + "Starting zip deployment. This operation can take a while to complete ...") + res = requests.post(zip_url, data=zip_content, headers=headers, + verify=not should_disable_connection_verify()) + logger.warning( + "Deployment endpoint responded with status code %d", res.status_code) # check if there's an ongoing process if res.status_code == 409: @@ -439,10 +464,12 @@ def upload_zip_to_storage(cmd, resource_group_name, name, src, slot=None): storage_connection = str(keyval['value']) if storage_connection is None: - raise CLIError('Could not find a \'AzureWebJobsStorage\' application setting') + raise CLIError( + 'Could not find a \'AzureWebJobsStorage\' application setting') container_name = "function-releases" - blob_name = "{}-{}.zip".format(datetime.datetime.today().strftime('%Y%m%d%H%M%S'), str(uuid.uuid4())) + blob_name = "{}-{}.zip".format( + datetime.datetime.today().strftime('%Y%m%d%H%M%S'), str(uuid.uuid4())) block_blob_service = BlockBlobService(connection_string=storage_connection) if not block_blob_service.exists(container_name): @@ -453,7 +480,8 @@ def progress_callback(current, total): total_length = 30 filled_length = int(round(total_length * current) / float(total)) percents = round(100.0 * current / float(total), 1) - progress_bar = '=' * filled_length + '-' * (total_length - filled_length) + progress_bar = '=' * filled_length + \ + '-' * (total_length - filled_length) progress_message = 'Uploading {} {}%'.format(progress_bar, percents) cmd.cli_ctx.get_progress_controller().add(message=progress_message) @@ -465,19 +493,23 @@ def progress_callback(current, total): blob_end = now + datetime.timedelta(weeks=520) blob_token = block_blob_service.generate_blob_shared_access_signature(container_name, blob_name, - permission=BlobPermissions(read=True), + permission=BlobPermissions( + read=True), expiry=blob_end, start=blob_start) - blob_uri = block_blob_service.make_blob_url(container_name, blob_name, sas_token=blob_token) + blob_uri = block_blob_service.make_blob_url( + container_name, blob_name, sas_token=blob_token) website_run_from_setting = "WEBSITE_RUN_FROM_PACKAGE={}".format(blob_uri) - update_app_settings(cmd, resource_group_name, name, settings=[website_run_from_setting]) + update_app_settings(cmd, resource_group_name, name, + settings=[website_run_from_setting]) client = web_client_factory(cmd.cli_ctx) try: logger.info('\nSyncing Triggers...') if slot is not None: - client.web_apps.sync_function_triggers_slot(resource_group_name, name, slot) + client.web_apps.sync_function_triggers_slot( + resource_group_name, name, slot) else: client.web_apps.sync_function_triggers(resource_group_name, name) except CloudError as ce: @@ -489,7 +521,8 @@ def progress_callback(current, total): def _generic_settings_operation(cli_ctx, resource_group_name, name, operation_name, setting_properties, slot=None, client=None): client = client or web_client_factory(cli_ctx) - operation = getattr(client.web_apps, operation_name if slot is None else operation_name + '_slot') + operation = getattr( + client.web_apps, operation_name if slot is None else operation_name + '_slot') if slot is None: return operation(resource_group_name, name, str, setting_properties) @@ -499,7 +532,8 @@ def _generic_settings_operation(cli_ctx, resource_group_name, name, operation_na def show_webapp(cmd, resource_group_name, name, slot=None, app_instance=None): webapp = app_instance if not app_instance: # when the routine is invoked as a help method, not through commands - webapp = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'get', slot) + webapp = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'get', slot) if not webapp: raise CLIError("'{}' app doesn't exist".format(name)) _rename_server_farm_props(webapp) @@ -530,7 +564,8 @@ def set_webapp(cmd, resource_group_name, name, slot=None, skip_dns_registration= def update_webapp(instance, client_affinity_enabled=None, https_only=None): if 'function' in instance.kind: - raise CLIError("please use 'az functionapp update' to update this function app") + raise CLIError( + "please use 'az functionapp update' to update this function app") if client_affinity_enabled is not None: instance.client_affinity_enabled = client_affinity_enabled == 'true' if https_only is not None: @@ -547,23 +582,28 @@ def update_functionapp(cmd, instance, plan=None): dest_plan_info = client.app_service_plans.get(dest_parse_result['resource_group'], dest_parse_result['name']) else: - dest_plan_info = client.app_service_plans.get(instance.resource_group, plan) + dest_plan_info = client.app_service_plans.get( + instance.resource_group, plan) if dest_plan_info is None: raise CLIError("The plan '{}' doesn't exist".format(plan)) - validate_plan_switch_compatibility(cmd, client, instance, dest_plan_info) + validate_plan_switch_compatibility( + cmd, client, instance, dest_plan_info) instance.server_farm_id = dest_plan_info.id return instance def validate_plan_switch_compatibility(cmd, client, src_functionapp_instance, dest_plan_instance): general_switch_msg = 'Currently the switch is only allowed between a Consumption or an Elastic Premium plan.' - src_parse_result = parse_resource_id(src_functionapp_instance.server_farm_id) + src_parse_result = parse_resource_id( + src_functionapp_instance.server_farm_id) src_plan_info = client.app_service_plans.get(src_parse_result['resource_group'], src_parse_result['name']) if src_plan_info is None: - raise CLIError('Could not determine the current plan of the functionapp') + raise CLIError( + 'Could not determine the current plan of the functionapp') if not (is_plan_consumption(cmd, src_plan_info) or is_plan_elastic_premium(cmd, src_plan_info)): - raise CLIError('Your functionapp is not using a Consumption or an Elastic Premium plan. ' + general_switch_msg) + raise CLIError( + 'Your functionapp is not using a Consumption or an Elastic Premium plan. ' + general_switch_msg) if not (is_plan_consumption(cmd, dest_plan_instance) or is_plan_elastic_premium(cmd, dest_plan_instance)): raise CLIError('You are trying to move to a plan that is not a Consumption or an Elastic Premium plan. ' + general_switch_msg) @@ -589,7 +629,8 @@ def list_deleted_webapp(cmd, resource_group_name=None, name=None, slot=None): def restore_deleted_webapp(cmd, deleted_id, resource_group_name, name, slot=None, restore_content_only=None): DeletedAppRestoreRequest = cmd.get_models('DeletedAppRestoreRequest') - request = DeletedAppRestoreRequest(deleted_site_id=deleted_id, recover_configuration=not restore_content_only) + request = DeletedAppRestoreRequest( + deleted_site_id=deleted_id, recover_configuration=not restore_content_only) return _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'restore_from_deleted_app', slot, request) @@ -601,7 +642,8 @@ def list_function_app(cmd, resource_group_name=None): def _list_app(cli_ctx, resource_group_name=None): client = web_client_factory(cli_ctx) if resource_group_name: - result = list(client.web_apps.list_by_resource_group(resource_group_name)) + result = list(client.web_apps.list_by_resource_group( + resource_group_name)) else: result = list(client.web_apps.list()) for webapp in result: @@ -614,11 +656,13 @@ def _list_deleted_app(cli_ctx, resource_group_name=None, name=None, slot=None): locations = _get_deleted_apps_locations(cli_ctx) result = list() for location in locations: - result = result + list(client.deleted_web_apps.list_by_location(location)) + result = result + \ + list(client.deleted_web_apps.list_by_location(location)) if resource_group_name: result = [r for r in result if r.resource_group == resource_group_name] if name: - result = [r for r in result if r.deleted_site_name.lower() == name.lower()] + result = [r for r in result if r.deleted_site_name.lower() == + name.lower()] if slot: result = [r for r in result if r.slot.lower() == slot.lower()] return result @@ -632,7 +676,8 @@ def getter(): def setter(webapp): webapp.identity = ManagedServiceIdentity(type='SystemAssigned') - poller = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'create_or_update', slot, webapp) + poller = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'create_or_update', slot, webapp) return LongRunningOperation(cmd.cli_ctx)(poller) from azure.cli.core.commands.arm import assign_identity as _assign_identity @@ -652,7 +697,8 @@ def getter(): def setter(webapp): webapp.identity = ManagedServiceIdentity(type='None') - poller = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'create_or_update', slot, webapp) + poller = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'create_or_update', slot, webapp) return LongRunningOperation(cmd.cli_ctx)(poller) from azure.cli.core.commands.arm import assign_identity as _assign_identity @@ -692,7 +738,8 @@ def update_auth_settings(cmd, resource_group_name, name, enabled=None, action=No for arg in args[2:]: if values.get(arg, None): - setattr(auth_settings, arg, values[arg] if arg not in bool_flags else values[arg] == 'true') + setattr(auth_settings, arg, + values[arg] if arg not in bool_flags else values[arg] == 'true') return _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_auth_settings', slot, auth_settings) @@ -747,14 +794,17 @@ def get_site_configs(cmd, resource_group_name, name, slot=None): def get_app_settings(cmd, resource_group_name, name, slot=None): - result = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot) + result = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot) client = web_client_factory(cmd.cli_ctx) - slot_app_setting_names = client.web_apps.list_slot_configuration_names(resource_group_name, name).app_setting_names + slot_app_setting_names = client.web_apps.list_slot_configuration_names( + resource_group_name, name).app_setting_names return _build_app_settings_output(result.properties, slot_app_setting_names) def get_connection_strings(cmd, resource_group_name, name, slot=None): - result = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_connection_strings', slot) + result = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'list_connection_strings', slot) client = web_client_factory(cmd.cli_ctx) slot_constr_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) \ .connection_string_names or [] @@ -779,7 +829,8 @@ def get_azure_storage_accounts(cmd, resource_group_name, name, slot=None): def _fill_ftp_publishing_url(cmd, webapp, resource_group_name, name, slot=None): profiles = list_publish_profiles(cmd, resource_group_name, name, slot) - url = next(p['publishUrl'] for p in profiles if p['publishMethod'] == 'FTP') + url = next(p['publishUrl'] + for p in profiles if p['publishMethod'] == 'FTP') setattr(webapp, 'ftpPublishingUrl', url) return webapp @@ -790,7 +841,8 @@ def _format_fx_version(custom_image_name, container_config_type=None): # handles case of only spaces if fx_version: if container_config_type: - fx_version = '{}|{}'.format(container_config_type, custom_image_name) + fx_version = '{}|{}'.format( + container_config_type, custom_image_name) elif not fx_version_lower.startswith('docker|'): fx_version = '{}|{}'.format('DOCKER', custom_image_name) else: @@ -863,12 +915,15 @@ def update_site_configs(cmd, resource_group_name, name, slot=None, number_of_wor generic_configurations=None): configs = get_site_configs(cmd, resource_group_name, name, slot) if number_of_workers is not None: - number_of_workers = validate_range_of_int_flag('--number-of-workers', number_of_workers, min_val=0, max_val=20) + number_of_workers = validate_range_of_int_flag( + '--number-of-workers', number_of_workers, min_val=0, max_val=20) if linux_fx_version: if linux_fx_version.strip().lower().startswith('docker|'): - update_app_settings(cmd, resource_group_name, name, ["WEBSITES_ENABLE_APP_SERVICE_STORAGE=false"]) + update_app_settings(cmd, resource_group_name, name, [ + "WEBSITES_ENABLE_APP_SERVICE_STORAGE=false"]) else: - delete_app_settings(cmd, resource_group_name, name, ["WEBSITES_ENABLE_APP_SERVICE_STORAGE"]) + delete_app_settings(cmd, resource_group_name, name, [ + "WEBSITES_ENABLE_APP_SERVICE_STORAGE"]) if pre_warmed_instance_count is not None: pre_warmed_instance_count = validate_range_of_int_flag('--prewarmed-instance-count', pre_warmed_instance_count, @@ -886,7 +941,8 @@ def update_site_configs(cmd, resource_group_name, name, slot=None, number_of_wor if arg in int_flags and values[arg] is not None: values[arg] = validate_and_convert_to_int(arg, values[arg]) if arg != 'generic_configurations' and values.get(arg, None): - setattr(configs, arg, values[arg] if arg not in bool_flags else values[arg] == 'true') + setattr( + configs, arg, values[arg] if arg not in bool_flags else values[arg] == 'true') generic_configurations = generic_configurations or [] result = {} @@ -904,10 +960,12 @@ def update_site_configs(cmd, resource_group_name, name, slot=None, number_of_wor def delete_app_settings(cmd, resource_group_name, name, setting_names, slot=None): - app_settings = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot) + app_settings = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot) client = web_client_factory(cmd.cli_ctx) - slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names( + resource_group_name, name) is_slot_settings = False for setting_name in setting_names: app_settings.properties.pop(setting_name, None) @@ -916,7 +974,8 @@ def delete_app_settings(cmd, resource_group_name, name, setting_names, slot=None is_slot_settings = True if is_slot_settings: - client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names( + resource_group_name, name, slot_cfg_names) result = _generic_settings_operation(cmd.cli_ctx, resource_group_name, name, 'update_application_settings', @@ -930,7 +989,8 @@ def delete_azure_storage_accounts(cmd, resource_group_name, name, custom_id, slo 'list_azure_storage_accounts', slot) client = web_client_factory(cmd.cli_ctx) - slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names( + resource_group_name, name) is_slot_settings = False azure_storage_accounts.properties.pop(custom_id, None) @@ -939,7 +999,8 @@ def delete_azure_storage_accounts(cmd, resource_group_name, name, custom_id, slo is_slot_settings = True if is_slot_settings: - client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names( + resource_group_name, name, slot_cfg_names) result = _generic_settings_operation(cmd.cli_ctx, resource_group_name, name, 'update_azure_storage_accounts', azure_storage_accounts.properties, @@ -951,7 +1012,8 @@ def delete_azure_storage_accounts(cmd, resource_group_name, name, custom_id, slo def _ssl_context(): if sys.version_info < (3, 4) or (in_cloud_console() and sys.platform.system() == 'Windows'): try: - return ssl.SSLContext(ssl.PROTOCOL_TLS) # added in python 2.7.13 and 3.6 + # added in python 2.7.13 and 3.6 + return ssl.SSLContext(ssl.PROTOCOL_TLS) except AttributeError: return ssl.SSLContext(ssl.PROTOCOL_TLSv1) @@ -990,10 +1052,12 @@ def update_connection_strings(cmd, resource_group_name, name, connection_string_ if slot_settings: new_slot_setting_names = [n.split('=', 1)[0] for n in slot_settings] - slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names( + resource_group_name, name) slot_cfg_names.connection_string_names = slot_cfg_names.connection_string_names or [] slot_cfg_names.connection_string_names += new_slot_setting_names - client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names( + resource_group_name, name, slot_cfg_names) return result.properties @@ -1003,7 +1067,8 @@ def delete_connection_strings(cmd, resource_group_name, name, setting_names, slo 'list_connection_strings', slot) client = web_client_factory(cmd.cli_ctx) - slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names( + resource_group_name, name) is_slot_settings = False for setting_name in setting_names: conn_strings.properties.pop(setting_name, None) @@ -1012,7 +1077,8 @@ def delete_connection_strings(cmd, resource_group_name, name, setting_names, slo is_slot_settings = True if is_slot_settings: - client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names( + resource_group_name, name, slot_cfg_names) return _generic_settings_operation(cmd.cli_ctx, resource_group_name, name, 'update_connection_strings', @@ -1030,37 +1096,51 @@ def update_container_settings(cmd, resource_group_name, name, docker_registry_se multicontainer_config_type=None, multicontainer_config_file=None, slot=None): settings = [] if docker_registry_server_url is not None: - settings.append('DOCKER_REGISTRY_SERVER_URL=' + docker_registry_server_url) + settings.append('DOCKER_REGISTRY_SERVER_URL=' + + docker_registry_server_url) if (not docker_registry_server_user and not docker_registry_server_password and docker_registry_server_url and '.azurecr.io' in docker_registry_server_url): - logger.warning('No credential was provided to access Azure Container Registry. Trying to look up...') + logger.warning( + 'No credential was provided to access Azure Container Registry. Trying to look up...') parsed = urlparse(docker_registry_server_url) - registry_name = (parsed.netloc if parsed.scheme else parsed.path).split('.')[0] + registry_name = ( + parsed.netloc if parsed.scheme else parsed.path).split('.')[0] try: - docker_registry_server_user, docker_registry_server_password = _get_acr_cred(cmd.cli_ctx, registry_name) + docker_registry_server_user, docker_registry_server_password = _get_acr_cred( + cmd.cli_ctx, registry_name) except Exception as ex: # pylint: disable=broad-except - logger.warning("Retrieving credentials failed with an exception:'%s'", ex) # consider throw if needed + # consider throw if needed + logger.warning( + "Retrieving credentials failed with an exception:'%s'", ex) if docker_registry_server_user is not None: - settings.append('DOCKER_REGISTRY_SERVER_USERNAME=' + docker_registry_server_user) + settings.append('DOCKER_REGISTRY_SERVER_USERNAME=' + + docker_registry_server_user) if docker_registry_server_password is not None: - settings.append('DOCKER_REGISTRY_SERVER_PASSWORD=' + docker_registry_server_password) + settings.append('DOCKER_REGISTRY_SERVER_PASSWORD=' + + docker_registry_server_password) if docker_custom_image_name is not None: - _add_fx_version(cmd, resource_group_name, name, docker_custom_image_name, slot) + _add_fx_version(cmd, resource_group_name, name, + docker_custom_image_name, slot) if websites_enable_app_service_storage: - settings.append('WEBSITES_ENABLE_APP_SERVICE_STORAGE=' + websites_enable_app_service_storage) + settings.append('WEBSITES_ENABLE_APP_SERVICE_STORAGE=' + + websites_enable_app_service_storage) if docker_registry_server_user or docker_registry_server_password or docker_registry_server_url or websites_enable_app_service_storage: # pylint: disable=line-too-long update_app_settings(cmd, resource_group_name, name, settings, slot) settings = get_app_settings(cmd, resource_group_name, name, slot) if multicontainer_config_file and multicontainer_config_type: - encoded_config_file = _get_linux_multicontainer_encoded_config_from_file(multicontainer_config_file) - linux_fx_version = _format_fx_version(encoded_config_file, multicontainer_config_type) - update_site_configs(cmd, resource_group_name, name, linux_fx_version=linux_fx_version, slot=slot) + encoded_config_file = _get_linux_multicontainer_encoded_config_from_file( + multicontainer_config_file) + linux_fx_version = _format_fx_version( + encoded_config_file, multicontainer_config_type) + update_site_configs(cmd, resource_group_name, name, + linux_fx_version=linux_fx_version, slot=slot) elif multicontainer_config_file or multicontainer_config_type: - logger.warning('Must change both settings --multicontainer-config-file FILE --multicontainer-config-type TYPE') + logger.warning( + 'Must change both settings --multicontainer-config-file FILE --multicontainer-config-type TYPE') return _mask_creds_related_appsettings(_filter_for_container_settings(cmd, resource_group_name, name, settings, slot=slot)) @@ -1078,12 +1158,15 @@ def update_container_settings_functionapp(cmd, resource_group_name, name, docker def _get_acr_cred(cli_ctx, registry_name): from azure.mgmt.containerregistry import ContainerRegistryManagementClient from azure.cli.core.commands.parameters import get_resources_in_subscription - client = get_mgmt_service_client(cli_ctx, ContainerRegistryManagementClient).registries + client = get_mgmt_service_client( + cli_ctx, ContainerRegistryManagementClient).registries - result = get_resources_in_subscription(cli_ctx, 'Microsoft.ContainerRegistry/registries') + result = get_resources_in_subscription( + cli_ctx, 'Microsoft.ContainerRegistry/registries') result = [item for item in result if item.name.lower() == registry_name] if not result or len(result) > 1: - raise CLIError("No resource or more than one were found with name '{}'.".format(registry_name)) + raise CLIError( + "No resource or more than one were found with name '{}'.".format(registry_name)) resource_group_name = parse_resource_id(result[0].id)['resource_group'] registry = client.get(resource_group_name, registry_name) @@ -1098,7 +1181,8 @@ def _get_acr_cred(cli_ctx, registry_name): def delete_container_settings(cmd, resource_group_name, name, slot=None): _delete_linux_fx_version(cmd, resource_group_name, name, slot) - delete_app_settings(cmd, resource_group_name, name, CONTAINER_APPSETTING_NAMES, slot) + delete_app_settings(cmd, resource_group_name, name, + CONTAINER_APPSETTING_NAMES, slot) def show_container_settings(cmd, resource_group_name, name, show_multicontainer_config=None, slot=None): @@ -1120,7 +1204,8 @@ def _filter_for_container_settings(cmd, resource_group_name, name, settings, 'value': fx_version} result.append(added_image_name) if show_multicontainer_config: - decoded_value = _get_linux_multicontainer_decoded_config(cmd, resource_group_name, name, slot) + decoded_value = _get_linux_multicontainer_decoded_config( + cmd, resource_group_name, name, slot) decoded_image_name = {'name': 'DOCKER_CUSTOM_IMAGE_NAME_DECODED', 'value': decoded_value} result.append(decoded_image_name) @@ -1177,7 +1262,8 @@ def get_external_ip(cmd, resource_group_name, webapp_name): if address.internal_ip_address: ip_address = address.internal_ip_address else: - vip = next((s for s in webapp.host_name_ssl_states if s.ssl_state == SslState.ip_based_enabled), None) + vip = next((s for s in webapp.host_name_ssl_states if s.ssl_state == + SslState.ip_based_enabled), None) ip_address = vip.virtual_ip if vip else address.service_ip_address else: ip_address = _resolve_hostname_through_dns(webapp.default_host_name) @@ -1197,16 +1283,19 @@ def create_webapp_slot(cmd, resource_group_name, webapp, slot, configuration_sou if not site: raise CLIError("'{}' app doesn't exist".format(webapp)) if 'functionapp' in site.kind: - raise CLIError("'{}' is a function app. Please use `az functionapp deployment slot create`.".format(webapp)) + raise CLIError( + "'{}' is a function app. Please use `az functionapp deployment slot create`.".format(webapp)) location = site.location slot_def = Site(server_farm_id=site.server_farm_id, location=location) slot_def.site_config = SiteConfig() - poller = client.web_apps.create_or_update_slot(resource_group_name, webapp, slot_def, slot) + poller = client.web_apps.create_or_update_slot( + resource_group_name, webapp, slot_def, slot) result = LongRunningOperation(cmd.cli_ctx)(poller) if configuration_source: - update_slot_configuration_from_source(cmd, client, resource_group_name, webapp, slot, configuration_source) + update_slot_configuration_from_source( + cmd, client, resource_group_name, webapp, slot, configuration_source) result.name = result.name.split('/')[-1] return result @@ -1221,11 +1310,13 @@ def create_functionapp_slot(cmd, resource_group_name, name, slot, configuration_ location = site.location slot_def = Site(server_farm_id=site.server_farm_id, location=location) - poller = client.web_apps.create_or_update_slot(resource_group_name, name, slot_def, slot) + poller = client.web_apps.create_or_update_slot( + resource_group_name, name, slot_def, slot) result = LongRunningOperation(cmd.cli_ctx)(poller) if configuration_source: - update_slot_configuration_from_source(cmd, client, resource_group_name, name, slot, configuration_source) + update_slot_configuration_from_source( + cmd, client, resource_group_name, name, slot, configuration_source) result.name = result.name.split('/')[-1] return result @@ -1241,7 +1332,8 @@ def update_slot_configuration_from_source(cmd, client, resource_group_name, weba # slot create doesn't clone over the app-settings and connection-strings, so we do it here # also make sure slot settings don't get propagated. - slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, webapp) + slot_cfg_names = client.web_apps.list_slot_configuration_names( + resource_group_name, webapp) src_slot = None if clone_from_prod else configuration_source app_settings = _generic_site_operation(cmd.cli_ctx, resource_group_name, webapp, 'list_application_settings', @@ -1277,7 +1369,8 @@ def config_source_control(cmd, resource_group_name, name, repo_url, repository_t python_framework = 'Django' if python_framework is None else python_framework python_version = 'Python 3.5.3 x86' if python_version is None else python_version - webapp_list = None if test is None else list_webapp(resource_group_name) + webapp_list = None if test is None else list_webapp( + resource_group_name) vsts_provider = VstsContinuousDeliveryProvider() cd_app_type_details = { 'cd_app_type': cd_app_type, @@ -1303,7 +1396,8 @@ def config_source_control(cmd, resource_group_name, name, repo_url, repository_t 'python_version, cd_account_create, test, slot_swap') from azure.mgmt.web.models import SiteSourceControl, SourceControl if git_token: - sc = SourceControl(location=location, source_control_name='GitHub', token=git_token) + sc = SourceControl(location=location, + source_control_name='GitHub', token=git_token) client.update_source_control('GitHub', sc) source_control = SiteSourceControl(location=location, repo_url=repo_url, branch=branch, @@ -1334,7 +1428,8 @@ def update_git_token(cmd, git_token=None): ''' client = web_client_factory(cmd.cli_ctx) from azure.mgmt.web.models import SourceControl - sc = SourceControl(name='not-really-needed', source_control_name='GitHub', token=git_token or '') + sc = SourceControl(name='not-really-needed', + source_control_name='GitHub', token=git_token or '') return client.update_source_control('GitHub', sc) @@ -1353,7 +1448,8 @@ def enable_local_git(cmd, resource_group_name, name, slot=None): site_config = SiteConfigResource(location=location) site_config.scm_type = 'LocalGit' if slot is None: - client.web_apps.create_or_update_configuration(resource_group_name, name, site_config) + client.web_apps.create_or_update_configuration( + resource_group_name, name, site_config) else: client.web_apps.create_or_update_configuration_slot(resource_group_name, name, site_config, slot) @@ -1372,9 +1468,11 @@ def sync_site_repo(cmd, resource_group_name, name, slot=None): def list_app_service_plans(cmd, resource_group_name=None): client = web_client_factory(cmd.cli_ctx) if resource_group_name is None: - plans = list(client.app_service_plans.list(detailed=True)) # enables querying "numberOfSites" + # enables querying "numberOfSites" + plans = list(client.app_service_plans.list(detailed=True)) else: - plans = list(client.app_service_plans.list_by_resource_group(resource_group_name)) + plans = list(client.app_service_plans.list_by_resource_group( + resource_group_name)) for plan in plans: # prune a few useless fields del plan.geo_region @@ -1395,8 +1493,10 @@ def create_app_service_plan(cmd, resource_group_name, name, is_linux, hyper_v, p client = web_client_factory(cmd.cli_ctx) if app_service_environment: if hyper_v: - raise CLIError('Windows containers is not yet supported in app service environment') - ase_id = _validate_app_service_environment_id(cmd.cli_ctx, app_service_environment, resource_group_name) + raise CLIError( + 'Windows containers is not yet supported in app service environment') + ase_id = _validate_app_service_environment_id( + cmd.cli_ctx, app_service_environment, resource_group_name) ase_def = HostingEnvironmentProfile(id=ase_id) ase_list = client.app_service_environments.list() ase_found = False @@ -1406,14 +1506,17 @@ def create_app_service_plan(cmd, resource_group_name, name, is_linux, hyper_v, p ase_found = True break if not ase_found: - raise CLIError("App service environment '{}' not found in subscription.".format(ase_id)) + raise CLIError( + "App service environment '{}' not found in subscription.".format(ase_id)) else: # Non-ASE ase_def = None if location is None: - location = _get_location_from_resource_group(cmd.cli_ctx, resource_group_name) + location = _get_location_from_resource_group( + cmd.cli_ctx, resource_group_name) # the api is odd on parameter naming, have to live with it for now - sku_def = SkuDescription(tier=get_sku_name(sku), name=sku, capacity=number_of_workers) + sku_def = SkuDescription(tier=get_sku_name( + sku), name=sku, capacity=number_of_workers) plan_def = AppServicePlan(location=location, tags=tags, sku=sku_def, reserved=(is_linux or None), hyper_v=(hyper_v or None), name=name, per_site_scaling=per_site_scaling, hosting_environment_profile=ase_def) @@ -1423,7 +1526,8 @@ def create_app_service_plan(cmd, resource_group_name, name, is_linux, hyper_v, p def update_app_service_plan(instance, sku=None, number_of_workers=None): if number_of_workers is None and sku is None: - logger.warning('No update is done. Specify --sku and/or --number-of-workers.') + logger.warning( + 'No update is done. Specify --sku and/or --number-of-workers.') sku_def = instance.sku if sku is not None: sku = _normalize_sku(sku) @@ -1440,8 +1544,10 @@ def update_functionapp_app_service_plan(cmd, instance, sku=None, number_of_worke instance = update_app_service_plan(instance, sku, number_of_workers) if max_burst is not None: if not is_plan_elastic_premium(cmd, instance): - raise CLIError("Usage error: --max-burst is only supported for Elastic Premium (EP) plans") - max_burst = validate_range_of_int_flag('--max-burst', max_burst, min_val=0, max_val=20) + raise CLIError( + "Usage error: --max-burst is only supported for Elastic Premium (EP) plans") + max_burst = validate_range_of_int_flag( + '--max-burst', max_burst, min_val=0, max_val=20) instance.maximum_elastic_worker_count = max_burst if number_of_workers is not None: number_of_workers = validate_range_of_int_flag('--number-of-workers / --min-instances', @@ -1469,7 +1575,8 @@ def create_backup(cmd, resource_group_name, webapp_name, storage_account_url, client = web_client_factory(cmd.cli_ctx) if backup_name and backup_name.lower().endswith('.zip'): backup_name = backup_name[:-4] - db_setting = _create_db_setting(cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) + db_setting = _create_db_setting( + cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) backup_request = BackupRequest(backup_request_name=backup_name, storage_account_url=storage_account_url, databases=db_setting) if slot: @@ -1488,7 +1595,8 @@ def update_backup_schedule(cmd, resource_group_name, webapp_name, storage_accoun if backup_name and backup_name.lower().endswith('.zip'): backup_name = backup_name[:-4] if not backup_name: - backup_name = '{0}_{1}'.format(webapp_name, datetime.datetime.utcnow().strftime('%Y%m%d%H%M')) + backup_name = '{0}_{1}'.format( + webapp_name, datetime.datetime.utcnow().strftime('%Y%m%d%H%M')) try: configuration = _generic_site_operation(cmd.cli_ctx, resource_group_name, webapp_name, @@ -1526,7 +1634,8 @@ def update_backup_schedule(cmd, resource_group_name, webapp_name, storage_accoun db_name = db_name or db.name db_connection_string = db_connection_string or db.connection_string - db_setting = _create_db_setting(cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) + db_setting = _create_db_setting( + cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) backup_schedule = BackupSchedule(frequency_interval=frequency_num, frequency_unit=frequency_unit.name, keep_at_least_one_backup=keep_at_least_one_backup, @@ -1546,7 +1655,8 @@ def restore_backup(cmd, resource_group_name, webapp_name, storage_account_url, b storage_blob_name = backup_name if not storage_blob_name.lower().endswith('.zip'): storage_blob_name += '.zip' - db_setting = _create_db_setting(cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) + db_setting = _create_db_setting( + cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) restore_request = RestoreRequest(storage_account_url=storage_account_url, blob_name=storage_blob_name, overwrite=overwrite, site_name=target_name, databases=db_setting, @@ -1565,7 +1675,8 @@ def list_snapshots(cmd, resource_group_name, name, slot=None): def restore_snapshot(cmd, resource_group_name, name, time, slot=None, restore_content_only=False, # pylint: disable=redefined-outer-name source_resource_group=None, source_name=None, source_slot=None): from azure.cli.core.commands.client_factory import get_subscription_id - SnapshotRecoverySource, SnapshotRestoreRequest = cmd.get_models('SnapshotRecoverySource', 'SnapshotRestoreRequest') + SnapshotRecoverySource, SnapshotRestoreRequest = cmd.get_models( + 'SnapshotRecoverySource', 'SnapshotRestoreRequest') client = web_client_factory(cmd.cli_ctx) recover_config = not restore_content_only if all([source_resource_group, source_name]): @@ -1582,9 +1693,11 @@ def restore_snapshot(cmd, resource_group_name, name, time, slot=None, restore_co return client.web_apps.restore_snapshot_slot(resource_group_name, name, request, slot) return client.web_apps.restore_snapshot(resource_group_name, name, request) if any([source_resource_group, source_name]): - raise CLIError('usage error: --source-resource-group and --source-name must both be specified if one is used') + raise CLIError( + 'usage error: --source-resource-group and --source-name must both be specified if one is used') # Overwrite app with its own snapshot - request = SnapshotRestoreRequest(overwrite=True, snapshot_time=time, recover_configuration=recover_config) + request = SnapshotRestoreRequest( + overwrite=True, snapshot_time=time, recover_configuration=recover_config) if slot: return client.web_apps.restore_snapshot_slot(resource_group_name, name, request, slot) return client.web_apps.restore_snapshot(resource_group_name, name, request) @@ -1596,7 +1709,8 @@ def _create_db_setting(cmd, db_name, db_type, db_connection_string): if all([db_name, db_type, db_connection_string]): return [DatabaseBackupSetting(database_type=db_type, name=db_name, connection_string=db_connection_string)] if any([db_name, db_type, db_connection_string]): - raise CLIError('usage error: --db-name NAME --db-type TYPE --db-connection-string STRING') + raise CLIError( + 'usage error: --db-name NAME --db-type TYPE --db-connection-string STRING') def _parse_frequency(cmd, frequency): @@ -1621,7 +1735,8 @@ def _parse_frequency(cmd, frequency): def _get_location_from_resource_group(cli_ctx, resource_group_name): - client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) + client = get_mgmt_service_client( + cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) group = client.resource_groups.get(resource_group_name) return group.location @@ -1634,9 +1749,11 @@ def _get_location_from_webapp(client, resource_group_name, webapp): def _get_deleted_apps_locations(cli_ctx): - client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) + client = get_mgmt_service_client( + cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) web_provider = client.providers.get('Microsoft.Web') - del_sites_resource = next((x for x in web_provider.resource_types if x.resource_type == 'deletedSites'), None) + del_sites_resource = next( + (x for x in web_provider.resource_types if x.resource_type == 'deletedSites'), None) if del_sites_resource: return del_sites_resource.locations return [] @@ -1644,7 +1761,8 @@ def _get_deleted_apps_locations(cli_ctx): def _get_local_git_url(cli_ctx, client, resource_group_name, name, slot=None): user = client.get_publishing_user() - result = _generic_site_operation(cli_ctx, resource_group_name, name, 'get_source_control', slot) + result = _generic_site_operation( + cli_ctx, resource_group_name, name, 'get_source_control', slot) parsed = urlparse(result.repo_url) return '{}://{}@{}/{}.git'.format(parsed.scheme, user.publishing_user_name, parsed.netloc, name) @@ -1677,7 +1795,8 @@ def set_deployment_user(cmd, user_name, password=None): try: password = prompt_pass(msg='Password: ', confirm=True) except NoTTYException: - raise CLIError('Please specify both username and password in non-interactive mode.') + raise CLIError( + 'Please specify both username and password in non-interactive mode.') user.publishing_password = password return client.update_publishing_user(user) @@ -1698,7 +1817,8 @@ def list_publish_profiles(cmd, resource_group_name, name, slot=None): for f in content: full_xml += f.decode() - profiles = xmltodict.parse(full_xml, xml_attribs=True)['publishData']['publishProfile'] + profiles = xmltodict.parse(full_xml, xml_attribs=True)[ + 'publishData']['publishProfile'] converted = [] for profile in profiles: new = {} @@ -1731,7 +1851,8 @@ def show_container_cd_url(cmd, resource_group_name, name, slot=None): cd_settings['DOCKER_ENABLE_CI'] = docker_enabled if docker_enabled: - credentials = list_publishing_credentials(cmd, resource_group_name, name, slot) + credentials = list_publishing_credentials( + cmd, resource_group_name, name, slot) if credentials: cd_url = credentials.scm_uri + '/docker/hook' cd_settings['CI_CD_URL'] = cd_url @@ -1745,15 +1866,18 @@ def view_in_browser(cmd, resource_group_name, name, slot=None, logs=False): url = _get_url(cmd, resource_group_name, name, slot) open_page_in_browser(url) if logs: - get_streaming_log(cmd, resource_group_name, name, provider=None, slot=slot) + get_streaming_log(cmd, resource_group_name, + name, provider=None, slot=slot) def _get_url(cmd, resource_group_name, name, slot=None): SslState = cmd.get_models('SslState') - site = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'get', slot) + site = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'get', slot) if not site: raise CLIError("'{}' app doesn't exist".format(name)) - url = site.enabled_host_names[0] # picks the custom domain URL incase a domain is assigned + # picks the custom domain URL incase a domain is assigned + url = site.enabled_host_names[0] ssl_host = next((h for h in site.host_name_ssl_states if h.ssl_state != SslState.disabled), None) return ('https' if ssl_host else 'http') + '://' + url @@ -1794,7 +1918,8 @@ def config_diagnostics(cmd, resource_group_name, name, level=None, # 100 mb max log size, retention lasts 3 days. Yes we hard code it, portal does too filesystem_log_config = FileSystemHttpLogsConfig(retention_in_mb=100, retention_in_days=3, enabled=turned_on) - http_logs = HttpLogsConfig(file_system=filesystem_log_config, azure_blob_storage=None) + http_logs = HttpLogsConfig( + file_system=filesystem_log_config, azure_blob_storage=None) detailed_error_messages_logs = (None if detailed_error_messages is None else EnabledConfig(enabled=detailed_error_messages)) @@ -1816,8 +1941,10 @@ def show_diagnostic_settings(cmd, resource_group_name, name, slot=None): def config_slot_auto_swap(cmd, resource_group_name, webapp, slot, auto_swap_slot=None, disable=None): client = web_client_factory(cmd.cli_ctx) - site_config = client.web_apps.get_configuration_slot(resource_group_name, webapp, slot) - site_config.auto_swap_slot_name = '' if disable else (auto_swap_slot or 'production') + site_config = client.web_apps.get_configuration_slot( + resource_group_name, webapp, slot) + site_config.auto_swap_slot_name = '' if disable else ( + auto_swap_slot or 'production') return client.web_apps.update_configuration_slot(resource_group_name, webapp, site_config, slot) @@ -1826,7 +1953,8 @@ def list_slots(cmd, resource_group_name, webapp): slots = list(client.web_apps.list_slots(resource_group_name, webapp)) for slot in slots: slot.name = slot.name.split('/')[-1] - setattr(slot, 'app_service_plan', parse_resource_id(slot.server_farm_id)['name']) + setattr(slot, 'app_service_plan', parse_resource_id( + slot.server_farm_id)['name']) del slot.server_farm_id return slots @@ -1847,9 +1975,11 @@ def swap_slot(cmd, resource_group_name, webapp, slot, target_slot=None, action=' return result # we will reset both source slot and target slot if target_slot is None: - client.web_apps.reset_production_slot_config(resource_group_name, webapp) + client.web_apps.reset_production_slot_config( + resource_group_name, webapp) else: - client.web_apps.reset_slot_configuration_slot(resource_group_name, webapp, target_slot) + client.web_apps.reset_slot_configuration_slot( + resource_group_name, webapp, target_slot) return None @@ -1874,9 +2004,11 @@ def set_traffic_routing(cmd, resource_group_name, name, distribution): slot, percentage = r.split('=') action_host_name_slot = host_name_val + "-" + slot configs.experiments.ramp_up_rules.append(RampUpRule(action_host_name=action_host_name_slot + host_name_suffix, - reroute_percentage=float(percentage), + reroute_percentage=float( + percentage), name=slot)) - _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_configuration', None, configs) + _generic_site_operation(cmd.cli_ctx, resource_group_name, + name, 'update_configuration', None, configs) return configs.experiments.ramp_up_rules @@ -1895,8 +2027,10 @@ def add_cors(cmd, resource_group_name, name, allowed_origins, slot=None): configs = get_site_configs(cmd, resource_group_name, name, slot) if not configs.cors: configs.cors = CorsSettings() - configs.cors.allowed_origins = (configs.cors.allowed_origins or []) + allowed_origins - result = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs) + configs.cors.allowed_origins = ( + configs.cors.allowed_origins or []) + allowed_origins + result = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs) return result.cors @@ -1904,10 +2038,12 @@ def remove_cors(cmd, resource_group_name, name, allowed_origins, slot=None): configs = get_site_configs(cmd, resource_group_name, name, slot) if configs.cors: if allowed_origins: - configs.cors.allowed_origins = [x for x in (configs.cors.allowed_origins or []) if x not in allowed_origins] + configs.cors.allowed_origins = [x for x in ( + configs.cors.allowed_origins or []) if x not in allowed_origins] else: configs.cors.allowed_origins = [] - configs = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs) + configs = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs) return configs.cors @@ -1922,7 +2058,8 @@ def get_streaming_log(cmd, resource_group_name, name, provider=None, slot=None): if provider: streaming_url += ('/' + provider.lstrip('/')) - user, password = _get_site_credential(cmd.cli_ctx, resource_group_name, name, slot) + user, password = _get_site_credential( + cmd.cli_ctx, resource_group_name, name, slot) t = threading.Thread(target=_get_log, args=(streaming_url, user, password)) t.daemon = True t.start() @@ -1934,13 +2071,15 @@ def get_streaming_log(cmd, resource_group_name, name, provider=None, slot=None): def download_historical_logs(cmd, resource_group_name, name, log_file=None, slot=None): scm_url = _get_scm_url(cmd, resource_group_name, name, slot) url = scm_url.rstrip('/') + '/dump' - user_name, password = _get_site_credential(cmd.cli_ctx, resource_group_name, name, slot) + user_name, password = _get_site_credential( + cmd.cli_ctx, resource_group_name, name, slot) _get_log(url, user_name, password, log_file) logger.warning('Downloaded logs to %s', log_file) def _get_site_credential(cli_ctx, resource_group_name, name, slot=None): - creds = _generic_site_operation(cli_ctx, resource_group_name, name, 'list_publishing_credentials', slot) + creds = _generic_site_operation( + cli_ctx, resource_group_name, name, 'list_publishing_credentials', slot) creds = creds.result() return (creds.publishing_user_name, creds.publishing_password) @@ -1954,8 +2093,10 @@ def _get_log(url, user_name, password, log_file=None): except ImportError: pass - http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where()) - headers = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(user_name, password)) + http = urllib3.PoolManager( + cert_reqs='CERT_REQUIRED', ca_certs=certifi.where()) + headers = urllib3.util.make_headers( + basic_auth='{0}:{1}'.format(user_name, password)) r = http.request( 'GET', url, @@ -1986,7 +2127,8 @@ def _get_log(url, user_name, password, log_file=None): def upload_ssl_cert(cmd, resource_group_name, name, certificate_password, certificate_file, slot=None): Certificate = cmd.get_models('Certificate') client = web_client_factory(cmd.cli_ctx) - webapp = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'get', slot) + webapp = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'get', slot) cert_file = open(certificate_file, 'rb') cert_contents = cert_file.read() hosting_environment_profile_param = (webapp.hosting_environment_profile.name @@ -2006,7 +2148,8 @@ def _generate_cert_name(thumb_print, hosting_environment, location, resource_gro def _get_cert(certificate_password, certificate_file): ''' Decrypts the .pfx file ''' - p12 = OpenSSL.crypto.load_pkcs12(open(certificate_file, 'rb').read(), certificate_password) + p12 = OpenSSL.crypto.load_pkcs12( + open(certificate_file, 'rb').read(), certificate_password) cert = p12.get_certificate() digest_algorithm = 'sha1' thumbprint = cert.digest(digest_algorithm).decode("utf-8").replace(':', '') @@ -2020,11 +2163,13 @@ def list_ssl_certs(cmd, resource_group_name): def delete_ssl_cert(cmd, resource_group_name, certificate_thumbprint): client = web_client_factory(cmd.cli_ctx) - webapp_certs = client.certificates.list_by_resource_group(resource_group_name) + webapp_certs = client.certificates.list_by_resource_group( + resource_group_name) for webapp_cert in webapp_certs: if webapp_cert.thumbprint == certificate_thumbprint: return client.certificates.delete(resource_group_name, webapp_cert.name) - raise CLIError("Certificate for thumbprint '{}' not found".format(certificate_thumbprint)) + raise CLIError("Certificate for thumbprint '{}' not found".format( + certificate_thumbprint)) def import_ssl_cert(cmd, resource_group_name, name, key_vault, key_vault_certificate_name): @@ -2032,19 +2177,22 @@ def import_ssl_cert(cmd, resource_group_name, name, key_vault, key_vault_certifi client = web_client_factory(cmd.cli_ctx) webapp = client.web_apps.get(resource_group_name, name) if not webapp: - raise CLIError("'{}' app doesn't exist in resource group {}".format(name, resource_group_name)) + raise CLIError("'{}' app doesn't exist in resource group {}".format( + name, resource_group_name)) server_farm_id = webapp.server_farm_id location = webapp.location kv_id = _format_key_vault_id(cmd.cli_ctx, key_vault, resource_group_name) kv_id_parts = parse_resource_id(kv_id) kv_name = kv_id_parts['name'] kv_resource_group_name = kv_id_parts['resource_group'] - cert_name = '{}-{}-{}'.format(resource_group_name, kv_name, key_vault_certificate_name) + cert_name = '{}-{}-{}'.format(resource_group_name, + kv_name, key_vault_certificate_name) lnk = 'https://azure.github.io/AppService/2016/05/24/Deploying-Azure-Web-App-Certificate-through-Key-Vault.html' lnk_msg = 'Find more details here: {}'.format(lnk) if not _check_service_principal_permissions(cmd, kv_resource_group_name, kv_name): logger.warning('Unable to verify Key Vault permissions.') - logger.warning('You may need to grant Microsoft.Azure.WebSites service principal the Secret:Get permission') + logger.warning( + 'You may need to grant Microsoft.Azure.WebSites service principal the Secret:Get permission') logger.warning(lnk_msg) kv_cert_def = Certificate(location=location, key_vault_id=kv_id, password='', @@ -2058,15 +2206,19 @@ def create_managed_ssl_cert(cmd, resource_group_name, name, hostname, slot=None) Certificate = cmd.get_models('Certificate') hostname = hostname.lower() client = web_client_factory(cmd.cli_ctx) - webapp = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'get', slot) + webapp = _generic_site_operation( + cmd.cli_ctx, resource_group_name, name, 'get', slot) if not webapp: slot_text = "Deployment slot {} in ".format(slot) if slot else '' - raise CLIError("{0}app {1} doesn't exist in resource groupĀ {2}".format(slot_text, name, resource_group_name)) + raise CLIError("{0}app {1} doesn't exist in resource groupĀ {2}".format( + slot_text, name, resource_group_name)) parsed_plan_id = parse_resource_id(webapp.server_farm_id) - plan_info = client.app_service_plans.get(parsed_plan_id['resource_group'], parsed_plan_id['name']) + plan_info = client.app_service_plans.get( + parsed_plan_id['resource_group'], parsed_plan_id['name']) if plan_info.sku.tier.upper() == 'FREE' or plan_info.sku.tier.upper() == 'SHARED': - raise CLIError('Managed Certificate is not supported on Free and Shared tier.') + raise CLIError( + 'Managed Certificate is not supported on Free and Shared tier.') if not _verify_hostname_binding(cmd, resource_group_name, name, hostname, slot): slot_text = " --slot {}".format(slot) if slot else "" @@ -2088,7 +2240,8 @@ def _check_service_principal_permissions(cmd, resource_group_name, key_vault_nam from azure.cli.command_modules.role._client_factory import _graph_client_factory from azure.graphrbac.models import GraphErrorException kv_client = keyvault_client_vaults_factory(cmd.cli_ctx, None) - vault = kv_client.get(resource_group_name=resource_group_name, vault_name=key_vault_name) + vault = kv_client.get( + resource_group_name=resource_group_name, vault_name=key_vault_name) # Check for Microsoft.Azure.WebSites app registration AZURE_PUBLIC_WEBSITES_APP_ID = 'abfa0a7c-a6b6-4736-8310-5855508787cd' AZURE_GOV_WEBSITES_APP_ID = '6a02c803-dafd-4136-b4c3-5a6f318b4714' @@ -2101,7 +2254,8 @@ def _check_service_principal_permissions(cmd, resource_group_name, key_vault_nam if perm == "Get": return True except GraphErrorException: - pass # Lookup will fail for non service principals (users, groups, etc.) + # Lookup will fail for non service principals (users, groups, etc.) + pass return False @@ -2123,8 +2277,10 @@ def _update_ssl_binding(cmd, resource_group_name, name, certificate_thumbprint, if not webapp: raise CLIError("'{}' app doesn't exist".format(name)) - cert_resource_group_name = parse_resource_id(webapp.server_farm_id)['resource_group'] - webapp_certs = client.certificates.list_by_resource_group(cert_resource_group_name) + cert_resource_group_name = parse_resource_id( + webapp.server_farm_id)['resource_group'] + webapp_certs = client.certificates.list_by_resource_group( + cert_resource_group_name) for webapp_cert in webapp_certs: if webapp_cert.thumbprint == certificate_thumbprint: if len(webapp_cert.host_names) == 1 and not webapp_cert.host_names[0].startswith('*'): @@ -2134,14 +2290,16 @@ def _update_ssl_binding(cmd, resource_group_name, name, certificate_thumbprint, query_result = list_hostnames(cmd, resource_group_name, name, slot) hostnames_in_webapp = [x.name.split('/')[-1] for x in query_result] - to_update = _match_host_names_from_cert(webapp_cert.host_names, hostnames_in_webapp) + to_update = _match_host_names_from_cert( + webapp_cert.host_names, hostnames_in_webapp) for h in to_update: _update_host_name_ssl_state(cmd, resource_group_name, name, webapp, h, ssl_type, certificate_thumbprint, slot) return show_webapp(cmd, resource_group_name, name, slot) - raise CLIError("Certificate for thumbprint '{}' not found.".format(certificate_thumbprint)) + raise CLIError("Certificate for thumbprint '{}' not found.".format( + certificate_thumbprint)) def bind_ssl_cert(cmd, resource_group_name, name, certificate_thumbprint, ssl_type, slot=None): @@ -2199,14 +2357,16 @@ def update_site_appsettings(cmd, stack, site_config): NameValuePair = cmd.get_models('NameValuePair') if site_config.app_settings is None: site_config.app_settings = [] - site_config.app_settings += [NameValuePair(name=k, value=v) for k, v in stack['configs'].items()] + site_config.app_settings += [NameValuePair(name=k, value=v) + for k, v in stack['configs'].items()] return site_config def _load_stacks(self): if self._stacks: return os_type = ('Linux' if self._linux else 'Windows') - raw_stacks = self._client.provider.get_available_stacks(os_type_selected=os_type, raw=True) + raw_stacks = self._client.provider.get_available_stacks( + os_type_selected=os_type, raw=True) bytes_value = raw_stacks._get_next().content # pylint: disable=protected-access json_value = bytes_value.decode('utf8') json_stacks = json.loads(json_value) @@ -2247,7 +2407,8 @@ def _load_stacks(self): # deal with java, which pairs with java container version java_stack = next((s for s in stacks if s['name'] == 'java')) - java_container_stack = next((s for s in stacks if s['name'] == 'javaContainers')) + java_container_stack = next( + (s for s in stacks if s['name'] == 'javaContainers')) for java_version in java_stack['properties']['majorVersions']: for fx in java_container_stack['properties']['frameworks']: for fx_version in fx['majorVersions']: @@ -2269,28 +2430,34 @@ def _load_stacks(self): def get_app_insights_key(cli_ctx, resource_group, name): - appinsights_client = get_mgmt_service_client(cli_ctx, ApplicationInsightsManagementClient) + appinsights_client = get_mgmt_service_client( + cli_ctx, ApplicationInsightsManagementClient) appinsights = appinsights_client.components.get(resource_group, name) if appinsights is None or appinsights.instrumentation_key is None: - raise CLIError("App Insights {} under resource group {} was not found.".format(name, resource_group)) + raise CLIError("App Insights {} under resource group {} was not found.".format( + name, resource_group)) return appinsights.instrumentation_key def create_functionapp_app_service_plan(cmd, resource_group_name, name, is_linux, sku, number_of_workers=None, max_burst=None, location=None, tags=None): - SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') + SkuDescription, AppServicePlan = cmd.get_models( + 'SkuDescription', 'AppServicePlan') sku = _normalize_sku(sku) tier = get_sku_name(sku) if max_burst is not None: if tier.lower() != "elasticpremium": - raise CLIError("Usage error: --max-burst is only supported for Elastic Premium (EP) plans") - max_burst = validate_range_of_int_flag('--max-burst', max_burst, min_val=0, max_val=20) + raise CLIError( + "Usage error: --max-burst is only supported for Elastic Premium (EP) plans") + max_burst = validate_range_of_int_flag( + '--max-burst', max_burst, min_val=0, max_val=20) if number_of_workers is not None: number_of_workers = validate_range_of_int_flag('--number-of-workers / --min-elastic-worker-count', number_of_workers, min_val=0, max_val=20) client = web_client_factory(cmd.cli_ctx) if location is None: - location = _get_location_from_resource_group(cmd.cli_ctx, resource_group_name) + location = _get_location_from_resource_group( + cmd.cli_ctx, resource_group_name) sku_def = SkuDescription(tier=tier, name=sku, capacity=number_of_workers) plan_def = AppServicePlan(location=location, tags=tags, sku=sku_def, reserved=(is_linux or None), maximum_elastic_worker_count=max_burst, @@ -2299,7 +2466,8 @@ def create_functionapp_app_service_plan(cmd, resource_group_name, name, is_linux def is_plan_consumption(cmd, plan_info): - SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') + SkuDescription, AppServicePlan = cmd.get_models( + 'SkuDescription', 'AppServicePlan') if isinstance(plan_info, AppServicePlan): if isinstance(plan_info.sku, SkuDescription): return plan_info.sku.tier.lower() == 'dynamic' @@ -2307,7 +2475,8 @@ def is_plan_consumption(cmd, plan_info): def is_plan_elastic_premium(cmd, plan_info): - SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') + SkuDescription, AppServicePlan = cmd.get_models( + 'SkuDescription', 'AppServicePlan') if isinstance(plan_info, AppServicePlan): if isinstance(plan_info.sku, SkuDescription): return plan_info.sku.tier == 'ElasticPremium' @@ -2318,7 +2487,8 @@ def validate_and_convert_to_int(flag, val): try: return int(val) except ValueError: - raise CLIError("Usage error: {} is expected to have an int value.".format(flag)) + raise CLIError( + "Usage error: {} is expected to have an int value.".format(flag)) def validate_range_of_int_flag(flag_name, value, min_val, max_val): @@ -2342,11 +2512,15 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, "be required. To create a 2.x function you would pass in the flag `--functions_version 2`") functions_version = '2' if deployment_source_url and deployment_local_git: - raise CLIError('usage error: --deployment-source-url | --deployment-local-git') + raise CLIError( + 'usage error: --deployment-source-url | --deployment-local-git') if bool(plan) == bool(consumption_plan_location): - raise CLIError("usage error: --plan NAME_OR_ID | --consumption-plan-location LOCATION") - SiteConfig, Site, NameValuePair = cmd.get_models('SiteConfig', 'Site', 'NameValuePair') - docker_registry_server_url = parse_docker_image_name(deployment_container_image_name) + raise CLIError( + "usage error: --plan NAME_OR_ID | --consumption-plan-location LOCATION") + SiteConfig, Site, NameValuePair = cmd.get_models( + 'SiteConfig', 'Site', 'NameValuePair') + docker_registry_server_url = parse_docker_image_name( + deployment_container_image_name) site_config = SiteConfig(app_settings=[]) functionapp_def = Site(location=None, site_config=site_config, tags=tags) @@ -2357,9 +2531,11 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, if consumption_plan_location: locations = list_consumption_locations(cmd) - location = next((l for l in locations if l['name'].lower() == consumption_plan_location.lower()), None) + location = next((l for l in locations if l['name'].lower( + ) == consumption_plan_location.lower()), None) if location is None: - raise CLIError("Location is invalid. Use: az functionapp list-consumption-locations") + raise CLIError( + "Location is invalid. Use: az functionapp list-consumption-locations") functionapp_def.location = consumption_plan_location functionapp_def.kind = 'functionapp' # if os_type is None, the os type is windows @@ -2368,7 +2544,8 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, else: # apps with SKU based plan if is_valid_resource_id(plan): parse_result = parse_resource_id(plan) - plan_info = client.app_service_plans.get(parse_result['resource_group'], parse_result['name']) + plan_info = client.app_service_plans.get( + parse_result['resource_group'], parse_result['name']) else: plan_info = client.app_service_plans.get(resource_group_name, plan) if not plan_info: @@ -2389,18 +2566,21 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, if not is_linux and runtime not in WINDOWS_RUNTIMES: raise CLIError("usage error: Currently supported runtimes (--runtime) in windows function apps are: {}." .format(', '.join(WINDOWS_RUNTIMES))) - site_config.app_settings.append(NameValuePair(name='FUNCTIONS_WORKER_RUNTIME', value=runtime)) + site_config.app_settings.append(NameValuePair( + name='FUNCTIONS_WORKER_RUNTIME', value=runtime)) if runtime_version is not None: if runtime is None: raise CLIError('Must specify --runtime to use --runtime-version') - allowed_versions = RUNTIME_TO_IMAGE_FUNCTIONAPP[functions_version][runtime].keys() + allowed_versions = RUNTIME_TO_IMAGE_FUNCTIONAPP[functions_version][runtime].keys( + ) if runtime_version not in allowed_versions: raise CLIError('--runtime-version {} is not supported for the selected --runtime {} and ' '--functions_version {}. Supported versions are: {}' .format(runtime_version, runtime, functions_version, ', '.join(allowed_versions))) - con_string = _validate_and_get_connection_string(cmd.cli_ctx, resource_group_name, storage_account) + con_string = _validate_and_get_connection_string( + cmd.cli_ctx, resource_group_name, storage_account) if is_linux: functionapp_def.kind = 'functionapp,linux' @@ -2413,15 +2593,18 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, functionapp_def.kind = 'functionapp,linux,container' site_config.app_settings.append(NameValuePair(name='DOCKER_CUSTOM_IMAGE_NAME', value=deployment_container_image_name)) - site_config.app_settings.append(NameValuePair(name='FUNCTION_APP_EDIT_MODE', value='readOnly')) + site_config.app_settings.append(NameValuePair( + name='FUNCTION_APP_EDIT_MODE', value='readOnly')) site_config.app_settings.append(NameValuePair(name='WEBSITES_ENABLE_APP_SERVICE_STORAGE', value='false')) - site_config.linux_fx_version = _format_fx_version(deployment_container_image_name) + site_config.linux_fx_version = _format_fx_version( + deployment_container_image_name) else: site_config.app_settings.append(NameValuePair(name='WEBSITES_ENABLE_APP_SERVICE_STORAGE', value='true')) if runtime not in RUNTIME_TO_IMAGE_FUNCTIONAPP[functions_version].keys(): - raise CLIError("An appropriate linux image for runtime:'{}' was not found".format(runtime)) + raise CLIError( + "An appropriate linux image for runtime:'{}' was not found".format(runtime)) if deployment_container_image_name is None: site_config.linux_fx_version = _get_linux_fx_functionapp(is_consumption, functions_version, @@ -2432,8 +2615,10 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, # adding appsetting to site to make it a function site_config.app_settings.append(NameValuePair(name='FUNCTIONS_EXTENSION_VERSION', value=_get_extension_version_functionapp(functions_version))) - site_config.app_settings.append(NameValuePair(name='AzureWebJobsStorage', value=con_string)) - site_config.app_settings.append(NameValuePair(name='AzureWebJobsDashboard', value=con_string)) + site_config.app_settings.append(NameValuePair( + name='AzureWebJobsStorage', value=con_string)) + site_config.app_settings.append(NameValuePair( + name='AzureWebJobsDashboard', value=con_string)) site_config.app_settings.append(NameValuePair(name='WEBSITE_NODE_DEFAULT_VERSION', value=_get_website_node_version_functionapp(functions_version, runtime, @@ -2448,7 +2633,8 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, if is_plan_elastic_premium(cmd, plan_info) or is_windows_consumption: site_config.app_settings.append(NameValuePair(name='WEBSITE_CONTENTAZUREFILECONNECTIONSTRING', value=con_string)) - site_config.app_settings.append(NameValuePair(name='WEBSITE_CONTENTSHARE', value=name.lower())) + site_config.app_settings.append(NameValuePair( + name='WEBSITE_CONTENTSHARE', value=name.lower())) create_app_insights = False @@ -2456,13 +2642,15 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, site_config.app_settings.append(NameValuePair(name='APPINSIGHTS_INSTRUMENTATIONKEY', value=app_insights_key)) elif app_insights is not None: - instrumentation_key = get_app_insights_key(cmd.cli_ctx, resource_group_name, app_insights) + instrumentation_key = get_app_insights_key( + cmd.cli_ctx, resource_group_name, app_insights) site_config.app_settings.append(NameValuePair(name='APPINSIGHTS_INSTRUMENTATIONKEY', value=instrumentation_key)) elif not disable_app_insights: create_app_insights = True - poller = client.web_apps.create_or_update(resource_group_name, name, functionapp_def) + poller = client.web_apps.create_or_update( + resource_group_name, name, functionapp_def) functionapp = LongRunningOperation(cmd.cli_ctx)(poller) if consumption_plan_location and is_linux: @@ -2520,7 +2708,8 @@ def try_create_application_insights(cmd, functionapp): ai_name = functionapp.name ai_location = functionapp.location - app_insights_client = get_mgmt_service_client(cmd.cli_ctx, ApplicationInsightsManagementClient) + app_insights_client = get_mgmt_service_client( + cmd.cli_ctx, ApplicationInsightsManagementClient) ai_properties = { "name": ai_name, "location": ai_location, @@ -2529,7 +2718,8 @@ def try_create_application_insights(cmd, functionapp): "Application_Type": "web" } } - appinsights = app_insights_client.components.create_or_update(ai_resource_group_name, ai_name, ai_properties) + appinsights = app_insights_client.components.create_or_update( + ai_resource_group_name, ai_name, ai_properties) if appinsights is None or appinsights.instrumentation_key is None: logger.warning(creation_failed_warn) return @@ -2552,18 +2742,21 @@ def _set_remote_or_local_git(cmd, webapp, resource_group_name, name, deployment_ deployment_source_branch, manual_integration=True) except Exception as ex: # pylint: disable=broad-except ex = ex_handler_factory(no_throw=True)(ex) - logger.warning("Link to git repository failed due to error '%s'", ex) + logger.warning( + "Link to git repository failed due to error '%s'", ex) if deployment_local_git: local_git_info = enable_local_git(cmd, resource_group_name, name) - logger.warning("Local git is configured with url of '%s'", local_git_info['url']) + logger.warning("Local git is configured with url of '%s'", + local_git_info['url']) setattr(webapp, 'deploymentLocalGitUrl', local_git_info['url']) def _validate_and_get_connection_string(cli_ctx, resource_group_name, storage_account): sa_resource_group = resource_group_name if is_valid_resource_id(storage_account): - sa_resource_group = parse_resource_id(storage_account)['resource_group'] + sa_resource_group = parse_resource_id( + storage_account)['resource_group'] storage_account = parse_resource_id(storage_account)['name'] storage_client = get_mgmt_service_client(cli_ctx, StorageManagementClient) storage_properties = storage_client.storage_accounts.get_properties(sa_resource_group, @@ -2571,18 +2764,20 @@ def _validate_and_get_connection_string(cli_ctx, resource_group_name, storage_ac error_message = '' endpoints = storage_properties.primary_endpoints sku = storage_properties.sku.name - allowed_storage_types = ['Standard_GRS', 'Standard_RAGRS', 'Standard_LRS', 'Standard_ZRS', 'Premium_LRS'] + allowed_storage_types = ['Standard_GRS', 'Standard_RAGRS', + 'Standard_LRS', 'Standard_ZRS', 'Premium_LRS'] for e in ['blob', 'queue', 'table']: if not getattr(endpoints, e, None): - error_message = "Storage account '{}' has no '{}' endpoint. It must have table, queue, and blob endpoints all enabled".format(storage_account, e) # pylint: disable=line-too-long + error_message = "Storage account '{}' has no '{}' endpoint. It must have table, queue, and blob endpoints all enabled".format(storage_account, e) # pylint: disable=line-too-long if sku not in allowed_storage_types: error_message += 'Storage type {} is not allowed'.format(sku) if error_message: raise CLIError(error_message) - obj = storage_client.storage_accounts.list_keys(sa_resource_group, storage_account) # pylint: disable=no-member + obj = storage_client.storage_accounts.list_keys( + sa_resource_group, storage_account) # pylint: disable=no-member try: keys = [obj.keys[0].value, obj.keys[1].value] # pylint: disable=no-member except AttributeError: @@ -2624,7 +2819,8 @@ def _check_zip_deployment_status(cmd, rg_name, name, deployment_status_url, auth try: res_dict = response.json() except json.decoder.JSONDecodeError: - logger.warning("Deployment status endpoint %s returns malformed data. Retrying...", deployment_status_url) + logger.warning( + "Deployment status endpoint %s returns malformed data. Retrying...", deployment_status_url) res_dict = {} finally: num_trials = num_trials + 1 @@ -2636,7 +2832,8 @@ def _check_zip_deployment_status(cmd, rg_name, name, deployment_status_url, auth if res_dict.get('status', 0) == 4: break if 'progress' in res_dict: - logger.info(res_dict['progress']) # show only in debug mode, customers seem to find this confusing + # show only in debug mode, customers seem to find this confusing + logger.info(res_dict['progress']) # if the deployment is taking longer than expected if res_dict.get('status', 0) != 4: _configure_default_logging(cmd, rg_name, name) @@ -2652,18 +2849,22 @@ def list_continuous_webjobs(cmd, resource_group_name, name, slot=None): def start_continuous_webjob(cmd, resource_group_name, name, webjob_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot: - client.web_apps.start_continuous_web_job_slot(resource_group_name, name, webjob_name, slot) + client.web_apps.start_continuous_web_job_slot( + resource_group_name, name, webjob_name, slot) return client.web_apps.get_continuous_web_job_slot(resource_group_name, name, webjob_name, slot) - client.web_apps.start_continuous_web_job(resource_group_name, name, webjob_name) + client.web_apps.start_continuous_web_job( + resource_group_name, name, webjob_name) return client.web_apps.get_continuous_web_job(resource_group_name, name, webjob_name) def stop_continuous_webjob(cmd, resource_group_name, name, webjob_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot: - client.web_apps.stop_continuous_web_job_slot(resource_group_name, name, webjob_name, slot) + client.web_apps.stop_continuous_web_job_slot( + resource_group_name, name, webjob_name, slot) return client.web_apps.get_continuous_web_job_slot(resource_group_name, name, webjob_name, slot) - client.web_apps.stop_continuous_web_job(resource_group_name, name, webjob_name) + client.web_apps.stop_continuous_web_job( + resource_group_name, name, webjob_name) return client.web_apps.get_continuous_web_job(resource_group_name, name, webjob_name) @@ -2681,9 +2882,11 @@ def list_triggered_webjobs(cmd, resource_group_name, name, slot=None): def run_triggered_webjob(cmd, resource_group_name, name, webjob_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot: - client.web_apps.run_triggered_web_job_slot(resource_group_name, name, webjob_name, slot) + client.web_apps.run_triggered_web_job_slot( + resource_group_name, name, webjob_name, slot) return client.web_apps.get_triggered_web_job_slot(resource_group_name, name, webjob_name, slot) - client.web_apps.run_triggered_web_job(resource_group_name, name, webjob_name) + client.web_apps.run_triggered_web_job( + resource_group_name, name, webjob_name) return client.web_apps.get_triggered_web_job(resource_group_name, name, webjob_name) @@ -2702,9 +2905,11 @@ def list_hc(cmd, name, resource_group_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot is None: - listed_vals = client.web_apps.list_hybrid_connections(resource_group_name, name) + listed_vals = client.web_apps.list_hybrid_connections( + resource_group_name, name) else: - listed_vals = client.web_apps.list_hybrid_connections_slot(resource_group_name, name, slot) + listed_vals = client.web_apps.list_hybrid_connections_slot( + resource_group_name, name, slot) # reformats hybrid connection, to prune unnecessary fields mod_list = [] @@ -2755,11 +2960,13 @@ def add_hc(cmd, name, resource_group_name, namespace, hybrid_connection, slot=No i = i + 1 # calling the relay API to get information about the hybrid connection - hy_co = hy_co_client.get(hy_co_resource_group, namespace, hybrid_connection) + hy_co = hy_co_client.get(hy_co_resource_group, + namespace, hybrid_connection) # if the hybrid connection does not have a default sender authorization # rule, create it - hy_co_rules = hy_co_client.list_authorization_rules(hy_co_resource_group, namespace, hybrid_connection) + hy_co_rules = hy_co_client.list_authorization_rules( + hy_co_resource_group, namespace, hybrid_connection) has_default_sender_key = False for r in hy_co_rules: if r.name.lower() == "defaultsender": @@ -2772,7 +2979,8 @@ def add_hc(cmd, name, resource_group_name, namespace, hybrid_connection, slot=No hy_co_client.create_or_update_authorization_rule(hy_co_resource_group, namespace, hybrid_connection, "defaultSender", rights) - hy_co_keys = hy_co_client.list_keys(hy_co_resource_group, namespace, hybrid_connection, "defaultSender") + hy_co_keys = hy_co_client.list_keys( + hy_co_resource_group, namespace, hybrid_connection, "defaultSender") hy_co_info = hy_co.id hy_co_metadata = ast.literal_eval(hy_co.user_metadata) hy_co_hostname = '' @@ -2834,11 +3042,13 @@ def set_hc_key(cmd, plan, resource_group_name, namespace, hybrid_connection, key hy_co_client = hycos_mgmt_client_factory(cmd.cli_ctx, cmd.cli_ctx) # calling the relay function to obtain information about the hc in question - hy_co = hy_co_client.get(relay_resource_group, namespace, hybrid_connection) + hy_co = hy_co_client.get(relay_resource_group, + namespace, hybrid_connection) # if the hybrid connection does not have a default sender authorization # rule, create it - hy_co_rules = hy_co_client.list_authorization_rules(relay_resource_group, namespace, hybrid_connection) + hy_co_rules = hy_co_client.list_authorization_rules( + relay_resource_group, namespace, hybrid_connection) has_default_sender_key = False for r in hy_co_rules: if r.name.lower() == "defaultsender": @@ -2851,7 +3061,8 @@ def set_hc_key(cmd, plan, resource_group_name, namespace, hybrid_connection, key hy_co_client.create_or_update_authorization_rule(relay_resource_group, namespace, hybrid_connection, "defaultSender", rights) - hy_co_keys = hy_co_client.list_keys(relay_resource_group, namespace, hybrid_connection, "defaultSender") + hy_co_keys = hy_co_client.list_keys( + relay_resource_group, namespace, hybrid_connection, "defaultSender") hy_co_metadata = ast.literal_eval(hy_co.user_metadata) hy_co_hostname = 0 for x in hy_co_metadata: @@ -2904,7 +3115,8 @@ def remove_hc(cmd, resource_group_name, name, namespace, hybrid_connection, slot client = web_client_factory(cmd.cli_ctx) if slot is None: - return_hc = client.web_apps.delete_hybrid_connection(resource_group_name, name, namespace, hybrid_connection) + return_hc = client.web_apps.delete_hybrid_connection( + resource_group_name, name, namespace, hybrid_connection) else: return_hc = client.web_apps.delete_hybrid_connection_slot(resource_group_name, name, namespace, hybrid_connection, slot) @@ -2914,9 +3126,11 @@ def remove_hc(cmd, resource_group_name, name, namespace, hybrid_connection, slot def list_vnet_integration(cmd, name, resource_group_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot is None: - result = list(client.web_apps.list_vnet_connections(resource_group_name, name)) + result = list(client.web_apps.list_vnet_connections( + resource_group_name, name)) else: - result = list(client.web_apps.list_vnet_connections_slot(resource_group_name, name, slot)) + result = list(client.web_apps.list_vnet_connections_slot( + resource_group_name, name, slot)) mod_list = [] # reformats the vnet entry, removing unecessary information @@ -2955,7 +3169,8 @@ def list_vnet_integration(cmd, name, resource_group_name, slot=None): def add_vnet_integration(cmd, name, resource_group_name, vnet, subnet, slot=None): SwiftVirtualNetwork = cmd.get_models('SwiftVirtualNetwork') - Delegation = cmd.get_models('Delegation', resource_type=ResourceType.MGMT_NETWORK) + Delegation = cmd.get_models( + 'Delegation', resource_type=ResourceType.MGMT_NETWORK) client = web_client_factory(cmd.cli_ctx) vnet_client = network_client_factory(cmd.cli_ctx) @@ -2977,7 +3192,8 @@ def add_vnet_integration(cmd, name, resource_group_name, vnet, subnet, slot=None i = i + 1 if slot is None: - swift_connection_info = client.web_apps.get_swift_virtual_network_connection(resource_group_name, name) + swift_connection_info = client.web_apps.get_swift_virtual_network_connection( + resource_group_name, name) else: swift_connection_info = client.web_apps.get_swift_virtual_network_connection_slot(resource_group_name, name, slot) @@ -2996,7 +3212,8 @@ def add_vnet_integration(cmd, name, resource_group_name, vnet, subnet, slot=None delegated = True if not delegated: - subnetObj.delegations = [Delegation(name="delegation", service_name="Microsoft.Web/serverFarms")] + subnetObj.delegations = [Delegation( + name="delegation", service_name="Microsoft.Web/serverFarms")] vnet_client.subnets.create_or_update(vnet_resource_group, vnet, subnet, subnet_parameters=subnetObj) @@ -3029,9 +3246,11 @@ def add_vnet_integration(cmd, name, resource_group_name, vnet, subnet, slot=None def remove_vnet_integration(cmd, name, resource_group_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot is None: - return_vnet = client.web_apps.delete_swift_virtual_network(resource_group_name, name) + return_vnet = client.web_apps.delete_swift_virtual_network( + resource_group_name, name) else: - return_vnet = client.web_apps.delete_swift_virtual_network_slot(resource_group_name, name, slot) + return_vnet = client.web_apps.delete_swift_virtual_network_slot( + resource_group_name, name, slot) return return_vnet @@ -3065,7 +3284,8 @@ def webapp_up(cmd, name, resource_group_name=None, plan=None, location=None, sku site_config = None if not _create_new_app: # App exists # Get the ASP & RG info, if the ASP & RG parameters are provided we use those else we need to find those - logger.warning("Webapp %s already exists. The command will deploy contents to the existing app.", name) + logger.warning( + "Webapp %s already exists. The command will deploy contents to the existing app.", name) app_details = get_app_details(cmd, name) if app_details is None: raise CLIError("Unable to retrieve details of the existing app {}. Please check that the app is a part of " @@ -3087,7 +3307,8 @@ def webapp_up(cmd, name, resource_group_name=None, plan=None, location=None, sku .format(plan, current_plan)) plan = plan or plan_details['name'] plan_info = client.app_service_plans.get(rg_name, plan) - sku = plan_info.sku.name if isinstance(plan_info, AppServicePlan) else 'Free' + sku = plan_info.sku.name if isinstance( + plan_info, AppServicePlan) else 'Free' current_os = 'Linux' if plan_info.reserved else 'Windows' # Raise error if current OS of the app is different from the current one if current_os.lower() != os_name.lower(): @@ -3105,7 +3326,8 @@ def webapp_up(cmd, name, resource_group_name=None, plan=None, location=None, sku rg_name = get_rg_to_use(cmd, user, loc, os_name, resource_group_name) _is_linux = os_name.lower() == 'linux' _create_new_rg = should_create_new_rg(cmd, rg_name, _is_linux) - plan = get_plan_to_use(cmd, user, os_name, loc, sku, rg_name, _create_new_rg, plan) + plan = get_plan_to_use(cmd, user, os_name, loc, + sku, rg_name, _create_new_rg, plan) dry_run_str = r""" { "name" : "%s", "appserviceplan" : "%s", @@ -3146,11 +3368,13 @@ def webapp_up(cmd, name, resource_group_name=None, plan=None, location=None, sku if os_name.lower() == 'linux' and site_config.linux_fx_version != runtime_version: logger.warning('Updating runtime version from %s to %s', site_config.linux_fx_version, runtime_version) - update_site_configs(cmd, rg_name, name, linux_fx_version=runtime_version) + update_site_configs(cmd, rg_name, name, + linux_fx_version=runtime_version) elif os_name.lower() == 'windows' and site_config.windows_fx_version != runtime_version: logger.warning('Updating runtime version from %s to %s', site_config.windows_fx_version, runtime_version) - update_site_configs(cmd, rg_name, name, windows_fx_version=runtime_version) + update_site_configs(cmd, rg_name, name, + windows_fx_version=runtime_version) create_json['runtime_version'] = runtime_version # Zip contents & Deploy logger.warning("Creating zip with contents of dir %s ...", src_dir) @@ -3187,11 +3411,14 @@ def _ping_scm_site(cmd, resource_group, name): # wake up kudu, by making an SCM call import requests # work around until the timeout limits issue for linux is investigated & fixed - user_name, password = _get_site_credential(cmd.cli_ctx, resource_group, name) + user_name, password = _get_site_credential( + cmd.cli_ctx, resource_group, name) scm_url = _get_scm_url(cmd, resource_group, name) import urllib3 - authorization = urllib3.util.make_headers(basic_auth='{}:{}'.format(user_name, password)) - requests.get(scm_url + '/api/settings', headers=authorization, verify=not should_disable_connection_verify()) + authorization = urllib3.util.make_headers( + basic_auth='{}:{}'.format(user_name, password)) + requests.get(scm_url + '/api/settings', headers=authorization, + verify=not should_disable_connection_verify()) def is_webapp_up(tunnel_server): @@ -3202,7 +3429,8 @@ def get_tunnel(cmd, resource_group_name, name, port=None, slot=None): webapp = show_webapp(cmd, resource_group_name, name, slot) is_linux = webapp.reserved if not is_linux: - raise CLIError("Only Linux App Service Plans supported, Found a Windows App Service Plan") + raise CLIError( + "Only Linux App Service Plans supported, Found a Windows App Service Plan") profiles = list_publish_profiles(cmd, resource_group_name, name, slot) profile_user_name = next(p['userName'] for p in profiles) @@ -3214,7 +3442,8 @@ def get_tunnel(cmd, resource_group_name, name, port=None, slot=None): scm_url = _get_scm_url(cmd, resource_group_name, name, slot) - tunnel_server = TunnelServer('', port, scm_url, profile_user_name, profile_user_password) + tunnel_server = TunnelServer( + '', port, scm_url, profile_user_name, profile_user_password) _ping_scm_site(cmd, resource_group_name, name) _wait_for_webapp(tunnel_server) @@ -3232,11 +3461,13 @@ def create_tunnel(cmd, resource_group_name, name, port=None, slot=None, timeout= config = get_site_configs(cmd, resource_group_name, name, slot) if config.remote_debugging_enabled: - logger.warning('Tunnel is ready, connect on port %s', tunnel_server.local_port) + logger.warning('Tunnel is ready, connect on port %s', + tunnel_server.local_port) else: ssh_user_name = 'root' ssh_user_password = 'Docker!' - logger.warning('SSH is available { username: %s, password: %s }', ssh_user_name, ssh_user_password) + logger.warning( + 'SSH is available { username: %s, password: %s }', ssh_user_name, ssh_user_password) logger.warning('Ctrl + C to close') @@ -3302,7 +3533,8 @@ def _start_ssh_session(hostname, port, username, password): if tries == 0: logger.warning('Connection is not ready yet, please wait') if tries == 60: - raise CLIError("Timeout Error, Unable to establish a connection") + raise CLIError( + "Timeout Error, Unable to establish a connection") tries = tries + 1 logger.warning('.') time.sleep(1) @@ -3323,7 +3555,8 @@ def ssh_webapp(cmd, resource_group_name, name, port=None, slot=None, timeout=Non config = get_site_configs(cmd, resource_group_name, name, slot) if config.remote_debugging_enabled: raise CLIError('remote debugging is enabled, please disable') - create_tunnel_and_session(cmd, resource_group_name, name, port=port, slot=slot, timeout=timeout) + create_tunnel_and_session(cmd, resource_group_name, + name, port=port, slot=slot, timeout=timeout) def create_devops_pipeline( @@ -3346,7 +3579,8 @@ def create_devops_pipeline( def _configure_default_logging(cmd, rg_name, name): - logger.warning("Configuring default logging for the app, if not already enabled") + logger.warning( + "Configuring default logging for the app, if not already enabled") return config_diagnostics(cmd, rg_name, name, application_logging=True, web_server_logging='filesystem', docker_container_logging='true') From 03ba18e9c02422c59271d817385679d957006716 Mon Sep 17 00:00:00 2001 From: Sisira Panchagnula Date: Wed, 19 Feb 2020 18:38:53 -0800 Subject: [PATCH 2/3] Adding test & re-recording --- .../cli/command_modules/appservice/custom.py | 4 +- .../latest/recordings/test_webapp_e2e.yaml | 993 +++++++++++++----- .../tests/latest/test_webapp_commands.py | 912 ++++++++++------ 3 files changed, 1326 insertions(+), 583 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/appservice/custom.py b/src/azure-cli/azure/cli/command_modules/appservice/custom.py index 7f87ec9194b..b87db1a64ee 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/custom.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/custom.py @@ -140,7 +140,7 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi if not match: raise CLIError("Runtime '{}' is not supported. Please invoke 'list-runtimes' to cross check".format( runtime)) # pylint: disable=line-too-long - match['setter'](cmd, match, site_config) + match['setter'](cmd=cmd, stack=match, site_config=site_config) # Be consistent with portal: any windows webapp should have this even it doesn't have node in the stack if not match['displayName'].startswith('node'): site_config.app_settings.append(NameValuePair(name="WEBSITE_NODE_DEFAULT_VERSION", @@ -2347,7 +2347,7 @@ def stacks(self): return self._stacks @staticmethod - def update_site_config(stack, site_config): + def update_site_config(stack, site_config, cmd=None): for k, v in stack['configs'].items(): setattr(site_config, k, v) return site_config diff --git a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/recordings/test_webapp_e2e.yaml b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/recordings/test_webapp_e2e.yaml index 1f0ce977e11..7eeeaa66a62 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/recordings/test_webapp_e2e.yaml +++ b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/recordings/test_webapp_e2e.yaml @@ -13,15 +13,15 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-resource/6.0.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-resource/8.0.1 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2019-07-01 response: body: - string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","type":"Microsoft.Resources/resourceGroups","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2020-01-06T14:19:03Z"},"properties":{"provisioningState":"Succeeded"}}' + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","type":"Microsoft.Resources/resourceGroups","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2020-02-20T02:15:01Z"},"properties":{"provisioningState":"Succeeded"}}' headers: cache-control: - no-cache @@ -30,7 +30,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 06 Jan 2020 14:19:13 GMT + - Thu, 20 Feb 2020 02:15:03 GMT expires: - '-1' pragma: @@ -63,8 +63,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -80,7 +80,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:15 GMT + - Thu, 20 Feb 2020 02:15:03 GMT expires: - '-1' pragma: @@ -118,15 +118,15 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-resource/6.0.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-resource/8.0.1 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2019-07-01 response: body: - string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","type":"Microsoft.Resources/resourceGroups","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2020-01-06T14:19:03Z"},"properties":{"provisioningState":"Succeeded"}}' + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","type":"Microsoft.Resources/resourceGroups","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2020-02-20T02:15:01Z"},"properties":{"provisioningState":"Succeeded"}}' headers: cache-control: - no-cache @@ -135,7 +135,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 06 Jan 2020 14:19:16 GMT + - Thu, 20 Feb 2020 02:15:03 GMT expires: - '-1' pragma: @@ -168,8 +168,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: PUT @@ -177,8 +177,8 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":false,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":false,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' headers: cache-control: - no-cache @@ -187,7 +187,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:27 GMT + - Thu, 20 Feb 2020 02:15:09 GMT expires: - '-1' pragma: @@ -205,7 +205,7 @@ interactions: x-content-type-options: - nosniff x-ms-ratelimit-remaining-subscription-writes: - - '1196' + - '1199' x-powered-by: - ASP.NET status: @@ -225,8 +225,8 @@ interactions: ParameterSetName: - -g User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -234,8 +234,8 @@ interactions: response: body: string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":false,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}],"nextLink":null,"id":null}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":false,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}],"nextLink":null,"id":null}' headers: cache-control: - no-cache @@ -244,7 +244,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:29 GMT + - Thu, 20 Feb 2020 02:15:09 GMT expires: - '-1' pragma: @@ -280,15 +280,15 @@ interactions: ParameterSetName: - -g -n --per-site-scaling User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-resource/6.0.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-resource/8.0.1 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2019-07-01 response: body: - string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","type":"Microsoft.Resources/resourceGroups","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2020-01-06T14:19:03Z"},"properties":{"provisioningState":"Succeeded"}}' + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","type":"Microsoft.Resources/resourceGroups","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2020-02-20T02:15:01Z"},"properties":{"provisioningState":"Succeeded"}}' headers: cache-control: - no-cache @@ -297,7 +297,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 06 Jan 2020 14:19:30 GMT + - Thu, 20 Feb 2020 02:15:09 GMT expires: - '-1' pragma: @@ -330,8 +330,8 @@ interactions: ParameterSetName: - -g -n --per-site-scaling User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -347,7 +347,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:30 GMT + - Thu, 20 Feb 2020 02:15:10 GMT expires: - '-1' pragma: @@ -365,7 +365,7 @@ interactions: x-content-type-options: - nosniff x-ms-ratelimit-remaining-subscription-writes: - - '1199' + - '1198' x-powered-by: - ASP.NET status: @@ -385,15 +385,15 @@ interactions: ParameterSetName: - -g -n --per-site-scaling User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-resource/6.0.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-resource/8.0.1 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2019-07-01 response: body: - string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","type":"Microsoft.Resources/resourceGroups","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2020-01-06T14:19:03Z"},"properties":{"provisioningState":"Succeeded"}}' + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","type":"Microsoft.Resources/resourceGroups","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2020-02-20T02:15:01Z"},"properties":{"provisioningState":"Succeeded"}}' headers: cache-control: - no-cache @@ -402,7 +402,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 06 Jan 2020 14:19:31 GMT + - Thu, 20 Feb 2020 02:15:10 GMT expires: - '-1' pragma: @@ -435,16 +435,16 @@ interactions: ParameterSetName: - -g -n --per-site-scaling User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003?api-version=2019-08-01 response: body: - string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"westus","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","sku":{"name":"B1","tier":"Basic","size":"B1","capacity":1},"workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":null,"webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","capacity":1}}' + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"westus","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","sku":{"name":"B1","tier":"Basic","size":"B1","capacity":1},"workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":null,"webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","capacity":1}}' headers: cache-control: - no-cache @@ -453,7 +453,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:38 GMT + - Thu, 20 Feb 2020 02:15:12 GMT expires: - '-1' pragma: @@ -491,8 +491,8 @@ interactions: ParameterSetName: - -g User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -500,8 +500,8 @@ interactions: response: body: string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}],"nextLink":null,"id":null}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}],"nextLink":null,"id":null}' headers: cache-control: - no-cache @@ -510,7 +510,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:39 GMT + - Thu, 20 Feb 2020 02:15:13 GMT expires: - '-1' pragma: @@ -546,8 +546,8 @@ interactions: ParameterSetName: - -g User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -555,8 +555,8 @@ interactions: response: body: string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}],"nextLink":null,"id":null}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}],"nextLink":null,"id":null}' headers: cache-control: - no-cache @@ -565,7 +565,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:40 GMT + - Thu, 20 Feb 2020 02:15:13 GMT expires: - '-1' pragma: @@ -601,8 +601,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -610,8 +610,8 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' headers: cache-control: - no-cache @@ -620,7 +620,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:41 GMT + - Thu, 20 Feb 2020 02:15:14 GMT expires: - '-1' pragma: @@ -656,8 +656,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -665,8 +665,8 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' headers: cache-control: - no-cache @@ -675,7 +675,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:43 GMT + - Thu, 20 Feb 2020 02:15:14 GMT expires: - '-1' pragma: @@ -716,8 +716,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -733,7 +733,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:44 GMT + - Thu, 20 Feb 2020 02:15:15 GMT expires: - '-1' pragma: @@ -771,8 +771,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -780,8 +780,8 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":0,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' headers: cache-control: - no-cache @@ -790,7 +790,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:19:45 GMT + - Thu, 20 Feb 2020 02:15:15 GMT expires: - '-1' pragma: @@ -834,8 +834,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: PUT @@ -843,18 +843,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:19:50.163","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":null,"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:17.7933333","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":null,"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3524' + - '3623' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:08 GMT + - Thu, 20 Feb 2020 02:15:33 GMT etag: - - '"1D5C49C5BCE80E0"' + - '"1D5E7939891D300"' expires: - '-1' pragma: @@ -896,8 +896,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -906,17 +906,17 @@ interactions: body: string: @@ -928,7 +928,7 @@ interactions: content-type: - application/xml date: - - Mon, 06 Jan 2020 14:20:09 GMT + - Thu, 20 Feb 2020 02:15:34 GMT expires: - '-1' pragma: @@ -962,8 +962,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -971,8 +971,8 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":1,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":1,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' headers: cache-control: - no-cache @@ -981,7 +981,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:11 GMT + - Thu, 20 Feb 2020 02:15:34 GMT expires: - '-1' pragma: @@ -1022,8 +1022,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -1039,7 +1039,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:12 GMT + - Thu, 20 Feb 2020 02:15:34 GMT expires: - '-1' pragma: @@ -1077,8 +1077,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1086,8 +1086,8 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West - US","properties":{"serverFarmId":26695,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"0b1f6471-1bf0-4dda-aec3-cb9272f09590","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West - US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":1,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-065_26695","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":1,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' headers: cache-control: - no-cache @@ -1096,7 +1096,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:12 GMT + - Thu, 20 Feb 2020 02:15:35 GMT expires: - '-1' pragma: @@ -1140,8 +1140,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: PUT @@ -1149,18 +1149,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:15.017","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":null,"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:36.9","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":null,"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3524' + - '3617' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:16 GMT + - Thu, 20 Feb 2020 02:15:37 GMT etag: - - '"1D5C49C5BCE80E0"' + - '"1D5E7939891D300"' expires: - '-1' pragma: @@ -1202,8 +1202,8 @@ interactions: ParameterSetName: - -g -n --plan User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -1212,17 +1212,17 @@ interactions: body: string: @@ -1234,7 +1234,7 @@ interactions: content-type: - application/xml date: - - Mon, 06 Jan 2020 14:20:17 GMT + - Thu, 20 Feb 2020 02:15:37 GMT expires: - '-1' pragma: @@ -1268,8 +1268,8 @@ interactions: ParameterSetName: - -g User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1277,16 +1277,16 @@ interactions: response: body: string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:15.017","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":null,"buildVersion":null,"targetBuildVersion":null}}],"nextLink":null,"id":null}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:36.9","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":null,"buildVersion":null,"targetBuildVersion":null}}],"nextLink":null,"id":null}' headers: cache-control: - no-cache content-length: - - '3562' + - '3655' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:18 GMT + - Thu, 20 Feb 2020 02:15:38 GMT expires: - '-1' pragma: @@ -1322,8 +1322,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1331,18 +1331,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:15.017","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:36.9","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3615' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:19 GMT + - Thu, 20 Feb 2020 02:15:38 GMT etag: - - '"1D5C49C6A085190"' + - '"1D5E793A3A4E840"' expires: - '-1' pragma: @@ -1378,8 +1378,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1387,18 +1387,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:15.017","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:36.9","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3615' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:19 GMT + - Thu, 20 Feb 2020 02:15:38 GMT etag: - - '"1D5C49C6A085190"' + - '"1D5E793A3A4E840"' expires: - '-1' pragma: @@ -1438,8 +1438,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -1448,17 +1448,17 @@ interactions: body: string: @@ -1470,7 +1470,7 @@ interactions: content-type: - application/xml date: - - Mon, 06 Jan 2020 14:20:21 GMT + - Thu, 20 Feb 2020 02:15:38 GMT expires: - '-1' pragma: @@ -1484,7 +1484,7 @@ interactions: x-content-type-options: - nosniff x-ms-ratelimit-remaining-subscription-resource-requests: - - '11998' + - '11999' x-powered-by: - ASP.NET status: @@ -1504,8 +1504,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1513,18 +1513,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:15.017","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:36.9","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3615' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:22 GMT + - Thu, 20 Feb 2020 02:15:39 GMT etag: - - '"1D5C49C6A085190"' + - '"1D5E793A3A4E840"' expires: - '-1' pragma: @@ -1565,8 +1565,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: PUT @@ -1585,9 +1585,9 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:23 GMT + - Thu, 20 Feb 2020 02:15:40 GMT etag: - - '"1D5C49C6A085190"' + - '"1D5E793A3A4E840"' expires: - '-1' pragma: @@ -1625,24 +1625,24 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET uri: https://management.azure.com/providers/Microsoft.Web/publishingUsers/web?api-version=2019-08-01 response: body: - string: '{"id":null,"name":"web","type":"Microsoft.Web/publishingUsers/web","properties":{"name":null,"publishingUserName":null,"publishingPassword":null,"publishingPasswordHash":null,"publishingPasswordHashSalt":null,"metadata":null,"isDeleted":false,"scmUri":null}}' + string: '{"id":null,"name":"web","type":"Microsoft.Web/publishingUsers/web","properties":{"name":null,"publishingUserName":"panchagnula","publishingPassword":null,"publishingPasswordHash":null,"publishingPasswordHashSalt":null,"metadata":null,"isDeleted":false,"scmUri":null}}' headers: cache-control: - no-cache content-length: - - '258' + - '267' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:23 GMT + - Thu, 20 Feb 2020 02:15:40 GMT expires: - '-1' pragma: @@ -1678,8 +1678,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1696,9 +1696,9 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:23 GMT + - Thu, 20 Feb 2020 02:15:40 GMT etag: - - '"1D5C49C6EDD3230"' + - '"1D5E793A5F4F2C0"' expires: - '-1' pragma: @@ -1734,8 +1734,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1752,9 +1752,9 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:25 GMT + - Thu, 20 Feb 2020 02:15:41 GMT etag: - - '"1D5C49C6EDD3230"' + - '"1D5E793A5F4F2C0"' expires: - '-1' pragma: @@ -1791,8 +1791,8 @@ interactions: - -g -n --level --application-logging --detailed-error-messages --failed-request-tracing --web-server-logging User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1800,18 +1800,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:23.123","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:40.78","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3616' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:26 GMT + - Thu, 20 Feb 2020 02:15:42 GMT etag: - - '"1D5C49C6EDD3230"' + - '"1D5E793A5F4F2C0"' expires: - '-1' pragma: @@ -1848,8 +1848,8 @@ interactions: - -g -n --level --application-logging --detailed-error-messages --failed-request-tracing --web-server-logging User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1857,18 +1857,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:23.123","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:40.78","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3616' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:28 GMT + - Thu, 20 Feb 2020 02:15:42 GMT etag: - - '"1D5C49C6EDD3230"' + - '"1D5E793A5F4F2C0"' expires: - '-1' pragma: @@ -1912,8 +1912,8 @@ interactions: - -g -n --level --application-logging --detailed-error-messages --failed-request-tracing --web-server-logging User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: PUT @@ -1930,9 +1930,9 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:29 GMT + - Thu, 20 Feb 2020 02:15:42 GMT etag: - - '"1D5C49C730BE7C0"' + - '"1D5E793A78DE240"' expires: - '-1' pragma: @@ -1950,7 +1950,7 @@ interactions: x-content-type-options: - nosniff x-ms-ratelimit-remaining-subscription-writes: - - '1197' + - '1199' x-powered-by: - ASP.NET status: @@ -1970,8 +1970,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -1979,18 +1979,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:30.14","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:43.46","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3521' + - '3616' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:31 GMT + - Thu, 20 Feb 2020 02:15:43 GMT etag: - - '"1D5C49C730BE7C0"' + - '"1D5E793A78DE240"' expires: - '-1' pragma: @@ -2026,8 +2026,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2044,7 +2044,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:31 GMT + - Thu, 20 Feb 2020 02:15:44 GMT expires: - '-1' pragma: @@ -2080,8 +2080,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2100,7 +2100,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:33 GMT + - Thu, 20 Feb 2020 02:15:45 GMT expires: - '-1' pragma: @@ -2140,8 +2140,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -2150,17 +2150,17 @@ interactions: body: string: @@ -2172,7 +2172,7 @@ interactions: content-type: - application/xml date: - - Mon, 06 Jan 2020 14:20:33 GMT + - Thu, 20 Feb 2020 02:15:46 GMT expires: - '-1' pragma: @@ -2206,8 +2206,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2215,18 +2215,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:30.14","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:43.46","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3521' + - '3616' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:36 GMT + - Thu, 20 Feb 2020 02:15:45 GMT etag: - - '"1D5C49C730BE7C0"' + - '"1D5E793A78DE240"' expires: - '-1' pragma: @@ -2264,8 +2264,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -2279,7 +2279,7 @@ interactions: content-length: - '0' date: - - Mon, 06 Jan 2020 14:20:36 GMT + - Thu, 20 Feb 2020 02:15:46 GMT expires: - '-1' pragma: @@ -2313,8 +2313,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2322,18 +2322,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Stopped","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:36.63","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Stopped","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:46.97","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3521' + - '3616' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:37 GMT + - Thu, 20 Feb 2020 02:15:46 GMT etag: - - '"1D5C49C76EA3360"' + - '"1D5E793A9A577A0"' expires: - '-1' pragma: @@ -2369,8 +2369,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2378,18 +2378,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Stopped","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:36.63","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Stopped","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:46.97","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3521' + - '3616' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:39 GMT + - Thu, 20 Feb 2020 02:15:47 GMT etag: - - '"1D5C49C76EA3360"' + - '"1D5E793A9A577A0"' expires: - '-1' pragma: @@ -2429,8 +2429,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -2439,17 +2439,17 @@ interactions: body: string: @@ -2461,7 +2461,7 @@ interactions: content-type: - application/xml date: - - Mon, 06 Jan 2020 14:20:39 GMT + - Thu, 20 Feb 2020 02:15:47 GMT expires: - '-1' pragma: @@ -2495,8 +2495,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2504,18 +2504,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Stopped","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:36.63","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Stopped","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:46.97","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3521' + - '3616' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:40 GMT + - Thu, 20 Feb 2020 02:15:48 GMT etag: - - '"1D5C49C76EA3360"' + - '"1D5E793A9A577A0"' expires: - '-1' pragma: @@ -2553,8 +2553,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -2568,7 +2568,7 @@ interactions: content-length: - '0' date: - - Mon, 06 Jan 2020 14:20:41 GMT + - Thu, 20 Feb 2020 02:15:49 GMT expires: - '-1' pragma: @@ -2582,7 +2582,7 @@ interactions: x-content-type-options: - nosniff x-ms-ratelimit-remaining-subscription-writes: - - '1199' + - '1198' x-powered-by: - ASP.NET status: @@ -2602,8 +2602,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2611,18 +2611,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:42.043","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:49.1033333","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3621' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:42 GMT + - Thu, 20 Feb 2020 02:15:49 GMT etag: - - '"1D5C49C7A2428B0"' + - '"1D5E793AAEAFCF5"' expires: - '-1' pragma: @@ -2658,8 +2658,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2667,18 +2667,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:42.043","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:49.1033333","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3621' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:43 GMT + - Thu, 20 Feb 2020 02:15:49 GMT etag: - - '"1D5C49C7A2428B0"' + - '"1D5E793AAEAFCF5"' expires: - '-1' pragma: @@ -2718,8 +2718,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -2728,17 +2728,17 @@ interactions: body: string: @@ -2750,7 +2750,7 @@ interactions: content-type: - application/xml date: - - Mon, 06 Jan 2020 14:20:45 GMT + - Thu, 20 Feb 2020 02:15:49 GMT expires: - '-1' pragma: @@ -2786,8 +2786,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -2795,7 +2795,7 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002/publishingcredentials/$webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites/publishingcredentials","location":"West - US","properties":{"name":null,"publishingUserName":"$webapp-e2e000002","publishingPassword":"bJ3XzlxjDPKfuAs08xHky688T8jaK3mKAcQi9ZW72BRz3msGXmuDiTo5QPGC","publishingPasswordHash":null,"publishingPasswordHashSalt":null,"metadata":null,"isDeleted":false,"scmUri":"https://$webapp-e2e000002:bJ3XzlxjDPKfuAs08xHky688T8jaK3mKAcQi9ZW72BRz3msGXmuDiTo5QPGC@webapp-e2e000002.scm.azurewebsites.net"}}' + US","properties":{"name":null,"publishingUserName":"$webapp-e2e000002","publishingPassword":"5ZvhY2BErilhDWvSfSnjRJ7vQ21bToGqqg3247ZGbc69Ts5FxwR3EDbadb7N","publishingPasswordHash":null,"publishingPasswordHashSalt":null,"metadata":null,"isDeleted":false,"scmUri":"https://$webapp-e2e000002:5ZvhY2BErilhDWvSfSnjRJ7vQ21bToGqqg3247ZGbc69Ts5FxwR3EDbadb7N@webapp-e2e000002.scm.azurewebsites.net"}}' headers: cache-control: - no-cache @@ -2804,7 +2804,7 @@ interactions: content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:46 GMT + - Thu, 20 Feb 2020 02:15:50 GMT expires: - '-1' pragma: @@ -2842,8 +2842,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2851,18 +2851,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:42.043","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:49.1033333","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3621' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:47 GMT + - Thu, 20 Feb 2020 02:15:51 GMT etag: - - '"1D5C49C7A2428B0"' + - '"1D5E793AAEAFCF5"' expires: - '-1' pragma: @@ -2898,8 +2898,8 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: GET @@ -2907,18 +2907,18 @@ interactions: response: body: string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West - US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-065.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-01-06T14:20:42.043","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"60839F6C3360A6C20E82F3D8F9761BB02D3D87EF0712991FEF752B337AA757FA","kind":"app","inboundIpAddress":"40.83.183.236","possibleInboundIpAddresses":"40.83.183.236","outboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","possibleOutboundIpAddresses":"40.83.179.31,40.83.181.84,40.83.183.190,40.83.183.1","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-065","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:49.1033333","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":[],"buildVersion":null,"targetBuildVersion":null}}' headers: cache-control: - no-cache content-length: - - '3522' + - '3621' content-type: - application/json date: - - Mon, 06 Jan 2020 14:20:49 GMT + - Thu, 20 Feb 2020 02:15:51 GMT etag: - - '"1D5C49C7A2428B0"' + - '"1D5E793AAEAFCF5"' expires: - '-1' pragma: @@ -2958,8 +2958,389 @@ interactions: ParameterSetName: - -g -n User-Agent: - - python/3.7.4 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 - azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.0.79 + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 + accept-language: + - en-US + method: POST + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002/publishxml?api-version=2019-08-01 + response: + body: + string: + headers: + cache-control: + - no-cache + content-length: + - '1730' + content-type: + - application/xml + date: + - Thu, 20 Feb 2020 02:15:51 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000; includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-resource-requests: + - '11999' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - webapp create + Connection: + - keep-alive + ParameterSetName: + - -g -n --plan -r + User-Agent: + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 + accept-language: + - en-US + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003?api-version=2019-08-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":1,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' + headers: + cache-control: + - no-cache + content-length: + - '1523' + content-type: + - application/json + date: + - Thu, 20 Feb 2020 02:15:52 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000; includeSubDomains + transfer-encoding: + - chunked + vary: + - Accept-Encoding + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: 'b''{"name": "webapp-e2e000002", "type": "Microsoft.Web/sites", "location": + "West US", "properties": {"serverFarmId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003"}}''' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - webapp create + Connection: + - keep-alive + Content-Length: + - '329' + Content-Type: + - application/json; charset=utf-8 + ParameterSetName: + - -g -n --plan -r + User-Agent: + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 + accept-language: + - en-US + method: POST + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/validate?api-version=2019-08-01 + response: + body: + string: '{"status":"Success","error":null}' + headers: + cache-control: + - no-cache + content-length: + - '33' + content-type: + - application/json + date: + - Thu, 20 Feb 2020 02:15:52 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000; includeSubDomains + transfer-encoding: + - chunked + vary: + - Accept-Encoding + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-writes: + - '1199' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - webapp create + Connection: + - keep-alive + ParameterSetName: + - -g -n --plan -r + User-Agent: + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 + accept-language: + - en-US + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003?api-version=2019-08-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","name":"webapp-e2e-plan000003","type":"Microsoft.Web/serverfarms","kind":"app","location":"West + US","properties":{"serverFarmId":13657,"name":"webapp-e2e-plan000003","workerSize":"Default","workerSizeId":0,"workerTierName":null,"numberOfWorkers":1,"currentWorkerSize":"Default","currentWorkerSizeId":0,"currentNumberOfWorkers":1,"status":"Ready","webSpace":"clitest.rg000001-WestUSwebspace","subscription":"e483435e-282d-4ac1-92b5-d6123f2aa360","adminSiteName":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"maximumNumberOfWorkers":3,"planName":"VirtualDedicatedPlan","adminRuntimeSiteName":null,"computeMode":"Dedicated","siteMode":null,"geoRegion":"West + US","perSiteScaling":true,"maximumElasticWorkerCount":1,"numberOfSites":1,"hostingEnvironmentId":null,"isSpot":false,"spotExpirationTime":null,"freeOfferExpirationTime":null,"tags":null,"kind":"app","resourceGroup":"clitest.rg000001","reserved":false,"isXenon":false,"hyperV":false,"mdmId":"waws-prod-bay-137_13657","targetWorkerCount":0,"targetWorkerSizeId":0,"provisioningState":"Succeeded","webSiteId":null,"existingServerFarmIds":null},"sku":{"name":"B1","tier":"Basic","size":"B1","family":"B","capacity":1}}' + headers: + cache-control: + - no-cache + content-length: + - '1523' + content-type: + - application/json + date: + - Thu, 20 Feb 2020 02:15:53 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000; includeSubDomains + transfer-encoding: + - chunked + vary: + - Accept-Encoding + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - webapp create + Connection: + - keep-alive + ParameterSetName: + - -g -n --plan -r + User-Agent: + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 + accept-language: + - en-US + method: GET + uri: https://management.azure.com/providers/Microsoft.Web/availableStacks?osTypeSelected=Windows&api-version=2019-08-01 + response: + body: + string: '{"value":[{"id":null,"name":"aspnet","type":"Microsoft.Web/availableStacks?osTypeSelected=Windows","properties":{"name":"aspnet","display":"ASP.NET","dependency":null,"majorVersions":[{"displayVersion":"V4.7","runtimeVersion":"v4.0","isDefault":true,"minorVersions":[],"applicationInsights":true,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"V3.5","runtimeVersion":"v2.0","isDefault":false,"minorVersions":[],"applicationInsights":true,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":[],"isDeprecated":null}},{"id":null,"name":"dotnetcore","type":"Microsoft.Web/availableStacks?osTypeSelected=Windows","properties":{"name":"dotnetcore","display":".NET + Core","dependency":null,"majorVersions":[{"displayVersion":"1.0","runtimeVersion":null,"isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"1.1","runtimeVersion":null,"isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"2.1","runtimeVersion":null,"isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"2.2","runtimeVersion":null,"isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"3.0","runtimeVersion":null,"isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":[],"isDeprecated":null}},{"id":null,"name":"node","type":"Microsoft.Web/availableStacks?osTypeSelected=Windows","properties":{"name":"node","display":"Node","dependency":null,"majorVersions":[{"displayVersion":"0.6","runtimeVersion":"0.6","isDefault":false,"minorVersions":[{"displayVersion":"0.6.20","runtimeVersion":"0.6.20","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"0.8","runtimeVersion":"0.8","isDefault":false,"minorVersions":[{"displayVersion":"0.8.2","runtimeVersion":"0.8.2","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.8.19","runtimeVersion":"0.8.19","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.8.26","runtimeVersion":"0.8.26","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.8.27","runtimeVersion":"0.8.27","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.8.28","runtimeVersion":"0.8.28","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"0.10","runtimeVersion":"0.10","isDefault":false,"minorVersions":[{"displayVersion":"0.10.5","runtimeVersion":"0.10.5","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.18","runtimeVersion":"0.10.18","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.21","runtimeVersion":"0.10.21","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.24","runtimeVersion":"0.10.24","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.28","runtimeVersion":"0.10.28","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.29","runtimeVersion":"0.10.29","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.31","runtimeVersion":"0.10.31","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.32","runtimeVersion":"0.10.32","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.40","runtimeVersion":"0.10.40","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.10.5","runtimeVersion":"0.10.5","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"0.12","runtimeVersion":"0.12","isDefault":false,"minorVersions":[{"displayVersion":"0.12.0","runtimeVersion":"0.12.0","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.12.2","runtimeVersion":"0.12.2","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.12.3","runtimeVersion":"0.12.3","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"0.12.6","runtimeVersion":"0.12.6","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"4.8","runtimeVersion":"4.8","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"6.5","runtimeVersion":"6.5","isDefault":false,"minorVersions":[{"displayVersion":"6.5.0","runtimeVersion":"6.5.0","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"6.9","runtimeVersion":"6.9","isDefault":false,"minorVersions":[{"displayVersion":"6.9.1","runtimeVersion":"6.9.1","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"6.9.5","runtimeVersion":"6.9.5","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"6.12","runtimeVersion":"6.12","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"7.10","runtimeVersion":"7.10","isDefault":false,"minorVersions":[{"displayVersion":"7.10.1","runtimeVersion":"7.10.1","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"8.1","runtimeVersion":"8.1","isDefault":false,"minorVersions":[{"displayVersion":"8.1.4","runtimeVersion":"8.1.4","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"8.4","runtimeVersion":"8.4","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"8.5","runtimeVersion":"8.5","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"8.9","runtimeVersion":"8.9","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"8.10","runtimeVersion":"8.10","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"8.11","runtimeVersion":"8.11","isDefault":true,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"10.0","runtimeVersion":"10.0","isDefault":false,"minorVersions":[{"displayVersion":"10.0.0","runtimeVersion":"10.0.0","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"10.6","runtimeVersion":"10.6","isDefault":false,"minorVersions":[{"displayVersion":"10.6.0","runtimeVersion":"10.6.0","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"10.14","runtimeVersion":"10.14","isDefault":false,"minorVersions":[{"displayVersion":"10.14.0","runtimeVersion":"10.14.0","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"10.15","runtimeVersion":"10.15","isDefault":false,"minorVersions":[{"displayVersion":"10.15.2","runtimeVersion":"10.15.2","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":[],"isDeprecated":null}},{"id":null,"name":"php","type":"Microsoft.Web/availableStacks?osTypeSelected=Windows","properties":{"name":"php","display":"PHP","dependency":null,"majorVersions":[{"displayVersion":"5.6","runtimeVersion":"5.6","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"7.0","runtimeVersion":"7.0","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"7.1","runtimeVersion":"7.1","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"7.2","runtimeVersion":"7.2","isDefault":true,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"7.3","runtimeVersion":"7.3","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":[],"isDeprecated":null}},{"id":null,"name":"python","type":"Microsoft.Web/availableStacks?osTypeSelected=Windows","properties":{"name":"python","display":"Python","dependency":null,"majorVersions":[{"displayVersion":"2.7","runtimeVersion":"2.7","isDefault":false,"minorVersions":[{"displayVersion":"2.7","runtimeVersion":"2.7.3","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"3.6","runtimeVersion":"3.4","isDefault":false,"minorVersions":[{"displayVersion":"3.6","runtimeVersion":"3.4.0","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":[],"isDeprecated":null}},{"id":null,"name":"java","type":"Microsoft.Web/availableStacks?osTypeSelected=Windows","properties":{"name":"java","display":"Java","dependency":null,"majorVersions":[{"displayVersion":"1.7","runtimeVersion":"1.7","isDefault":false,"minorVersions":[{"displayVersion":"1.7.0_51 + (Oracle)","runtimeVersion":"1.7.0_51","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.7.0_71 + (Oracle)","runtimeVersion":"1.7.0_71","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.7.0_80 + (Oracle)","runtimeVersion":"1.7.0_80","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.7.0_191 + (Azul)","runtimeVersion":"1.7.0_191_ZULU","isDefault":true,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.7.0_222 + (Azul)","runtimeVersion":"1.7.0_222_ZULU","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":true,"isHidden":false},{"displayVersion":"1.8","runtimeVersion":"1.8","isDefault":true,"minorVersions":[{"displayVersion":"1.8.0_25 + (Oracle)","runtimeVersion":"1.8.0_25","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_60 + (Oracle)","runtimeVersion":"1.8.0_60","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_73 + (Oracle)","runtimeVersion":"1.8.0_73","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_92 + (Azul)","runtimeVersion":"1.8.0_92","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_102 + (Azul)","runtimeVersion":"1.8.0_102","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_111 + (Oracle)","runtimeVersion":"1.8.0_111","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_144 + (Azul)","runtimeVersion":"1.8.0_144","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_172 + (Oracle)","runtimeVersion":"1.8.0_172","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_172 + (Azul)","runtimeVersion":"1.8.0_172_ZULU","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_181 + (Oracle)","runtimeVersion":"1.8.0_181","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_181 + (Azul)","runtimeVersion":"1.8.0_181_ZULU","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_202 + (Oracle)","runtimeVersion":"1.8.0_202","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_202 + (Azul)","runtimeVersion":"1.8.0_202_ZULU","isDefault":true,"isRemoteDebuggingEnabled":false},{"displayVersion":"1.8.0_212 + (Azul)","runtimeVersion":"1.8.0_212_ZULU","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"11","runtimeVersion":"11","isDefault":false,"minorVersions":[{"displayVersion":"11.0.2 + (Azul)","runtimeVersion":"11.0.2_ZULU","isDefault":true,"isRemoteDebuggingEnabled":false},{"displayVersion":"11.0.3 + (Azul)","runtimeVersion":"11.0.3_ZULU","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":[],"isDeprecated":null}},{"id":null,"name":"javaContainers","type":"Microsoft.Web/availableStacks?osTypeSelected=Windows","properties":{"name":"javaContainers","display":"Java","dependency":"java","majorVersions":[],"frameworks":[{"name":"tomcat","display":"Tomcat","dependency":null,"majorVersions":[{"displayVersion":"7.0","runtimeVersion":"7.0","isDefault":false,"minorVersions":[{"displayVersion":"7.0.50","runtimeVersion":"7.0.50","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"7.0.62","runtimeVersion":"7.0.62","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"7.0.81","runtimeVersion":"7.0.81","isDefault":true,"isRemoteDebuggingEnabled":false},{"displayVersion":"7.0.94","runtimeVersion":"7.0.94","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":true,"isHidden":false},{"displayVersion":"8.0","runtimeVersion":"8.0","isDefault":false,"minorVersions":[{"displayVersion":"8.0.23","runtimeVersion":"8.0.23","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"8.0.46","runtimeVersion":"8.0.46","isDefault":true,"isRemoteDebuggingEnabled":false},{"displayVersion":"8.0.53","runtimeVersion":"8.0.53","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":true,"isHidden":false},{"displayVersion":"8.5","runtimeVersion":"8.5","isDefault":false,"minorVersions":[{"displayVersion":"8.5.6","runtimeVersion":"8.5.6","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"8.5.20","runtimeVersion":"8.5.20","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"8.5.31","runtimeVersion":"8.5.31","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"8.5.34","runtimeVersion":"8.5.34","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"8.5.37","runtimeVersion":"8.5.37","isDefault":true,"isRemoteDebuggingEnabled":false},{"displayVersion":"8.5.42","runtimeVersion":"8.5.42","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"9.0","runtimeVersion":"9.0","isDefault":true,"minorVersions":[{"displayVersion":"9.0.0","runtimeVersion":"9.0.0","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"9.0.8","runtimeVersion":"9.0.8","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"9.0.12","runtimeVersion":"9.0.12","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"9.0.14","runtimeVersion":"9.0.14","isDefault":true,"isRemoteDebuggingEnabled":false},{"displayVersion":"9.0.21","runtimeVersion":"9.0.21","isDefault":false,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":null,"isDeprecated":null},{"name":"jetty","display":"Jetty","dependency":null,"majorVersions":[{"displayVersion":"9.1","runtimeVersion":"9.1","isDefault":false,"minorVersions":[{"displayVersion":"9.1.0","runtimeVersion":"9.1.0.20131115","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false},{"displayVersion":"9.3","runtimeVersion":"9.3","isDefault":true,"minorVersions":[{"displayVersion":"9.3.13","runtimeVersion":"9.3.13.20161014","isDefault":false,"isRemoteDebuggingEnabled":false},{"displayVersion":"9.3.25","runtimeVersion":"9.3.25.20180904","isDefault":true,"isRemoteDebuggingEnabled":false}],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":null,"isDeprecated":null},{"name":"java","display":"Java","dependency":null,"majorVersions":[{"displayVersion":"SE","runtimeVersion":"SE","isDefault":false,"minorVersions":[],"applicationInsights":false,"isPreview":false,"isDeprecated":false,"isHidden":false}],"frameworks":null,"isDeprecated":null}],"isDeprecated":null}}],"nextLink":null,"id":null}' + headers: + cache-control: + - no-cache + content-length: + - '17080' + content-type: + - application/json + date: + - Thu, 20 Feb 2020 02:15:53 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000; includeSubDomains + transfer-encoding: + - chunked + vary: + - Accept-Encoding + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: 'b''{"location": "West US", "properties": {"serverFarmId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003", + "reserved": false, "isXenon": false, "hyperV": false, "siteConfig": {"netFrameworkVersion": + "v4.6", "phpVersion": "7.3", "appSettings": [{"name": "WEBSITE_NODE_DEFAULT_VERSION", + "value": "10.14"}], "localMySqlEnabled": false, "http20Enabled": true}, "scmSiteAlsoStopped": + false, "httpsOnly": false}}''' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - webapp create + Connection: + - keep-alive + Content-Length: + - '561' + Content-Type: + - application/json; charset=utf-8 + ParameterSetName: + - -g -n --plan -r + User-Agent: + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 + accept-language: + - en-US + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002?api-version=2019-08-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002","name":"webapp-e2e000002","type":"Microsoft.Web/sites","kind":"app","location":"West + US","properties":{"name":"webapp-e2e000002","state":"Running","hostNames":["webapp-e2e000002.azurewebsites.net"],"webSpace":"clitest.rg000001-WestUSwebspace","selfLink":"https://waws-prod-bay-137.api.azurewebsites.windows.net:454/subscriptions/00000000-0000-0000-0000-000000000000/webspaces/clitest.rg000001-WestUSwebspace/sites/webapp-e2e000002","repositorySiteName":"webapp-e2e000002","owner":null,"usageState":"Normal","enabled":true,"adminEnabled":true,"enabledHostNames":["webapp-e2e000002.azurewebsites.net","webapp-e2e000002.scm.azurewebsites.net"],"siteProperties":{"metadata":null,"properties":[{"name":"LinuxFxVersion","value":""},{"name":"WindowsFxVersion","value":null}],"appSettings":null},"availabilityState":"Normal","sslCertificates":null,"csrs":[],"cers":null,"siteMode":null,"hostNameSslStates":[{"name":"webapp-e2e000002.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Standard"},{"name":"webapp-e2e000002.scm.azurewebsites.net","sslState":"Disabled","ipBasedSslResult":null,"virtualIP":null,"thumbprint":null,"toUpdate":null,"toUpdateIpBasedSsl":null,"ipBasedSslState":"NotConfigured","hostType":"Repository"}],"computeMode":null,"serverFarm":null,"serverFarmId":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/serverfarms/webapp-e2e-plan000003","reserved":false,"isXenon":false,"hyperV":false,"lastModifiedTimeUtc":"2020-02-20T02:15:54.8366667","storageRecoveryDefaultState":"Running","contentAvailabilityState":"Normal","runtimeAvailabilityState":"Normal","siteConfig":null,"deploymentId":"webapp-e2e000002","trafficManagerHostNames":null,"sku":"Basic","scmSiteAlsoStopped":false,"targetSwapSlot":null,"hostingEnvironment":null,"hostingEnvironmentProfile":null,"clientAffinityEnabled":true,"clientCertEnabled":false,"clientCertExclusionPaths":null,"hostNamesDisabled":false,"domainVerificationIdentifiers":null,"customDomainVerificationId":"E23DBA56BCD0662A21A876967C7A7AE5086466834430706D3AC38BD18E2BF13B","kind":"app","inboundIpAddress":"40.112.243.6","possibleInboundIpAddresses":"40.112.243.6","outboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182","possibleOutboundIpAddresses":"40.112.243.6,13.93.220.248,13.93.221.96,13.93.221.41,13.93.220.182,13.93.221.147,13.93.220.112,13.91.111.88,13.93.220.5,13.93.220.231","containerSize":0,"dailyMemoryTimeQuota":0,"suspendedTill":null,"siteDisabledReason":0,"functionExecutionUnitsCache":null,"maxNumberOfWorkers":null,"homeStamp":"waws-prod-bay-137","cloningInfo":null,"hostingEnvironmentId":null,"tags":null,"resourceGroup":"clitest.rg000001","defaultHostName":"webapp-e2e000002.azurewebsites.net","slotSwapStatus":null,"httpsOnly":false,"redundancyMode":"None","inProgressOperationId":null,"geoDistributions":null,"privateEndpointConnections":null,"buildVersion":null,"targetBuildVersion":null}}' + headers: + cache-control: + - no-cache + content-length: + - '3623' + content-type: + - application/json + date: + - Thu, 20 Feb 2020 02:15:55 GMT + etag: + - '"1D5E793AAEAFCF5"' + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000; includeSubDomains + transfer-encoding: + - chunked + vary: + - Accept-Encoding + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-resource-requests: + - '499' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + CommandName: + - webapp create + Connection: + - keep-alive + Content-Length: + - '2' + Content-Type: + - application/json; charset=utf-8 + ParameterSetName: + - -g -n --plan -r + User-Agent: + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 accept-language: - en-US method: POST @@ -2968,17 +3349,17 @@ interactions: body: string: @@ -2990,7 +3371,7 @@ interactions: content-type: - application/xml date: - - Mon, 06 Jan 2020 14:20:50 GMT + - Thu, 20 Feb 2020 02:15:55 GMT expires: - '-1' pragma: @@ -3004,7 +3385,63 @@ interactions: x-content-type-options: - nosniff x-ms-ratelimit-remaining-subscription-resource-requests: - - '11998' + - '11999' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - webapp config show + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - python/3.7.5 (Windows-10-10.0.18362-SP0) msrest/0.6.10 msrest_azure/0.6.2 + azure-mgmt-web/0.44.0 Azure-SDK-For-Python AZURECLI/2.1.0 + accept-language: + - en-US + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002/config/web?api-version=2019-08-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Web/sites/webapp-e2e000002/config/web","name":"webapp-e2e000002","type":"Microsoft.Web/sites/config","location":"West + US","properties":{"numberOfWorkers":1,"defaultDocuments":["Default.htm","Default.html","Default.asp","index.htm","index.html","iisstart.htm","default.aspx","index.php","hostingstart.html"],"netFrameworkVersion":"v4.0","phpVersion":"7.3","pythonVersion":"","nodeVersion":"","linuxFxVersion":"","windowsFxVersion":null,"requestTracingEnabled":true,"requestTracingExpirationTime":"9999-12-31T23:59:00Z","remoteDebuggingEnabled":false,"remoteDebuggingVersion":null,"httpLoggingEnabled":true,"azureMonitorLogCategories":null,"logsDirectorySizeLimit":100,"detailedErrorLoggingEnabled":true,"publishingUsername":"$webapp-e2e000002","publishingPassword":null,"appSettings":null,"metadata":null,"connectionStrings":null,"machineKey":null,"handlerMappings":null,"documentRoot":null,"scmType":"LocalGit","use32BitWorkerProcess":true,"webSocketsEnabled":false,"alwaysOn":false,"javaVersion":null,"javaContainer":null,"javaContainerVersion":null,"appCommandLine":"","managedPipelineMode":"Integrated","virtualApplications":[{"virtualPath":"/","physicalPath":"site\\wwwroot","preloadEnabled":false,"virtualDirectories":null}],"winAuthAdminState":0,"winAuthTenantState":0,"customAppPoolIdentityAdminState":false,"customAppPoolIdentityTenantState":false,"runtimeADUser":null,"runtimeADUserPassword":null,"loadBalancing":"LeastRequests","routingRules":[],"experiments":{"rampUpRules":[]},"limits":null,"autoHealEnabled":false,"autoHealRules":null,"tracingOptions":null,"vnetName":"","siteAuthEnabled":false,"siteAuthSettings":{"enabled":null,"unauthenticatedClientAction":null,"tokenStoreEnabled":null,"allowedExternalRedirectUrls":null,"defaultProvider":null,"clientId":null,"clientSecret":null,"clientSecretCertificateThumbprint":null,"issuer":null,"allowedAudiences":null,"additionalLoginParams":null,"isAadAutoProvisioned":false,"googleClientId":null,"googleClientSecret":null,"googleOAuthScopes":null,"facebookAppId":null,"facebookAppSecret":null,"facebookOAuthScopes":null,"twitterConsumerKey":null,"twitterConsumerSecret":null,"microsoftAccountClientId":null,"microsoftAccountClientSecret":null,"microsoftAccountOAuthScopes":null},"cors":null,"push":null,"apiDefinition":null,"apiManagementConfig":null,"autoSwapSlotName":null,"localMySqlEnabled":false,"managedServiceIdentityId":null,"xManagedServiceIdentityId":null,"ipSecurityRestrictions":[{"ipAddress":"Any","action":"Allow","priority":1,"name":"Allow + all","description":"Allow all access"}],"scmIpSecurityRestrictions":[{"ipAddress":"Any","action":"Allow","priority":1,"name":"Allow + all","description":"Allow all access"}],"scmIpSecurityRestrictionsUseMain":false,"http20Enabled":true,"minTlsVersion":"1.2","ftpsState":"AllAllowed","preWarmedInstanceCount":0,"healthCheckPath":null,"fileChangeAuditEnabled":false,"functionsRuntimeScaleMonitoringEnabled":false,"websiteTimeZone":null}}' + headers: + cache-control: + - no-cache + content-length: + - '3142' + content-type: + - application/json + date: + - Thu, 20 Feb 2020 02:15:56 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000; includeSubDomains + transfer-encoding: + - chunked + vary: + - Accept-Encoding + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff x-powered-by: - ASP.NET status: diff --git a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands.py b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands.py index d4f2755a46a..76db666ca45 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/tests/latest/test_webapp_commands.py @@ -37,7 +37,9 @@ def test_webapp_e2e(self, resource_group): JMESPathCheck('[0].name', plan), JMESPathCheck('[0].perSiteScaling', False) ]) - self.cmd('appservice plan create -g {} -n {} --per-site-scaling'.format(resource_group, plan)) # test idempotency + # test idempotency + self.cmd( + 'appservice plan create -g {} -n {} --per-site-scaling'.format(resource_group, plan)) self.cmd('appservice plan list -g {}'.format(resource_group), checks=[ JMESPathCheck('length(@)', 1), JMESPathCheck('[0].name', plan), @@ -46,7 +48,8 @@ def test_webapp_e2e(self, resource_group): JMESPathCheck('[0].perSiteScaling', True) ]) self.cmd('appservice plan list -g {}'.format(resource_group), checks=[ - JMESPathCheck("length([?name=='{}' && resourceGroup=='{}'])".format(plan, resource_group), 1) + JMESPathCheck("length([?name=='{}' && resourceGroup=='{}'])".format( + plan, resource_group), 1) ]) self.cmd('appservice plan show -g {} -n {}'.format(resource_group, plan), checks=[ JMESPathCheck('name', plan) @@ -56,20 +59,24 @@ def test_webapp_e2e(self, resource_group): JMESPathCheck('name', webapp_name), JMESPathCheck('hostNames[0]', webapp_name + '.azurewebsites.net') ]) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) # test idempotency + self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, + webapp_name, plan)) # test idempotency self.cmd('webapp list -g {}'.format(resource_group), checks=[ JMESPathCheck('length(@)', 1), JMESPathCheck('[0].name', webapp_name), - JMESPathCheck('[0].hostNames[0]', webapp_name + '.azurewebsites.net') + JMESPathCheck('[0].hostNames[0]', webapp_name + + '.azurewebsites.net') ]) self.cmd('webapp show -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('name', webapp_name), JMESPathCheck('hostNames[0]', webapp_name + '.azurewebsites.net') ]) - result = self.cmd('webapp deployment source config-local-git -g {} -n {}'.format(resource_group, webapp_name)).get_output_in_json() + result = self.cmd('webapp deployment source config-local-git -g {} -n {}'.format( + resource_group, webapp_name)).get_output_in_json() self.assertTrue(result['url'].endswith(webapp_name + '.git')) self.cmd('webapp deployment source show -g {} -n {}'.format(resource_group, webapp_name), checks=[ - JMESPathCheck('repoUrl', 'https://{}.scm.azurewebsites.net'.format(webapp_name)) + JMESPathCheck( + 'repoUrl', 'https://{}.scm.azurewebsites.net'.format(webapp_name)) ]) # turn on diagnostics test_cmd = ('webapp log config -g {} -n {} --level verbose'.format(resource_group, webapp_name) + ' ' @@ -87,7 +94,8 @@ def test_webapp_e2e(self, resource_group): # TODO: contact webapp team for where to retrieve 'level' ]) # show publish profile info - result = self.cmd('webapp deployment list-publishing-profiles -g {} -n {}'.format(resource_group, webapp_name)).get_output_in_json() + result = self.cmd('webapp deployment list-publishing-profiles -g {} -n {}'.format( + resource_group, webapp_name)).get_output_in_json() self.assertTrue(result[1]['publishUrl'].startswith('ftp://')) self.cmd('webapp stop -g {} -n {}'.format(resource_group, webapp_name)) self.cmd('webapp show -g {} -n {}'.format(resource_group, webapp_name), checks=[ @@ -100,13 +108,21 @@ def test_webapp_e2e(self, resource_group): JMESPathCheck('name', webapp_name) ]) # show publishing credentials - result = self.cmd('webapp deployment list-publishing-credentials -g {} -n {}'.format(resource_group, webapp_name)).get_output_in_json() + result = self.cmd('webapp deployment list-publishing-credentials -g {} -n {}'.format( + resource_group, webapp_name)).get_output_in_json() self.assertTrue('scm' in result['scmUri']) # verify httpsOnly is false self.cmd('webapp show -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('httpsOnly', False), ]) + # verify creating an non node app using --runtime + self.cmd( + 'webapp create -g {} -n {} --plan {} -r "php|7.3"'.format(resource_group, webapp_name, plan)) + self.cmd('webapp config show -g {} -n {}'.format(resource_group, webapp_name), checks=[ + JMESPathCheck('phpVersion', '7.3') + ]) + def test_webapp_runtimes(self): self.cmd('webapp list-runtimes') @@ -117,7 +133,8 @@ def test_win_webapp_quick_create(self, resource_group): webapp_name = self.create_random_name(prefix='webapp-quick', length=24) plan = self.create_random_name(prefix='plan-quick', length=24) self.cmd('appservice plan create -g {} -n {}'.format(resource_group, plan)) - r = self.cmd('webapp create -g {} -n {} --plan {} --deployment-local-git'.format(resource_group, webapp_name, plan)).get_output_in_json() + r = self.cmd('webapp create -g {} -n {} --plan {} --deployment-local-git'.format( + resource_group, webapp_name, plan)).get_output_in_json() self.assertTrue(r['ftpPublishingUrl'].startswith('ftp://')) self.cmd('webapp config appsettings list -g {} -n {}'.format(resource_group, webapp_name, checks=[ JMESPathCheck('[0].name', 'WEBSITE_NODE_DEFAULT_VERSION'), @@ -129,7 +146,8 @@ def test_win_webapp_quick_create_runtime(self, resource_group): webapp_name = self.create_random_name(prefix='webapp-quick', length=24) plan = self.create_random_name(prefix='plan-quick', length=24) self.cmd('appservice plan create -g {} -n {}'.format(resource_group, plan)) - r = self.cmd('webapp create -g {} -n {} --plan {} --deployment-local-git -r "node|6.12"'.format(resource_group, webapp_name, plan)).get_output_in_json() + r = self.cmd('webapp create -g {} -n {} --plan {} --deployment-local-git -r "node|6.12"'.format( + resource_group, webapp_name, plan)).get_output_in_json() self.assertTrue(r['ftpPublishingUrl'].startswith('ftp://')) self.cmd('webapp config appsettings list -g {} -n {}'.format(resource_group, webapp_name, checks=[ JMESPathCheck('[0].name', 'WEBSITE_NODE_DEFAULT_VERSION'), @@ -138,24 +156,30 @@ def test_win_webapp_quick_create_runtime(self, resource_group): @ResourceGroupPreparer() def test_win_webapp_quick_create_cd(self, resource_group): - webapp_name = self.create_random_name(prefix='webapp-quick-cd', length=24) + webapp_name = self.create_random_name( + prefix='webapp-quick-cd', length=24) plan = self.create_random_name(prefix='plan-quick', length=24) self.cmd('appservice plan create -g {} -n {}'.format(resource_group, plan)) self.cmd('webapp create -g {} -n {} --plan {} --deployment-source-url {} -r "node|6.12"'.format( resource_group, webapp_name, plan, TEST_REPO_URL)) - time.sleep(30) # 30 seconds should be enough for the deployment finished(Skipped under playback mode) + # 30 seconds should be enough for the deployment finished(Skipped under playback mode) + time.sleep(30) r = requests.get('http://{}.azurewebsites.net'.format(webapp_name)) # verify the web page self.assertTrue('Hello world' in str(r.content)) @ResourceGroupPreparer(location='japaneast') def test_linux_webapp_quick_create(self, resource_group): - webapp_name = self.create_random_name(prefix='webapp-quick-linux', length=24) + webapp_name = self.create_random_name( + prefix='webapp-quick-linux', length=24) plan = self.create_random_name(prefix='plan-quick-linux', length=24) - self.cmd('appservice plan create -g {} -n {} --is-linux'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {} -i patle/ruby-hello'.format(resource_group, webapp_name, plan)) - r = requests.get('http://{}.azurewebsites.net'.format(webapp_name), timeout=240) + self.cmd( + 'appservice plan create -g {} -n {} --is-linux'.format(resource_group, plan)) + self.cmd('webapp create -g {} -n {} --plan {} -i patle/ruby-hello'.format( + resource_group, webapp_name, plan)) + r = requests.get( + 'http://{}.azurewebsites.net'.format(webapp_name), timeout=240) # verify the web page self.assertTrue('Ruby on Rails in Web Apps on Linux' in str(r.content)) # verify app settings @@ -166,43 +190,54 @@ def test_linux_webapp_quick_create(self, resource_group): @ResourceGroupPreparer() def test_linux_webapp_multicontainer_create(self, resource_group): - webapp_name = self.create_random_name(prefix='webapp-linux-multi', length=24) + webapp_name = self.create_random_name( + prefix='webapp-linux-multi', length=24) plan = self.create_random_name(prefix='plan-linux-multi', length=24) config_file = os.path.join(TEST_DIR, 'sample-compose.yml') - self.cmd('appservice plan create -g {} -n {} --is-linux'.format(resource_group, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --is-linux'.format(resource_group, plan)) self.cmd("webapp create -g {} -n {} --plan {} --multicontainer-config-file \"{}\" " "--multicontainer-config-type COMPOSE".format(resource_group, webapp_name, plan, config_file)) last_number_seen = 99999999 for x in range(0, 10): - r = requests.get('http://{}.azurewebsites.net'.format(webapp_name), timeout=240) + r = requests.get( + 'http://{}.azurewebsites.net'.format(webapp_name), timeout=240) # verify the web page self.assertTrue('Hello World! I have been seen' in str(r.content)) - current_number = [int(s) for s in r.content.split() if s.isdigit()][0] + current_number = [int(s) + for s in r.content.split() if s.isdigit()][0] self.assertNotEqual(current_number, last_number_seen) last_number_seen = current_number @ResourceGroupPreparer(location='japanwest') def test_linux_webapp_quick_create_cd(self, resource_group): - webapp_name = self.create_random_name(prefix='webapp-linux-cd', length=24) + webapp_name = self.create_random_name( + prefix='webapp-linux-cd', length=24) plan = 'plan-quick-linux-cd' - self.cmd('appservice plan create -g {} -n {} --is-linux'.format(resource_group, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --is-linux'.format(resource_group, plan)) self.cmd('webapp create -g {} -n {} --plan {} -u {} -r "node|10.14"'.format(resource_group, webapp_name, plan, TEST_REPO_URL)) - time.sleep(45) # 45 seconds should be enough for the deployment finished(Skipped under playback mode) - r = requests.get('http://{}.azurewebsites.net'.format(webapp_name), timeout=240) + # 45 seconds should be enough for the deployment finished(Skipped under playback mode) + time.sleep(45) + r = requests.get( + 'http://{}.azurewebsites.net'.format(webapp_name), timeout=240) # verify the web page if 'Hello world' not in str(r.content): # dump out more info for diagnose - self.fail("'Hello world' is not found in the web page. We get instead:" + str(r.content)) + self.fail( + "'Hello world' is not found in the web page. We get instead:" + str(r.content)) @ResourceGroupPreparer(parameter_name='resource_group', parameter_name_for_location='resource_group_location') @ResourceGroupPreparer(parameter_name='resource_group2', parameter_name_for_location='resource_group_location2') def test_create_in_different_group(self, resource_group, resource_group_location, resource_group2, resource_group_location2): plan = 'planInOneRG' - self.cmd('group create -n {} -l {}'.format(resource_group2, resource_group_location)) - plan_id = self.cmd('appservice plan create -g {} -n {}'.format(resource_group, plan)).get_output_in_json()['id'] + self.cmd('group create -n {} -l {}'.format(resource_group2, + resource_group_location)) + plan_id = self.cmd('appservice plan create -g {} -n {}'.format( + resource_group, plan)).get_output_in_json()['id'] self.cmd('webapp create -g {} -n webInOtherRG --plan {}'.format(resource_group2, plan_id), checks=[ JMESPathCheck('name', 'webInOtherRG') ]) @@ -213,40 +248,50 @@ class AppServiceLogTest(ScenarioTest): @ResourceGroupPreparer() def test_download_win_web_log(self, resource_group): import zipfile - webapp_name = self.create_random_name(prefix='webapp-win-log', length=24) + webapp_name = self.create_random_name( + prefix='webapp-win-log', length=24) plan = self.create_random_name(prefix='win-log', length=24) self.cmd('appservice plan create -g {} -n {}'.format(resource_group, plan)) self.cmd('webapp create -g {} -n {} --plan {} --deployment-source-url {} -r "node|6.12"'.format( resource_group, webapp_name, plan, TEST_REPO_URL)) - time.sleep(30) # 30 seconds should be enough for the deployment finished(Skipped under playback mode) + # 30 seconds should be enough for the deployment finished(Skipped under playback mode) + time.sleep(30) # sanity check the traces _, log_file = tempfile.mkstemp() log_dir = log_file + '-dir' - self.cmd('webapp log download -g {} -n {} --log-file "{}"'.format(resource_group, webapp_name, log_file)) + self.cmd('webapp log download -g {} -n {} --log-file "{}"'.format( + resource_group, webapp_name, log_file)) zip_ref = zipfile.ZipFile(log_file, 'r') zip_ref.extractall(log_dir) - self.assertTrue(os.path.isdir(os.path.join(log_dir, 'LogFiles', 'kudu', 'trace'))) + self.assertTrue(os.path.isdir(os.path.join( + log_dir, 'LogFiles', 'kudu', 'trace'))) @unittest.skip("Cannot pass under python3. Needs fixing.") @ResourceGroupPreparer() def test_download_linux_web_log(self, resource_group): import zipfile - webapp_name = self.create_random_name(prefix='webapp-linux-log', length=24) + webapp_name = self.create_random_name( + prefix='webapp-linux-log', length=24) plan = self.create_random_name(prefix='linux-log', length=24) - self.cmd('appservice plan create -g {} -n {} --is-linux'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {} -i patle/ruby-hello'.format(resource_group, webapp_name, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --is-linux'.format(resource_group, plan)) + self.cmd('webapp create -g {} -n {} --plan {} -i patle/ruby-hello'.format( + resource_group, webapp_name, plan)) # load the site to produce a few traces - requests.get('http://{}.azurewebsites.net'.format(webapp_name), timeout=240) + requests.get( + 'http://{}.azurewebsites.net'.format(webapp_name), timeout=240) # sanity check the traces _, log_file = tempfile.mkstemp() log_dir = log_file + '-dir' - self.cmd('webapp log download -g {} -n {} --log-file "{}"'.format(resource_group, webapp_name, log_file)) + self.cmd('webapp log download -g {} -n {} --log-file "{}"'.format( + resource_group, webapp_name, log_file)) zip_ref = zipfile.ZipFile(log_file, 'r') zip_ref.extractall(log_dir) - self.assertTrue(os.path.isdir(os.path.join(log_dir, 'LogFiles', 'kudu', 'trace'))) + self.assertTrue(os.path.isdir(os.path.join( + log_dir, 'LogFiles', 'kudu', 'trace'))) class AppServicePlanScenarioTest(ScenarioTest): @@ -255,7 +300,8 @@ def test_retain_plan(self, resource_group): webapp_name = self.create_random_name('web', 24) plan = self.create_random_name('web-plan', 24) self.cmd('appservice plan create -g {} -n {}'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) self.cmd('webapp delete -g {} -n {} --keep-dns-registration --keep-empty-plan --keep-metrics'.format(resource_group, webapp_name)) self.cmd('appservice plan list -g {}'.format(resource_group), checks=[ JMESPathCheck('[0].name', plan) @@ -265,18 +311,21 @@ def test_retain_plan(self, resource_group): def test_auto_delete_plan(self, resource_group): webapp_name = self.create_random_name('web-del-test', 24) plan = self.create_random_name('web-del-plan', 24) - self.cmd('appservice plan create -g {} -n {} -l westus'.format(resource_group, plan)) + self.cmd( + 'appservice plan create -g {} -n {} -l westus'.format(resource_group, plan)) self.cmd('appservice plan update -g {} -n {} --sku S1'.format(resource_group, plan), checks=[JMESPathCheck('name', plan), JMESPathCheck('sku.tier', 'Standard'), JMESPathCheck('sku.name', 'S1')]) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) self.cmd('webapp delete -g {} -n {}'.format(resource_group, webapp_name)) # test empty service plan should be automatically deleted. - self.cmd('appservice plan list -g {}'.format(resource_group), checks=[JMESPathCheck('length(@)', 0)]) + self.cmd('appservice plan list -g {}'.format(resource_group), + checks=[JMESPathCheck('length(@)', 0)]) class WebappConfigureTest(ScenarioTest): @@ -285,8 +334,10 @@ def test_webapp_config(self, resource_group): webapp_name = self.create_random_name('webapp-config-test', 40) plan_name = self.create_random_name('webapp-config-plan', 40) - self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan_name)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan_name)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) # verify the baseline self.cmd('webapp config show -g {} -n {}'.format(resource_group, webapp_name)).assert_with_checks([ @@ -331,12 +382,14 @@ def test_webapp_config(self, resource_group): ]) # show - result = self.cmd('webapp config appsettings list -g {} -n {}'.format(resource_group, webapp_name)).get_output_in_json() + result = self.cmd('webapp config appsettings list -g {} -n {}'.format( + resource_group, webapp_name)).get_output_in_json() s2 = next((x for x in result if x['name'] == 's2')) self.assertEqual(s2['name'], 's2') self.assertEqual(s2['slotSetting'], False) self.assertEqual(s2['value'], 'bar') - self.assertEqual(set([x['name'] for x in result]), set(['s1', 's2', 's3', 'WEBSITE_NODE_DEFAULT_VERSION'])) + self.assertEqual(set([x['name'] for x in result]), set( + ['s1', 's2', 's3', 'WEBSITE_NODE_DEFAULT_VERSION'])) # delete self.cmd('webapp config appsettings delete -g {} -n {} --setting-names s1 s2' .format(resource_group, webapp_name)).assert_with_checks([ @@ -352,11 +405,14 @@ def test_webapp_config(self, resource_group): # site azure storage account configurations tests runtime = 'node|6.6' - linux_plan = self.create_random_name(prefix='webapp-linux-plan', length=24) - linux_webapp = self.create_random_name(prefix='webapp-linux', length=24) + linux_plan = self.create_random_name( + prefix='webapp-linux-plan', length=24) + linux_webapp = self.create_random_name( + prefix='webapp-linux', length=24) self.cmd('appservice plan create -g {} -n {} -l eastus --sku S1 --is-linux'.format(resource_group, linux_plan), checks=[ - JMESPathCheck('reserved', True), # this weird field means it is a linux + # this weird field means it is a linux + JMESPathCheck('reserved', True), JMESPathCheck('sku.name', 'S1'), ]) self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format(resource_group, linux_webapp, linux_plan, runtime), @@ -365,7 +421,7 @@ def test_webapp_config(self, resource_group): ]) # add self.cmd(('webapp config storage-account add -g {} -n {} --custom-id Id --storage-type AzureFiles --account-name name ' - '--share-name sharename --access-key key --mount-path /path/to/mount').format(resource_group, linux_webapp)) + '--share-name sharename --access-key key --mount-path /path/to/mount').format(resource_group, linux_webapp)) self.cmd('webapp config storage-account list -g {} -n {}'.format(resource_group, linux_webapp)).assert_with_checks([ JMESPathCheck('length(@)', 1), JMESPathCheck("[?name=='Id']|[0].value.type", "AzureFiles"), @@ -411,7 +467,8 @@ def test_webapp_config(self, resource_group): JMESPathCheck('[0].name', 'c2')]) # see deployment user; just make sure the command does return something - self.assertTrue(self.cmd('webapp deployment user show').get_output_in_json()['type']) + self.assertTrue( + self.cmd('webapp deployment user show').get_output_in_json()['type']) @ResourceGroupPreparer(name_prefix='cli_test_webapp_json') def test_update_webapp_settings_thru_json(self, resource_group): @@ -423,8 +480,10 @@ def test_update_webapp_settings_thru_json(self, resource_group): with open(settings_file, 'w+') as file: file.write(json.dumps({'s2': 'value2'})) - self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan_name)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan_name)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) output = self.cmd('webapp config appsettings set -g {} -n {} --settings s=value "@{}"'.format( resource_group, webapp_name, settings_file)).get_output_in_json() @@ -493,10 +552,12 @@ def test_webapp_scale(self, resource_group): JMESPathCheck('sku.tier', 'Shared'), JMESPathCheck('sku.size', 'D1'), JMESPathCheck('sku.family', 'D'), - JMESPathCheck('sku.capacity', 0) # 0 means the default value: 1 instance + # 0 means the default value: 1 instance + JMESPathCheck('sku.capacity', 0) ]) # scale up - self.cmd('appservice plan update -g {} -n {} --sku S2'.format(resource_group, plan)) + self.cmd( + 'appservice plan update -g {} -n {} --sku S2'.format(resource_group, plan)) self.cmd('appservice plan show -g {} -n {}'.format(resource_group, plan), checks=[ JMESPathCheck('sku.name', 'S2'), JMESPathCheck('sku.tier', 'Standard'), @@ -504,7 +565,8 @@ def test_webapp_scale(self, resource_group): JMESPathCheck('sku.family', 'S') ]) # scale down - self.cmd('appservice plan update -g {} -n {} --sku B1'.format(resource_group, plan)) + self.cmd( + 'appservice plan update -g {} -n {} --sku B1'.format(resource_group, plan)) self.cmd('appservice plan show -g {} -n {}'.format(resource_group, plan), checks=[ JMESPathCheck('sku.name', 'B1'), JMESPathCheck('sku.tier', 'Basic'), @@ -512,7 +574,8 @@ def test_webapp_scale(self, resource_group): JMESPathCheck('sku.family', 'B') ]) # scale out - self.cmd('appservice plan update -g {} -n {} --number-of-workers 2'.format(resource_group, plan)) + self.cmd( + 'appservice plan update -g {} -n {} --number-of-workers 2'.format(resource_group, plan)) self.cmd('appservice plan show -g {} -n {}'.format(resource_group, plan), checks=[ JMESPathCheck('sku.name', 'B1'), JMESPathCheck('sku.tier', 'Basic'), @@ -529,11 +592,15 @@ def test_appservice_error_polish(self, resource_group, resource_group2): plan = self.create_random_name(prefix='web-error-plan', length=24) webapp_name = self.create_random_name(prefix='web-error', length=24) self.cmd('group create -n {} -l westus'.format(resource_group2)) - self.cmd('appservice plan create -g {} -n {} --sku b1'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) - self.cmd('appservice plan create -g {} -n {} --sku b1'.format(resource_group2, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --sku b1'.format(resource_group, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --sku b1'.format(resource_group2, plan)) # we will try to produce an error by try creating 2 webapp with same name in different groups - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group2, webapp_name, plan), expect_failure=True) + self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group2, + webapp_name, plan), expect_failure=True) # TODO: ensure test fx can capture error details for us to verify # allowed_exceptions='Website with given name {} already exists'.format(webapp_name) @@ -546,7 +613,8 @@ def test_linux_webapp(self, resource_group): plan = self.create_random_name(prefix='webapp-linux-plan', length=24) webapp = self.create_random_name(prefix='webapp-linux', length=24) self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan), checks=[ - JMESPathCheck('reserved', True), # this weird field means it is a linux + # this weird field means it is a linux + JMESPathCheck('reserved', True), JMESPathCheck('sku.name', 'S1'), ]) self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format(resource_group, webapp, plan, runtime), checks=[ @@ -555,7 +623,8 @@ def test_linux_webapp(self, resource_group): self.cmd('webapp config show -g {} -n {}'.format(resource_group, webapp), checks=[ JMESPathCheck('windowsFxVersion', None) ]) - time.sleep(30) # workaround the fact that a new linux web's "kind" won't be settled instantatest_linux_webapp_remote_sshneously + # workaround the fact that a new linux web's "kind" won't be settled instantatest_linux_webapp_remote_sshneously + time.sleep(30) self.cmd('webapp list -g {}'.format(resource_group), checks=[ JMESPathCheck('length([])', 1), JMESPathCheck('[0].name', webapp), @@ -569,24 +638,36 @@ def test_linux_webapp(self, resource_group): JMESPathCheck('appCommandLine', 'process.json') ]) - result = self.cmd('webapp deployment container config -g {} -n {} --enable-cd true'.format(resource_group, webapp)).get_output_in_json() + result = self.cmd('webapp deployment container config -g {} -n {} --enable-cd true'.format( + resource_group, webapp)).get_output_in_json() self.assertTrue(result['CI_CD_URL'].startswith('https://')) - self.assertTrue(result['CI_CD_URL'].endswith('.scm.azurewebsites.net/docker/hook')) + self.assertTrue(result['CI_CD_URL'].endswith( + '.scm.azurewebsites.net/docker/hook')) result = self.cmd('webapp config container set -g {} -n {} --docker-custom-image-name {} --docker-registry-server-password {} --docker-registry-server-user {} --docker-registry-server-url {} --enable-app-service-storage {}'.format( resource_group, webapp, 'foo-image', 'foo-password', 'foo-user', 'foo-url', 'false')).get_output_in_json() - self.assertEqual(set(x['value'] for x in result if x['name'] == 'DOCKER_REGISTRY_SERVER_PASSWORD'), set([None])) # we mask the password - - result = self.cmd('webapp config container show -g {} -n {} '.format(resource_group, webapp)).get_output_in_json() - self.assertEqual(set(x['name'] for x in result), set(['DOCKER_REGISTRY_SERVER_URL', 'DOCKER_REGISTRY_SERVER_USERNAME', 'DOCKER_CUSTOM_IMAGE_NAME', 'DOCKER_REGISTRY_SERVER_PASSWORD', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE'])) - self.assertEqual(set(x['value'] for x in result if x['name'] == 'DOCKER_REGISTRY_SERVER_PASSWORD'), set([None])) # we mask the password - sample = next((x for x in result if x['name'] == 'DOCKER_REGISTRY_SERVER_URL')) - self.assertEqual(sample, {'name': 'DOCKER_REGISTRY_SERVER_URL', 'slotSetting': False, 'value': 'foo-url'}) - sample = next((x for x in result if x['name'] == 'WEBSITES_ENABLE_APP_SERVICE_STORAGE')) - self.assertEqual(sample, {'name': 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'slotSetting': False, 'value': 'false'}) - self.cmd('webapp config container delete -g {} -n {}'.format(resource_group, webapp)) - result2 = self.cmd('webapp config container show -g {} -n {} '.format(resource_group, webapp)).get_output_in_json() + self.assertEqual(set(x['value'] for x in result if x['name'] == + 'DOCKER_REGISTRY_SERVER_PASSWORD'), set([None])) # we mask the password + + result = self.cmd('webapp config container show -g {} -n {} '.format( + resource_group, webapp)).get_output_in_json() + self.assertEqual(set(x['name'] for x in result), set(['DOCKER_REGISTRY_SERVER_URL', 'DOCKER_REGISTRY_SERVER_USERNAME', + 'DOCKER_CUSTOM_IMAGE_NAME', 'DOCKER_REGISTRY_SERVER_PASSWORD', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE'])) + self.assertEqual(set(x['value'] for x in result if x['name'] == + 'DOCKER_REGISTRY_SERVER_PASSWORD'), set([None])) # we mask the password + sample = next( + (x for x in result if x['name'] == 'DOCKER_REGISTRY_SERVER_URL')) + self.assertEqual(sample, { + 'name': 'DOCKER_REGISTRY_SERVER_URL', 'slotSetting': False, 'value': 'foo-url'}) + sample = next( + (x for x in result if x['name'] == 'WEBSITES_ENABLE_APP_SERVICE_STORAGE')) + self.assertEqual(sample, { + 'name': 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'slotSetting': False, 'value': 'false'}) + self.cmd( + 'webapp config container delete -g {} -n {}'.format(resource_group, webapp)) + result2 = self.cmd('webapp config container show -g {} -n {} '.format( + resource_group, webapp)).get_output_in_json() self.assertEqual(result2, []) @@ -604,8 +685,10 @@ def test_linux_webapp_ssh(self, resource_group): runtime = 'node|8.11' plan = self.create_random_name(prefix='webapp-ssh-plan', length=24) webapp = self.create_random_name(prefix='webapp-ssh', length=24) - self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format(resource_group, webapp, plan, runtime)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) + self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format( + resource_group, webapp, plan, runtime)) time.sleep(30) requests.get('http://{}.azurewebsites.net'.format(webapp), timeout=240) time.sleep(30) @@ -622,9 +705,11 @@ def test_linux_ASE_ssh(self): ase = 'cli-ase-ssh-test' webapp = 'cli-ase-ssh-test' time.sleep(30) - requests.get('http://{}.{}.p.azurewebsites.net/'.format(webapp, ase), timeout=240) + requests.get( + 'http://{}.{}.p.azurewebsites.net/'.format(webapp, ase), timeout=240) time.sleep(30) - self.cmd('webapp ssh -g {} -n {} --subscription {} --timeout 5'.format(resource_group, webapp, sub)) + self.cmd( + 'webapp ssh -g {} -n {} --subscription {} --timeout 5'.format(resource_group, webapp, sub)) time.sleep(30) @@ -632,14 +717,18 @@ class LinuxWebappRemoteSSHScenarioTest(ScenarioTest): @ResourceGroupPreparer(location='japanwest') def test_linux_webapp_remote_ssh(self, resource_group): runtime = 'node|8.11' - plan = self.create_random_name(prefix='webapp-remote-ssh-plan', length=40) + plan = self.create_random_name( + prefix='webapp-remote-ssh-plan', length=40) webapp = self.create_random_name(prefix='webapp-remote-ssh', length=40) - self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format(resource_group, webapp, plan, runtime)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) + self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format( + resource_group, webapp, plan, runtime)) time.sleep(30) requests.get('http://{}.azurewebsites.net'.format(webapp), timeout=240) time.sleep(30) - self.cmd('webapp create-remote-connection -g {} -n {} --timeout 5'.format(resource_group, webapp)) + self.cmd( + 'webapp create-remote-connection -g {} -n {} --timeout 5'.format(resource_group, webapp)) time.sleep(30) @@ -647,51 +736,65 @@ class LinuxWebappRemoteDebugScenarioTest(ScenarioTest): @ResourceGroupPreparer(location='japanwest') def test_linux_webapp_remote_debug(self, resource_group): runtime = 'node|8.11' - plan = self.create_random_name(prefix='webapp-remote-debug-plan', length=40) - webapp = self.create_random_name(prefix='webapp-remote-debug', length=40) - self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format(resource_group, webapp, plan, runtime)) + plan = self.create_random_name( + prefix='webapp-remote-debug-plan', length=40) + webapp = self.create_random_name( + prefix='webapp-remote-debug', length=40) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) + self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format( + resource_group, webapp, plan, runtime)) time.sleep(30) - self.cmd('webapp config set --remote-debugging-enabled true -g {} -n {}'.format(resource_group, webapp)) + self.cmd( + 'webapp config set --remote-debugging-enabled true -g {} -n {}'.format(resource_group, webapp)) requests.get('http://{}.azurewebsites.net'.format(webapp), timeout=240) time.sleep(30) - self.cmd('webapp create-remote-connection -g {} -n {} --timeout 5'.format(resource_group, webapp)) + self.cmd( + 'webapp create-remote-connection -g {} -n {} --timeout 5'.format(resource_group, webapp)) time.sleep(30) class LinuxWebappMulticontainerSlotScenarioTest(ScenarioTest): @ResourceGroupPreparer(location='westus2') def test_linux_webapp_multicontainer_slot(self, resource_group): - webapp_name = self.create_random_name(prefix='webapp-linux-multi', length=24) + webapp_name = self.create_random_name( + prefix='webapp-linux-multi', length=24) plan = self.create_random_name(prefix='plan-linux-multi', length=24) config_file = os.path.join(TEST_DIR, 'sample-compose.yml') slot = "stage" slot_webapp_name = "{}-{}".format(webapp_name, slot) slot_config_file = os.path.join(TEST_DIR, 'sample-compose-slot.yml') - self.cmd('appservice plan create -g {} -n {} --is-linux --sku S1'.format(resource_group, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --is-linux --sku S1'.format(resource_group, plan)) self.cmd("webapp create -g {} -n {} --plan {} --multicontainer-config-file \"{}\" " "--multicontainer-config-type COMPOSE".format(resource_group, webapp_name, plan, config_file)) last_number_seen = 99999999 for x in range(0, 10): - r = requests.get('http://{}.azurewebsites.net'.format(webapp_name), timeout=240) + r = requests.get( + 'http://{}.azurewebsites.net'.format(webapp_name), timeout=240) # verify the web page self.assertTrue('Hello World! I have been seen' in str(r.content)) - current_number = [int(s) for s in r.content.split() if s.isdigit()][0] + current_number = [int(s) + for s in r.content.split() if s.isdigit()][0] self.assertNotEqual(current_number, last_number_seen) last_number_seen = current_number - self.cmd('webapp deployment slot create -g {} -n {} --slot {}'.format(resource_group, webapp_name, slot)) + self.cmd('webapp deployment slot create -g {} -n {} --slot {}'.format( + resource_group, webapp_name, slot)) self.cmd("webapp config container set -g {} -n {} --slot {} --multicontainer-config-file \"{}\" " "--multicontainer-config-type COMPOSE".format(resource_group, webapp_name, slot, slot_config_file)) last_number_seen = 99999999 for x in range(0, 10): - r = requests.get('http://{}.azurewebsites.net'.format(slot_webapp_name), timeout=240) + r = requests.get( + 'http://{}.azurewebsites.net'.format(slot_webapp_name), timeout=240) # verify the web page - self.assertTrue('Hello from a slot! I have been seen' in str(r.content)) - current_number = [int(s) for s in r.content.split() if s.isdigit()][0] + self.assertTrue( + 'Hello from a slot! I have been seen' in str(r.content)) + current_number = [int(s) + for s in r.content.split() if s.isdigit()][0] self.assertNotEqual(current_number, last_number_seen) last_number_seen = current_number @@ -703,13 +806,18 @@ def test_acr_integration(self, resource_group): webapp = self.create_random_name(prefix='webappacrtest', length=24) runtime = 'node|6.6' acr_registry_name = webapp - self.cmd('acr create --admin-enabled -g {} -n {} --sku Basic'.format(resource_group, acr_registry_name)) - self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format(resource_group, webapp, plan, runtime)) - creds = self.cmd('acr credential show -n {} -g {}'.format(acr_registry_name, resource_group)).get_output_in_json() + self.cmd('acr create --admin-enabled -g {} -n {} --sku Basic'.format( + resource_group, acr_registry_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) + self.cmd('webapp create -g {} -n {} --plan {} --runtime {}'.format( + resource_group, webapp, plan, runtime)) + creds = self.cmd('acr credential show -n {} -g {}'.format( + acr_registry_name, resource_group)).get_output_in_json() self.cmd('webapp config container set -g {0} -n {1} --docker-custom-image-name {2}.azurecr.io/image-name:latest --docker-registry-server-url https://{2}.azurecr.io'.format( resource_group, webapp, acr_registry_name), checks=[ - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", creds['username']) + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", creds['username']) ]) @@ -719,27 +827,39 @@ class FunctionappACRScenarioTest(ScenarioTest): @AllowLargeResponse() def test_acr_integration_function_app(self, resource_group, storage_account): plan = self.create_random_name(prefix='acrtestplanfunction', length=24) - functionapp = self.create_random_name(prefix='functionappacrtest', length=24) + functionapp = self.create_random_name( + prefix='functionappacrtest', length=24) runtime = 'node' acr_registry_name = functionapp - self.cmd('acr create --admin-enabled -g {} -n {} --sku Basic'.format(resource_group, acr_registry_name)) - self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) - self.cmd('functionapp create -g {} -n {} -s {} --plan {} --runtime {}'.format(resource_group, functionapp, storage_account, plan, runtime)) - creds = self.cmd('acr credential show -n {} -g {}'.format(acr_registry_name, resource_group)).get_output_in_json() + self.cmd('acr create --admin-enabled -g {} -n {} --sku Basic'.format( + resource_group, acr_registry_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) + self.cmd('functionapp create -g {} -n {} -s {} --plan {} --runtime {}'.format( + resource_group, functionapp, storage_account, plan, runtime)) + creds = self.cmd('acr credential show -n {} -g {}'.format( + acr_registry_name, resource_group)).get_output_in_json() self.cmd('functionapp config container set -g {0} -n {1} --docker-custom-image-name {2}.azurecr.io/image-name:latest --docker-registry-server-url https://{2}.azurecr.io'.format( resource_group, functionapp, acr_registry_name), checks=[ - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", creds['username']) + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", creds['username']) ]) self.cmd('functionapp config container show -g {} -n {} '.format(resource_group, functionapp), checks=[ - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", creds['username']), - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_URL']|[0].name", 'DOCKER_REGISTRY_SERVER_URL') + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", creds['username']), + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_URL']|[0].name", 'DOCKER_REGISTRY_SERVER_URL') ]) self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp), checks=[ - JMESPathCheck("[?name=='FUNCTIONS_WORKER_RUNTIME'].value|[0]", 'node'), - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_USERNAME'].value|[0]", creds['username']) - ]) - self.cmd('functionapp config container delete -g {} -n {} '.format(resource_group, functionapp)) - json_result = self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp)).get_output_in_json() + JMESPathCheck( + "[?name=='FUNCTIONS_WORKER_RUNTIME'].value|[0]", 'node'), + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_USERNAME'].value|[0]", creds['username']) + ]) + self.cmd( + 'functionapp config container delete -g {} -n {} '.format(resource_group, functionapp)) + json_result = self.cmd('functionapp config appsettings list -g {} -n {}'.format( + resource_group, functionapp)).get_output_in_json() all_settings = [setting['name'] for setting in json_result] # Make sure the related settings are deleted self.assertNotIn('DOCKER_REGISTRY_SERVER_USERNAME', all_settings) @@ -756,32 +876,41 @@ class FunctionAppCreateUsingACR(ScenarioTest): @AllowLargeResponse() def test_acr_create_function_app(self, resource_group, storage_account): plan = self.create_random_name(prefix='acrtestplanfunction', length=24) - functionapp = self.create_random_name(prefix='functionappacrtest', length=24) + functionapp = self.create_random_name( + prefix='functionappacrtest', length=24) runtime = 'node' acr_registry_name = functionapp - self.cmd('acr create --admin-enabled -g {} -n {} --sku Basic'.format(resource_group, acr_registry_name)) - acr_creds = self.cmd('acr credential show -n {} -g {}'.format(acr_registry_name, resource_group)).get_output_in_json() + self.cmd('acr create --admin-enabled -g {} -n {} --sku Basic'.format( + resource_group, acr_registry_name)) + acr_creds = self.cmd('acr credential show -n {} -g {}'.format( + acr_registry_name, resource_group)).get_output_in_json() username = acr_creds['username'] password = acr_creds['passwords'][0]['value'] - self.cmd('functionapp plan create -g {} -n {} --sku S1 --is-linux'.format(resource_group, plan)) + self.cmd( + 'functionapp plan create -g {} -n {} --sku S1 --is-linux'.format(resource_group, plan)) self.cmd('functionapp create -g {} -n {} -s {} --plan {} --runtime {}' ' --deployment-container-image-name {}.azurecr.io/image-name:latest --docker-registry-server-user {}' ' --docker-registry-server-password {}'.format(resource_group, functionapp, storage_account, plan, runtime, acr_registry_name, username, password)) self.cmd('functionapp config container show -g {} -n {} '.format(resource_group, functionapp), checks=[ - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", username), - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_URL']|[0].name", 'DOCKER_REGISTRY_SERVER_URL') + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", username), + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_URL']|[0].name", 'DOCKER_REGISTRY_SERVER_URL') ]) self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp), checks=[ - JMESPathCheck("[?name=='FUNCTIONS_WORKER_RUNTIME'].value|[0]", 'node'), - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_USERNAME'].value|[0]", username) + JMESPathCheck( + "[?name=='FUNCTIONS_WORKER_RUNTIME'].value|[0]", 'node'), + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_USERNAME'].value|[0]", username) ]) self.cmd('functionapp config show -g {} -n {}'.format(resource_group, functionapp), checks=[ JMESPathCheck('linuxFxVersion', 'DOCKER|{}.azurecr.io/image-name:latest'.format(acr_registry_name))]) - self.cmd('functionapp config container delete -g {} -n {} '.format(resource_group, functionapp)) + self.cmd( + 'functionapp config container delete -g {} -n {} '.format(resource_group, functionapp)) json_result = self.cmd( 'functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp)).get_output_in_json() all_settings = [setting['name'] for setting in json_result] @@ -797,26 +926,34 @@ class FunctionappACRDeploymentScenarioTest(ScenarioTest): @StorageAccountPreparer() def test_acr_deployment_function_app(self, resource_group, storage_account): plan = self.create_random_name(prefix='acrtestplanfunction', length=24) - functionapp = self.create_random_name(prefix='functionappacrtest', length=24) + functionapp = self.create_random_name( + prefix='functionappacrtest', length=24) runtime = 'node' acr_registry_name = functionapp - self.cmd('acr create --admin-enabled -g {} -n {} --sku Basic'.format(resource_group, acr_registry_name)) - self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) - self.cmd('functionapp create -g {} -n {} -s {} --plan {} --runtime {}'.format(resource_group, functionapp, storage_account, plan, runtime)) - creds = self.cmd('acr credential show -g {} -n {}'.format(resource_group, acr_registry_name)).get_output_in_json() + self.cmd('acr create --admin-enabled -g {} -n {} --sku Basic'.format( + resource_group, acr_registry_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan)) + self.cmd('functionapp create -g {} -n {} -s {} --plan {} --runtime {}'.format( + resource_group, functionapp, storage_account, plan, runtime)) + creds = self.cmd('acr credential show -g {} -n {}'.format( + resource_group, acr_registry_name)).get_output_in_json() self.cmd('functionapp config container set -g {0} -n {1} --docker-custom-image-name {2}.azurecr.io/image-name:latest --docker-registry-server-url https://{2}.azurecr.io'.format( resource_group, functionapp, acr_registry_name), checks=[ - JMESPathCheck("[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", creds['username']) + JMESPathCheck( + "[?name=='DOCKER_REGISTRY_SERVER_USERNAME']|[0].value", creds['username']) ]) result = self.cmd('functionapp deployment container config -g {} -n {} --enable-cd true'.format(resource_group, functionapp)).get_output_in_json() self.assertTrue(result['CI_CD_URL'].startswith('https://')) - self.assertTrue(result['CI_CD_URL'].endswith('.scm.azurewebsites.net/docker/hook')) + self.assertTrue(result['CI_CD_URL'].endswith( + '.scm.azurewebsites.net/docker/hook')) # verify that show-cd-url works the same way show_result = self.cmd('functionapp deployment container show-cd-url -g {} -n {}'.format(resource_group, functionapp)).get_output_in_json() self.assertTrue(show_result['CI_CD_URL'].startswith('https://')) - self.assertTrue(show_result['CI_CD_URL'].endswith('.scm.azurewebsites.net/docker/hook')) + self.assertTrue(show_result['CI_CD_URL'].endswith( + '.scm.azurewebsites.net/docker/hook')) self.cmd('functionapp delete -g {} -n {}'.format(resource_group, functionapp)) @@ -825,7 +962,8 @@ class FunctionAppReservedInstanceTest(ScenarioTest): @ResourceGroupPreparer() @StorageAccountPreparer() def test_functionapp_reserved_instance(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwithreservedinstance', 40) + functionapp_name = self.create_random_name( + 'functionappwithreservedinstance', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type Windows' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ JMESPathCheck('state', 'Running'), @@ -835,7 +973,8 @@ def test_functionapp_reserved_instance(self, resource_group, storage_account): self.cmd('functionapp config set -g {} -n {} --prewarmed-instance-count 4' .format(resource_group, functionapp_name)).assert_with_checks([ JMESPathCheck('preWarmedInstanceCount', 4)]) - self.cmd('functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) + self.cmd( + 'functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) class WebappGitScenarioTest(ScenarioTest): @@ -845,8 +984,10 @@ def test_webapp_git(self, resource_group): webapp = self.create_random_name(prefix='web-git-test2', length=24) # You can create and use any repros with the 3 files under "./sample_web" test_git_repo = 'https://github.com/yugangw-msft/azure-site-test' - self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp, plan)) self.cmd('webapp deployment source config -g {} -n {} --repo-url {} --branch {} --manual-integration'.format(resource_group, webapp, test_git_repo, 'master'), checks=[ JMESPathCheck('repoUrl', test_git_repo), JMESPathCheck('isMercurial', False), @@ -857,7 +998,8 @@ def test_webapp_git(self, resource_group): JMESPathCheck('isMercurial', False), JMESPathCheck('branch', 'master') ]) - self.cmd('webapp deployment source delete -g {} -n {}'.format(resource_group, webapp)) + self.cmd( + 'webapp deployment source delete -g {} -n {}'.format(resource_group, webapp)) self.cmd('webapp deployment source show -g {} -n {}'.format(resource_group, webapp), checks=JMESPathCheck('repoUrl', None)) @@ -868,8 +1010,10 @@ def test_webapp_slot(self, resource_group): plan = self.create_random_name(prefix='slot-test-plan', length=24) webapp = self.create_random_name(prefix='slot-test-web', length=24) - plan_result = self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)).get_output_in_json() - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp, plan_result['name'])) + plan_result = self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)).get_output_in_json() + self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, + webapp, plan_result['name'])) # You can create and use any repros with the 3 files under "./sample_web" and with a 'staging 'branch slot = 'staging' slot2 = 'dev' @@ -886,12 +1030,17 @@ def test_webapp_slot(self, resource_group): JMESPathCheck('branch', slot) ]) # swap with prod and verify the git branch also switched - self.cmd('webapp deployment slot swap -g {} -n {} -s {}'.format(resource_group, webapp, slot)) - result = self.cmd('webapp config appsettings list -g {} -n {} -s {}'.format(resource_group, webapp, slot)).get_output_in_json() - self.assertEqual(set([x['name'] for x in result]), set(['s1', 'WEBSITE_NODE_DEFAULT_VERSION'])) + self.cmd( + 'webapp deployment slot swap -g {} -n {} -s {}'.format(resource_group, webapp, slot)) + result = self.cmd('webapp config appsettings list -g {} -n {} -s {}'.format( + resource_group, webapp, slot)).get_output_in_json() + self.assertEqual(set([x['name'] for x in result]), set( + ['s1', 'WEBSITE_NODE_DEFAULT_VERSION'])) # create a new slot by cloning from prod slot - self.cmd('webapp config set -g {} -n {} --php-version {}'.format(resource_group, webapp, test_php_version)) - self.cmd('webapp deployment slot create -g {} -n {} --slot {} --configuration-source {}'.format(resource_group, webapp, slot2, webapp)) + self.cmd('webapp config set -g {} -n {} --php-version {}'.format( + resource_group, webapp, test_php_version)) + self.cmd('webapp deployment slot create -g {} -n {} --slot {} --configuration-source {}'.format( + resource_group, webapp, slot2, webapp)) self.cmd('webapp config show -g {} -n {} --slot {}'.format(resource_group, webapp, slot2), checks=[ JMESPathCheck("phpVersion", test_php_version), ]) @@ -902,21 +1051,28 @@ def test_webapp_slot(self, resource_group): self.cmd('webapp config connection-string set -g {} -n {} -t mysql --slot {} --settings c1=connection1 --slot-settings c2=connection2'.format(resource_group, webapp, slot2)) # verify we can swap with non production slot - self.cmd('webapp deployment slot swap -g {} -n {} --slot {} --target-slot {}'.format(resource_group, webapp, slot, slot2)) - result = self.cmd('webapp config appsettings list -g {} -n {} --slot {}'.format(resource_group, webapp, slot2)).get_output_in_json() - self.assertEqual(set([x['name'] for x in result]), set(['s1', 's4', 'WEBSITE_NODE_DEFAULT_VERSION'])) - result = self.cmd('webapp config connection-string list -g {} -n {} --slot {}'.format(resource_group, webapp, slot2)).get_output_in_json() + self.cmd('webapp deployment slot swap -g {} -n {} --slot {} --target-slot {}'.format( + resource_group, webapp, slot, slot2)) + result = self.cmd('webapp config appsettings list -g {} -n {} --slot {}'.format( + resource_group, webapp, slot2)).get_output_in_json() + self.assertEqual(set([x['name'] for x in result]), set( + ['s1', 's4', 'WEBSITE_NODE_DEFAULT_VERSION'])) + result = self.cmd('webapp config connection-string list -g {} -n {} --slot {}'.format( + resource_group, webapp, slot2)).get_output_in_json() self.assertEqual(set([x['name'] for x in result]), set(['c2'])) - result = self.cmd('webapp config appsettings list -g {} -n {} --slot {}'.format(resource_group, webapp, slot)).get_output_in_json() + result = self.cmd('webapp config appsettings list -g {} -n {} --slot {}'.format( + resource_group, webapp, slot)).get_output_in_json() self.assertTrue(set(['s3']).issubset(set([x['name'] for x in result]))) - result = self.cmd('webapp config connection-string list -g {} -n {} --slot {}'.format(resource_group, webapp, slot)).get_output_in_json() + result = self.cmd('webapp config connection-string list -g {} -n {} --slot {}'.format( + resource_group, webapp, slot)).get_output_in_json() self.assertEqual(set([x['name'] for x in result]), set(['c1'])) self.cmd('webapp deployment slot list -g {} -n {}'.format(resource_group, webapp), checks=[ JMESPathCheck("length([])", 2), JMESPathCheck("length([?name=='{}'])".format(slot2), 1), JMESPathCheck("length([?name=='{}'])".format(slot), 1), ]) - self.cmd('webapp deployment slot delete -g {} -n {} --slot {}'.format(resource_group, webapp, slot)) + self.cmd( + 'webapp deployment slot delete -g {} -n {} --slot {}'.format(resource_group, webapp, slot)) # try another way to delete a slot and exercise all options self.cmd('webapp delete -g {} -n {} --slot {} --keep-dns-registration --keep-empty-plan --keep-metrics'.format(resource_group, webapp, slot2)) @@ -926,21 +1082,27 @@ class WebappSlotTrafficRouting(ScenarioTest): def test_traffic_routing(self, resource_group): plan = self.create_random_name(prefix='slot-traffic-plan', length=24) webapp = self.create_random_name(prefix='slot-traffic-web', length=24) - plan_result = self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)).get_output_in_json() - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp, plan_result['name'])) + plan_result = self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)).get_output_in_json() + self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, + webapp, plan_result['name'])) # You can create and use any repros with the 3 files under "./sample_web" and with a 'staging 'branch slot = 'staging' # create an empty slot - self.cmd('webapp deployment slot create -g {} -n {} --slot {}'.format(resource_group, webapp, slot)) + self.cmd( + 'webapp deployment slot create -g {} -n {} --slot {}'.format(resource_group, webapp, slot)) self.cmd('webapp traffic-routing set -g {} -n {} -d {}=15'.format(resource_group, webapp, slot), checks=[ - JMESPathCheck("[0].actionHostName", webapp + '-' + slot + '.azurewebsites.net'), + JMESPathCheck("[0].actionHostName", webapp + + '-' + slot + '.azurewebsites.net'), JMESPathCheck("[0].reroutePercentage", 15.0) ]) self.cmd('webapp traffic-routing show -g {} -n {}'.format(resource_group, webapp), checks=[ - JMESPathCheck("[0].actionHostName", webapp + '-' + slot + '.azurewebsites.net'), + JMESPathCheck("[0].actionHostName", webapp + + '-' + slot + '.azurewebsites.net'), JMESPathCheck("[0].reroutePercentage", 15.0) ]) - self.cmd('webapp traffic-routing clear -g {} -n {}'.format(resource_group, webapp)) + self.cmd( + 'webapp traffic-routing clear -g {} -n {}'.format(resource_group, webapp)) class AppServiceCors(ScenarioTest): @@ -953,18 +1115,25 @@ def test_webapp_cors(self, resource_group): }) self.cmd('appservice plan create -g {rg} -n {plan} --sku S1') self.cmd('webapp create -g {rg} -n {web} --plan {plan}') - self.cmd('webapp cors add -g {rg} -n {web} --allowed-origins https://msdn.com https://msn.com') + self.cmd( + 'webapp cors add -g {rg} -n {web} --allowed-origins https://msdn.com https://msn.com') self.cmd('webapp cors show -g {rg} -n {web}', checks=self.check('allowedOrigins', ['https://msdn.com', 'https://msn.com'])) - self.cmd('webapp cors remove -g {rg} -n {web} --allowed-origins https://msn.com') - self.cmd('webapp cors show -g {rg} -n {web}', checks=self.check('allowedOrigins', ['https://msdn.com'])) + self.cmd( + 'webapp cors remove -g {rg} -n {web} --allowed-origins https://msn.com') + self.cmd('webapp cors show -g {rg} -n {web}', + checks=self.check('allowedOrigins', ['https://msdn.com'])) - self.cmd('webapp deployment slot create -g {rg} -n {web} --slot {slot}') - self.cmd('webapp cors add -g {rg} -n {web} --slot {slot} --allowed-origins https://foo.com') + self.cmd( + 'webapp deployment slot create -g {rg} -n {web} --slot {slot}') + self.cmd( + 'webapp cors add -g {rg} -n {web} --slot {slot} --allowed-origins https://foo.com') self.cmd('webapp cors show -g {rg} -n {web} --slot {slot}', checks=self.check('allowedOrigins', ['https://foo.com'])) - self.cmd('webapp cors remove -g {rg} -n {web} --slot {slot} --allowed-origins https://foo.com') - self.cmd('webapp cors show -g {rg} -n {web} --slot {slot}', checks=self.check('allowedOrigins', [])) + self.cmd( + 'webapp cors remove -g {rg} -n {web} --slot {slot} --allowed-origins https://foo.com') + self.cmd('webapp cors show -g {rg} -n {web} --slot {slot}', + checks=self.check('allowedOrigins', [])) @ResourceGroupPreparer() @StorageAccountPreparer() @@ -975,12 +1144,17 @@ def test_functionapp_cors(self, resource_group, storage_account): 'storage': storage_account }) self.cmd('appservice plan create -g {rg} -n {plan} --sku S1') - self.cmd('storage account create --name {storage} -g {rg} --sku Standard_LRS') - self.cmd('functionapp create -g {rg} -n {function} --plan {plan} -s {storage}') - self.cmd('functionapp cors add -g {rg} -n {function} --allowed-origins https://msdn.com https://msn.com') - result = self.cmd('functionapp cors show -g {rg} -n {function}').get_output_in_json()['allowedOrigins'] + self.cmd( + 'storage account create --name {storage} -g {rg} --sku Standard_LRS') + self.cmd( + 'functionapp create -g {rg} -n {function} --plan {plan} -s {storage}') + self.cmd( + 'functionapp cors add -g {rg} -n {function} --allowed-origins https://msdn.com https://msn.com') + result = self.cmd( + 'functionapp cors show -g {rg} -n {function}').get_output_in_json()['allowedOrigins'] # functionapp has pre-defined cors. We verify the ones we added are in the list - self.assertTrue(set(['https://msdn.com', 'https://msn.com']).issubset(set(result))) + self.assertTrue( + set(['https://msdn.com', 'https://msn.com']).issubset(set(result))) class WebappSlotSwapScenarioTest(ScenarioTest): @@ -988,26 +1162,34 @@ class WebappSlotSwapScenarioTest(ScenarioTest): def test_webapp_slot_swap(self, resource_group): plan = self.create_random_name(prefix='slot-swap-plan', length=24) webapp = self.create_random_name(prefix='slot-swap-web', length=24) - plan_result = self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)).get_output_in_json() - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp, plan_result['name'])) + plan_result = self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)).get_output_in_json() + self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, + webapp, plan_result['name'])) # You can create and use any repros with the 3 files under "./sample_web" and with a 'staging 'branch slot = 'staging' - self.cmd('webapp config appsettings set -g {} -n {} --slot-settings s1=prod'.format(resource_group, webapp)) + self.cmd( + 'webapp config appsettings set -g {} -n {} --slot-settings s1=prod'.format(resource_group, webapp)) # create an empty slot - self.cmd('webapp deployment slot create -g {} -n {} --slot {}'.format(resource_group, webapp, slot)) - self.cmd('webapp config appsettings set -g {} -n {} --slot-settings s1=slot --slot {}'.format(resource_group, webapp, slot)) + self.cmd( + 'webapp deployment slot create -g {} -n {} --slot {}'.format(resource_group, webapp, slot)) + self.cmd('webapp config appsettings set -g {} -n {} --slot-settings s1=slot --slot {}'.format( + resource_group, webapp, slot)) # swap with preview - self.cmd('webapp deployment slot swap -g {} -n {} -s {} --action preview'.format(resource_group, webapp, slot)) + self.cmd('webapp deployment slot swap -g {} -n {} -s {} --action preview'.format( + resource_group, webapp, slot)) self.cmd('webapp config appsettings list -g {} -n {} --slot {}'.format(resource_group, webapp, slot), checks=[ JMESPathCheck("[?name=='s1']|[0].value", 'prod') ]) # complete the swap - self.cmd('webapp deployment slot swap -g {} -n {} -s {}'.format(resource_group, webapp, slot)) + self.cmd( + 'webapp deployment slot swap -g {} -n {} -s {}'.format(resource_group, webapp, slot)) self.cmd('webapp config appsettings list -g {} -n {} --slot {}'.format(resource_group, webapp, slot), checks=[ JMESPathCheck("[?name=='s1']|[0].value", 'slot') ]) # reset - self.cmd('webapp deployment slot swap -g {} -n {} -s {} --action reset'.format(resource_group, webapp, slot)) + self.cmd('webapp deployment slot swap -g {} -n {} -s {} --action reset'.format( + resource_group, webapp, slot)) self.cmd('webapp config appsettings list -g {} -n {} --slot {}'.format(resource_group, webapp, slot), checks=[ JMESPathCheck("[?name=='s1']|[0].value", 'slot') ]) @@ -1025,41 +1207,61 @@ def test_webapp_ssl(self, resource_group, resource_group_location): cert_password = 'test' cert_thumbprint = '9E9735C45C792B03B3FFCCA614852B32EE71AD6B' # we configure tags here in a hope to capture a repro for https://github.com/Azure/azure-cli/issues/6929 - self.cmd('appservice plan create -g {} -n {} --sku S1 --tags plan=plan1'.format(resource_group, plan)) - self.cmd('appservice plan show -g {} -n {}'.format(resource_group, plan), self.check('tags.plan', 'plan1')) - self.cmd('webapp create -g {} -n {} --plan {} --tags web=web1'.format(resource_group, webapp_name, plan, resource_group_location)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1 --tags plan=plan1'.format(resource_group, plan)) + self.cmd('appservice plan show -g {} -n {}'.format(resource_group, + plan), self.check('tags.plan', 'plan1')) + self.cmd('webapp create -g {} -n {} --plan {} --tags web=web1'.format( + resource_group, webapp_name, plan, resource_group_location)) self.cmd('webapp config ssl upload -g {} -n {} --certificate-file "{}" --certificate-password {}'.format(resource_group, webapp_name, pfx_file, cert_password), checks=[ JMESPathCheck('thumbprint', cert_thumbprint) ]) - self.cmd('webapp show -g {} -n {}'.format(resource_group, webapp_name), self.check('tags.web', 'web1')) + self.cmd('webapp show -g {} -n {}'.format(resource_group, + webapp_name), self.check('tags.web', 'web1')) self.cmd('webapp config ssl bind -g {} -n {} --certificate-thumbprint {} --ssl-type {}'.format(resource_group, webapp_name, cert_thumbprint, 'SNI'), checks=[ - JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].sslState".format(webapp_name), 'SniEnabled'), - JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].thumbprint".format(webapp_name), cert_thumbprint) + JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].sslState".format( + webapp_name), 'SniEnabled'), + JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].thumbprint".format( + webapp_name), cert_thumbprint) ]) - self.cmd('webapp show -g {} -n {}'.format(resource_group, webapp_name), self.check('tags.web', 'web1')) + self.cmd('webapp show -g {} -n {}'.format(resource_group, + webapp_name), self.check('tags.web', 'web1')) self.cmd('webapp config ssl unbind -g {} -n {} --certificate-thumbprint {}'.format(resource_group, webapp_name, cert_thumbprint), checks=[ - JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].sslState".format(webapp_name), 'Disabled'), - ]) - self.cmd('webapp show -g {} -n {}'.format(resource_group, webapp_name), self.check('tags.web', 'web1')) - self.cmd('webapp config ssl delete -g {} --certificate-thumbprint {}'.format(resource_group, cert_thumbprint)) - self.cmd('webapp show -g {} -n {}'.format(resource_group, webapp_name), self.check('tags.web', 'web1')) + JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].sslState".format( + webapp_name), 'Disabled'), + ]) + self.cmd('webapp show -g {} -n {}'.format(resource_group, + webapp_name), self.check('tags.web', 'web1')) + self.cmd('webapp config ssl delete -g {} --certificate-thumbprint {}'.format( + resource_group, cert_thumbprint)) + self.cmd('webapp show -g {} -n {}'.format(resource_group, + webapp_name), self.check('tags.web', 'web1')) # test with slot - self.cmd('webapp deployment slot create -g {} -n {} --slot {}'.format(resource_group, webapp_name, slot_name)) + self.cmd('webapp deployment slot create -g {} -n {} --slot {}'.format( + resource_group, webapp_name, slot_name)) self.cmd('webapp config ssl upload -g {} -n {} --certificate-file "{}" --certificate-password {} -s {}'.format(resource_group, webapp_name, pfx_file, cert_password, slot_name), checks=[ JMESPathCheck('thumbprint', cert_thumbprint) ]) - self.cmd('webapp show -g {} -n {} -s {}'.format(resource_group, webapp_name, slot_name)) + self.cmd( + 'webapp show -g {} -n {} -s {}'.format(resource_group, webapp_name, slot_name)) self.cmd('webapp config ssl bind -g {} -n {} --certificate-thumbprint {} --ssl-type {} -s {}'.format(resource_group, webapp_name, cert_thumbprint, 'SNI', slot_name), checks=[ - JMESPathCheck("hostNameSslStates|[?name=='{}-{}.azurewebsites.net']|[0].sslState".format(webapp_name, slot_name), 'SniEnabled'), - JMESPathCheck("hostNameSslStates|[?name=='{}-{}.azurewebsites.net']|[0].thumbprint".format(webapp_name, slot_name), cert_thumbprint) + JMESPathCheck("hostNameSslStates|[?name=='{}-{}.azurewebsites.net']|[0].sslState".format( + webapp_name, slot_name), 'SniEnabled'), + JMESPathCheck("hostNameSslStates|[?name=='{}-{}.azurewebsites.net']|[0].thumbprint".format( + webapp_name, slot_name), cert_thumbprint) ]) - self.cmd('webapp show -g {} -n {} -s {}'.format(resource_group, webapp_name, slot_name)) + self.cmd( + 'webapp show -g {} -n {} -s {}'.format(resource_group, webapp_name, slot_name)) self.cmd('webapp config ssl unbind -g {} -n {} --certificate-thumbprint {} -s {}'.format(resource_group, webapp_name, cert_thumbprint, slot_name), checks=[ - JMESPathCheck("hostNameSslStates|[?name=='{}-{}.azurewebsites.net']|[0].sslState".format(webapp_name, slot_name), 'Disabled'), - ]) - self.cmd('webapp show -g {} -n {} -s {}'.format(resource_group, webapp_name, slot_name)) - self.cmd('webapp config ssl delete -g {} --certificate-thumbprint {}'.format(resource_group, cert_thumbprint)) - self.cmd('webapp show -g {} -n {} -s {}'.format(resource_group, webapp_name, slot_name)) + JMESPathCheck("hostNameSslStates|[?name=='{}-{}.azurewebsites.net']|[0].sslState".format( + webapp_name, slot_name), 'Disabled'), + ]) + self.cmd( + 'webapp show -g {} -n {} -s {}'.format(resource_group, webapp_name, slot_name)) + self.cmd('webapp config ssl delete -g {} --certificate-thumbprint {}'.format( + resource_group, cert_thumbprint)) + self.cmd( + 'webapp show -g {} -n {} -s {}'.format(resource_group, webapp_name, slot_name)) self.cmd('webapp delete -g {} -n {}'.format(resource_group, webapp_name)) @@ -1076,11 +1278,15 @@ def test_webapp_ssl_import(self, resource_group): cert_thumbprint = '9E9735C45C792B03B3FFCCA614852B32EE71AD6B' cert_name = 'test-cert' # we configure tags here in a hope to capture a repro for https://github.com/Azure/azure-cli/issues/6929 - self.cmd('appservice plan create -g {} -n {} --sku B1'.format(resource_group, plan_name)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku B1'.format(resource_group, plan_name)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) self.cmd('keyvault create -g {} -n {}'.format(resource_group, kv_name)) - self.cmd('keyvault set-policy -g {} --name {} --spn {} --secret-permissions get'.format(resource_group, kv_name, 'Microsoft.Azure.WebSites')) - self.cmd('keyvault certificate import --name {} --vault-name {} --file "{}" --password {}'.format(cert_name, kv_name, pfx_file, cert_password)) + self.cmd('keyvault set-policy -g {} --name {} --spn {} --secret-permissions get'.format( + resource_group, kv_name, 'Microsoft.Azure.WebSites')) + self.cmd('keyvault certificate import --name {} --vault-name {} --file "{}" --password {}'.format( + cert_name, kv_name, pfx_file, cert_password)) self.cmd('webapp config ssl import --resource-group {} --name {} --key-vault {} --key-vault-certificate-name {}'.format(resource_group, webapp_name, kv_name, cert_name), checks=[ JMESPathCheck('keyVaultSecretStatus', 'Initialized'), @@ -1088,8 +1294,10 @@ def test_webapp_ssl_import(self, resource_group): ]) self.cmd('webapp config ssl bind -g {} -n {} --certificate-thumbprint {} --ssl-type {}'.format(resource_group, webapp_name, cert_thumbprint, 'SNI'), checks=[ - JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].sslState".format(webapp_name), 'SniEnabled'), - JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].thumbprint".format(webapp_name), cert_thumbprint) + JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].sslState".format( + webapp_name), 'SniEnabled'), + JMESPathCheck("hostNameSslStates|[?name=='{}.azurewebsites.net']|[0].thumbprint".format( + webapp_name), cert_thumbprint) ]) @@ -1098,9 +1306,12 @@ class WebappUndeleteTest(ScenarioTest): @ResourceGroupPreparer() def test_webapp_deleted_list(self, resource_group): plan = self.create_random_name(prefix='delete-me-plan', length=24) - webapp_name = self.create_random_name(prefix='delete-me-web', length=24) - self.cmd('appservice plan create -g {} -n {} --sku B1 --tags plan=plan1'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) + webapp_name = self.create_random_name( + prefix='delete-me-web', length=24) + self.cmd( + 'appservice plan create -g {} -n {} --sku B1 --tags plan=plan1'.format(resource_group, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) self.cmd('webapp delete -g {} -n {}'.format(resource_group, webapp_name)) self.cmd('webapp deleted list -g {}'.format(resource_group), checks=[ JMESPathCheck('[0].deletedSiteName', webapp_name) @@ -1111,29 +1322,38 @@ class FunctionAppWithPlanE2ETest(ScenarioTest): @ResourceGroupPreparer() @ResourceGroupPreparer(parameter_name='resource_group2') def test_functionapp_e2e(self, resource_group, resource_group2): - functionapp_name, functionapp_name2 = self.create_random_name('func-e2e', 24), self.create_random_name('func-e2e', 24) + functionapp_name, functionapp_name2 = self.create_random_name( + 'func-e2e', 24), self.create_random_name('func-e2e', 24) plan = self.create_random_name('func-e2e-plan', 24) storage, storage2 = 'functionappplanstorage', 'functionappplanstorage2' - plan_id = self.cmd('appservice plan create -g {} -n {}'.format(resource_group, plan)).get_output_in_json()['id'] + plan_id = self.cmd('appservice plan create -g {} -n {}'.format( + resource_group, plan)).get_output_in_json()['id'] self.cmd('appservice plan list -g {}'.format(resource_group)) - self.cmd('storage account create --name {} -g {} -l westus --sku Standard_LRS'.format(storage, resource_group)) - storage_account_id2 = self.cmd('storage account create --name {} -g {} -l westus --sku Standard_LRS'.format(storage2, resource_group2)).get_output_in_json()['id'] + self.cmd( + 'storage account create --name {} -g {} -l westus --sku Standard_LRS'.format(storage, resource_group)) + storage_account_id2 = self.cmd('storage account create --name {} -g {} -l westus --sku Standard_LRS'.format( + storage2, resource_group2)).get_output_in_json()['id'] self.cmd('functionapp create -g {} -n {} -p {} -s {}'.format(resource_group, functionapp_name, plan, storage), checks=[ JMESPathCheck('state', 'Running'), JMESPathCheck('name', functionapp_name), - JMESPathCheck('hostNames[0]', functionapp_name + '.azurewebsites.net') + JMESPathCheck('hostNames[0]', + functionapp_name + '.azurewebsites.net') ]) - self.cmd('functionapp create -g {} -n {} -p {} -s {}'.format(resource_group2, functionapp_name2, plan_id, storage_account_id2)) - self.cmd('functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) + self.cmd('functionapp create -g {} -n {} -p {} -s {}'.format(resource_group2, + functionapp_name2, plan_id, storage_account_id2)) + self.cmd( + 'functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_on_linux_app_service_java(self, resource_group, storage_account): plan = self.create_random_name(prefix='funcapplinplan', length=24) - functionapp = self.create_random_name(prefix='functionapp-linux', length=24) + functionapp = self.create_random_name( + prefix='functionapp-linux', length=24) self.cmd('functionapp plan create -g {} -n {} --sku S1 --is-linux'.format(resource_group, plan), checks=[ - JMESPathCheck('reserved', True), # this weird field means it is a linux + # this weird field means it is a linux + JMESPathCheck('reserved', True), JMESPathCheck('sku.name', 'S1'), ]) self.cmd('functionapp create -g {} -n {} --plan {} -s {} --runtime java' @@ -1194,7 +1414,8 @@ class FunctionAppWithConsumptionPlanE2ETest(ScenarioTest): @ResourceGroupPreparer(name_prefix='azurecli-functionapp-c-e2e', location='westus') @StorageAccountPreparer() def test_functionapp_consumption_e2e(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappconsumption', 40) + functionapp_name = self.create_random_name( + 'functionappconsumption', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {}' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1214,12 +1435,14 @@ def test_functionapp_consumption_e2e(self, resource_group, storage_account): checks=[self.check('clientAffinityEnabled', True)] ) - self.cmd('functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) + self.cmd( + 'functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) @ResourceGroupPreparer(name_prefix='azurecli-functionapp-c-e2e-ragrs', location='westus') @StorageAccountPreparer(sku='Standard_RAGRS') def test_functionapp_consumption_ragrs_storage_e2e(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappconsumption', 40) + functionapp_name = self.create_random_name( + 'functionappconsumption', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {}' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1237,7 +1460,8 @@ class FunctionAppWithLinuxConsumptionPlanTest(ScenarioTest): @ResourceGroupPreparer(name_prefix='azurecli-functionapp-linux', location='westus') @StorageAccountPreparer() def test_functionapp_consumption_linux(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionapplinuxconsumption', 40) + functionapp_name = self.create_random_name( + 'functionapplinuxconsumption', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type Linux --runtime node' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1253,7 +1477,8 @@ def test_functionapp_consumption_linux(self, resource_group, storage_account): @ResourceGroupPreparer(name_prefix='azurecli-functionapp-linux', location='westus') @StorageAccountPreparer() def test_functionapp_consumption_linux_java(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionapplinuxconsumption', 40) + functionapp_name = self.create_random_name( + 'functionapplinuxconsumption', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type Linux --runtime java' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1271,7 +1496,8 @@ class FunctionAppOnWindowsWithRuntime(ScenarioTest): @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_windows_runtime(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwindowsruntime', 40) + functionapp_name = self.create_random_name( + 'functionappwindowsruntime', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type Windows --runtime node' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1286,7 +1512,8 @@ def test_functionapp_windows_runtime(self, resource_group, storage_account): @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_windows_runtime_version(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwindowsruntime', 40) + functionapp_name = self.create_random_name( + 'functionappwindowsruntime', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type Windows --runtime node --runtime-version 8' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1296,15 +1523,18 @@ def test_functionapp_windows_runtime_version(self, resource_group, storage_accou JMESPathCheck('hostNames[0]', functionapp_name + '.azurewebsites.net')]) self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp_name), checks=[ - JMESPathCheck("[?name=='FUNCTIONS_WORKER_RUNTIME'].value|[0]", 'node'), + JMESPathCheck( + "[?name=='FUNCTIONS_WORKER_RUNTIME'].value|[0]", 'node'), JMESPathCheck("[?name=='WEBSITE_NODE_DEFAULT_VERSION'].value|[0]", '~8')]) - self.cmd('functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) + self.cmd( + 'functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_windows_runtime_version_invalid(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwindowsruntime', 40) + functionapp_name = self.create_random_name( + 'functionappwindowsruntime', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} ' '--os-type Windows --runtime node --runtime-version 8.2' @@ -1313,7 +1543,8 @@ def test_functionapp_windows_runtime_version_invalid(self, resource_group, stora @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_windows_runtime_functions_version(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwindowsruntime', 40) + functionapp_name = self.create_random_name( + 'functionappwindowsruntime', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} --functions-version 3 --os-type Windows --runtime node' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ JMESPathCheck('state', 'Running'), @@ -1322,7 +1553,8 @@ def test_functionapp_windows_runtime_functions_version(self, resource_group, sto JMESPathCheck('hostNames[0]', functionapp_name + '.azurewebsites.net')]) self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp_name), checks=[ - JMESPathCheck("[?name=='FUNCTIONS_EXTENSION_VERSION'].value|[0]", '~3'), + JMESPathCheck( + "[?name=='FUNCTIONS_EXTENSION_VERSION'].value|[0]", '~3'), JMESPathCheck("[?name=='WEBSITE_NODE_DEFAULT_VERSION'].value|[0]", '~12')]) @@ -1330,7 +1562,8 @@ class FunctionAppOnWindowsWithoutRuntime(ScenarioTest): @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_windows_without_runtime(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwindowswithoutruntime', 40) + functionapp_name = self.create_random_name( + 'functionappwindowswithoutruntime', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type Windows' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1339,14 +1572,16 @@ def test_functionapp_windows_without_runtime(self, resource_group, storage_accou JMESPathCheck('kind', 'functionapp'), JMESPathCheck('hostNames[0]', functionapp_name + '.azurewebsites.net')]) - self.cmd('functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) + self.cmd( + 'functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) class FunctionAppWithAppInsightsKey(ScenarioTest): @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_with_app_insights_key(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwithappinsights', 40) + functionapp_name = self.create_random_name( + 'functionappwithappinsights', 40) app_insights_key = '00000000-0000-0000-0000-123456789123' self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type Windows' @@ -1358,17 +1593,20 @@ def test_functionapp_with_app_insights_key(self, resource_group, storage_account JMESPathCheck('hostNames[0]', functionapp_name + '.azurewebsites.net')]) self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp_name)).assert_with_checks([ - JMESPathCheck("[?name=='APPINSIGHTS_INSTRUMENTATIONKEY'].value|[0]", app_insights_key) + JMESPathCheck( + "[?name=='APPINSIGHTS_INSTRUMENTATIONKEY'].value|[0]", app_insights_key) ]) - self.cmd('functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) + self.cmd( + 'functionapp delete -g {} -n {}'.format(resource_group, functionapp_name)) class FunctionAppWithAppInsightsDefault(ScenarioTest): @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_with_default_app_insights(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwithappinsights', 40) + functionapp_name = self.create_random_name( + 'functionappwithappinsights', 40) self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type Windows' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1377,13 +1615,16 @@ def test_functionapp_with_default_app_insights(self, resource_group, storage_acc JMESPathCheck('kind', 'functionapp'), JMESPathCheck('hostNames[0]', functionapp_name + '.azurewebsites.net')]) - app_set = self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp_name)).get_output_in_json() - self.assertTrue('APPINSIGHTS_INSTRUMENTATIONKEY' in [kp['name'] for kp in app_set]) + app_set = self.cmd('functionapp config appsettings list -g {} -n {}'.format( + resource_group, functionapp_name)).get_output_in_json() + self.assertTrue('APPINSIGHTS_INSTRUMENTATIONKEY' in [ + kp['name'] for kp in app_set]) @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_with_no_default_app_insights(self, resource_group, storage_account): - functionapp_name = self.create_random_name('functionappwithappinsights', 40) + functionapp_name = self.create_random_name( + 'functionappwithappinsights', 40) self.cmd('functionapp create -g {} -n {} -c centralus -s {} --os-type Windows --disable-app-insights' .format(resource_group, functionapp_name, storage_account)).assert_with_checks([ @@ -1394,7 +1635,8 @@ def test_functionapp_with_no_default_app_insights(self, resource_group, storage_ app_set = self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp_name)).get_output_in_json() - self.assertTrue('APPINSIGHTS_INSTRUMENTATIONKEY' not in [kp['name'] for kp in app_set]) + self.assertTrue('APPINSIGHTS_INSTRUMENTATIONKEY' not in [ + kp['name'] for kp in app_set]) class FunctionAppOnLinux(ScenarioTest): @@ -1402,9 +1644,11 @@ class FunctionAppOnLinux(ScenarioTest): @StorageAccountPreparer() def test_functionapp_on_linux(self, resource_group, storage_account): plan = self.create_random_name(prefix='funcapplinplan', length=24) - functionapp = self.create_random_name(prefix='functionapp-linux', length=24) + functionapp = self.create_random_name( + prefix='functionapp-linux', length=24) self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan), checks=[ - JMESPathCheck('reserved', True), # this weird field means it is a linux + # this weird field means it is a linux + JMESPathCheck('reserved', True), JMESPathCheck('sku.name', 'S1'), ]) self.cmd('functionapp create -g {} -n {} --plan {} -s {} --runtime node'.format(resource_group, functionapp, plan, storage_account), checks=[ @@ -1425,9 +1669,11 @@ def test_functionapp_on_linux(self, resource_group, storage_account): @StorageAccountPreparer() def test_functionapp_on_linux_version(self, resource_group, storage_account): plan = self.create_random_name(prefix='funcapplinplan', length=24) - functionapp = self.create_random_name(prefix='functionapp-linux', length=24) + functionapp = self.create_random_name( + prefix='functionapp-linux', length=24) self.cmd('functionapp plan create -g {} -n {} --sku S1 --is-linux'.format(resource_group, plan), checks=[ - JMESPathCheck('reserved', True), # this weird field means it is a linux + # this weird field means it is a linux + JMESPathCheck('reserved', True), JMESPathCheck('sku.name', 'S1'), ]) self.cmd('functionapp create -g {} -n {} --plan {} -s {} --runtime node --runtime-version 10' @@ -1447,7 +1693,8 @@ def test_functionapp_on_linux_version(self, resource_group, storage_account): @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_on_linux_version_consumption(self, resource_group, storage_account): - functionapp = self.create_random_name(prefix='functionapp-linux', length=24) + functionapp = self.create_random_name( + prefix='functionapp-linux', length=24) self.cmd('functionapp create -g {} -n {} -c westus -s {} --os-type linux --runtime python --runtime-version 3.7' .format(resource_group, functionapp, storage_account), checks=[ JMESPathCheck('name', functionapp) @@ -1460,7 +1707,8 @@ def test_functionapp_on_linux_version_consumption(self, resource_group, storage_ @StorageAccountPreparer() def test_functionapp_on_linux_version_error(self, resource_group, storage_account): plan = self.create_random_name(prefix='funcapplinplan', length=24) - functionapp = self.create_random_name(prefix='functionapp-linux', length=24) + functionapp = self.create_random_name( + prefix='functionapp-linux', length=24) self.cmd('functionapp plan create -g {} -n {} --sku S1 --is-linux'.format(resource_group, plan), checks=[ JMESPathCheck('reserved', True), JMESPathCheck('sku.name', 'S1'), @@ -1473,9 +1721,11 @@ def test_functionapp_on_linux_version_error(self, resource_group, storage_accoun @StorageAccountPreparer() def test_functionapp_on_linux_functions_version(self, resource_group, storage_account): plan = self.create_random_name(prefix='funcapplinplan', length=24) - functionapp = self.create_random_name(prefix='functionapp-linux', length=24) + functionapp = self.create_random_name( + prefix='functionapp-linux', length=24) self.cmd('appservice plan create -g {} -n {} --sku S1 --is-linux' .format(resource_group, plan), checks=[ - JMESPathCheck('reserved', True), # this weird field means it is a linux + # this weird field means it is a linux + JMESPathCheck('reserved', True), JMESPathCheck('sku.name', 'S1') ]) self.cmd('functionapp create -g {} -n {} --plan {} -s {} --functions-version 3 --runtime node' @@ -1484,17 +1734,21 @@ def test_functionapp_on_linux_functions_version(self, resource_group, storage_ac ]) self.cmd('functionapp config show -g {} -n {}'.format(resource_group, functionapp), checks=[ - JMESPathCheck('linuxFxVersion', 'DOCKER|mcr.microsoft.com/azure-functions/node:3.0-node12-appservice') + JMESPathCheck( + 'linuxFxVersion', 'DOCKER|mcr.microsoft.com/azure-functions/node:3.0-node12-appservice') ]) self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp)).assert_with_checks([ - JMESPathCheck("[?name=='FUNCTIONS_EXTENSION_VERSION'].value|[0]", '~3'), - JMESPathCheck("[?name=='WEBSITE_NODE_DEFAULT_VERSION'].value|[0]", '~12') + JMESPathCheck( + "[?name=='FUNCTIONS_EXTENSION_VERSION'].value|[0]", '~3'), + JMESPathCheck( + "[?name=='WEBSITE_NODE_DEFAULT_VERSION'].value|[0]", '~12') ]) @ResourceGroupPreparer(location='westus') @StorageAccountPreparer() def test_functionapp_on_linux_functions_version_consumption(self, resource_group, storage_account): - functionapp = self.create_random_name(prefix='functionapp-linux', length=24) + functionapp = self.create_random_name( + prefix='functionapp-linux', length=24) self.cmd('functionapp create -g {} -n {} -c westus -s {} --functions-version 3 --runtime node --os-type linux' .format(resource_group, functionapp, storage_account), checks=[ JMESPathCheck('name', functionapp) @@ -1504,8 +1758,10 @@ def test_functionapp_on_linux_functions_version_consumption(self, resource_group JMESPathCheck('linuxFxVersion', 'NODE|12') ]) self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp)).assert_with_checks([ - JMESPathCheck("[?name=='FUNCTIONS_EXTENSION_VERSION'].value|[0]", '~3'), - JMESPathCheck("[?name=='WEBSITE_NODE_DEFAULT_VERSION'].value|[0]", '~12') + JMESPathCheck( + "[?name=='FUNCTIONS_EXTENSION_VERSION'].value|[0]", '~3'), + JMESPathCheck( + "[?name=='WEBSITE_NODE_DEFAULT_VERSION'].value|[0]", '~12') ]) @@ -1553,7 +1809,8 @@ class FunctionAppSlotTests(ScenarioTest): @StorageAccountPreparer() def test_functionapp_slot_creation(self, resource_group, storage_account): plan = self.create_random_name(prefix='funcappplan', length=24) - functionapp = self.create_random_name(prefix='functionapp-slot', length=24) + functionapp = self.create_random_name( + prefix='functionapp-slot', length=24) slotname = self.create_random_name(prefix='slotname', length=24) self.cmd('functionapp plan create -g {} -n {} --sku S1'.format(resource_group, plan), checks=[ JMESPathCheck('sku.name', 'S1'), @@ -1569,12 +1826,15 @@ def test_functionapp_slot_creation(self, resource_group, storage_account): ]) pre_slot_list = self.cmd('functionapp deployment slot list -g {} -n {}'.format(resource_group, functionapp), checks=[ - JMESPathCheck("[?name=='{}'].type|[0]".format(slotname), 'Microsoft.Web/sites/slots') + JMESPathCheck("[?name=='{}'].type|[0]".format( + slotname), 'Microsoft.Web/sites/slots') ]).get_output_in_json() self.assertEqual(len(pre_slot_list), 1) - self.cmd('functionapp deployment slot delete -g {} -n {} --slot {}'.format(resource_group, functionapp, slotname)) + self.cmd('functionapp deployment slot delete -g {} -n {} --slot {}'.format( + resource_group, functionapp, slotname)) - deleted_slot_list = self.cmd('functionapp deployment slot list -g {} -n {}'.format(resource_group, functionapp)).get_output_in_json() + deleted_slot_list = self.cmd('functionapp deployment slot list -g {} -n {}'.format( + resource_group, functionapp)).get_output_in_json() self.assertEqual(len(deleted_slot_list), 0) self.cmd('functionapp delete -g {} -n {}'.format(resource_group, functionapp)) @@ -1582,7 +1842,8 @@ def test_functionapp_slot_creation(self, resource_group, storage_account): @StorageAccountPreparer() def test_functionapp_slot_appsetting_update(self, resource_group, storage_account): plan = self.create_random_name(prefix='funcappplan', length=24) - functionapp = self.create_random_name(prefix='functionapp-slot', length=24) + functionapp = self.create_random_name( + prefix='functionapp-slot', length=24) slotname = self.create_random_name(prefix='slotname', length=24) self.cmd('functionapp plan create -g {} -n {} --sku S1'.format(resource_group, plan), checks=[ JMESPathCheck('sku.name', 'S1'), @@ -1609,7 +1870,8 @@ def test_functionapp_slot_appsetting_update(self, resource_group, storage_accoun @StorageAccountPreparer() def test_functionapp_slot_swap(self, resource_group, storage_account): plan = self.create_random_name(prefix='funcappplan', length=24) - functionapp = self.create_random_name(prefix='functionapp-slot', length=24) + functionapp = self.create_random_name( + prefix='functionapp-slot', length=24) slotname = self.create_random_name(prefix='slotname', length=24) self.cmd('functionapp plan create -g {} -n {} --sku S1'.format(resource_group, plan), checks=[ JMESPathCheck('sku.name', 'S1'), @@ -1627,7 +1889,8 @@ def test_functionapp_slot_swap(self, resource_group, storage_account): slotname), checks=[ JMESPathCheck("[?name=='FOO'].value|[0]", 'BAR') ]) - self.cmd('functionapp deployment slot swap -g {} -n {} --slot {} --action swap'.format(resource_group, functionapp, slotname)) + self.cmd('functionapp deployment slot swap -g {} -n {} --slot {} --action swap'.format( + resource_group, functionapp, slotname)) self.cmd('functionapp config appsettings list -g {} -n {}'.format(resource_group, functionapp), checks=[ JMESPathCheck("[?name=='FOO'].value|[0]", 'BAR') ]) @@ -1639,8 +1902,10 @@ class WebappAuthenticationTest(ScenarioTest): def test_webapp_authentication(self, resource_group): webapp_name = self.create_random_name('webapp-authentication-test', 40) plan_name = self.create_random_name('webapp-authentication-plan', 40) - self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan_name)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan_name)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) # testing show command for newly created app and initial fields self.cmd('webapp auth show -g {} -n {}'.format(resource_group, webapp_name)).assert_with_checks([ JMESPathCheck('unauthenticatedClientAction', None), @@ -1666,7 +1931,8 @@ def test_webapp_authentication(self, resource_group): '--facebook-app-id facebook_id --facebook-app-secret facebook_secret ' '--facebook-oauth-scopes public_profile email' .format(resource_group, webapp_name)).assert_with_checks([ - JMESPathCheck('unauthenticatedClientAction', 'RedirectToLoginPage'), + JMESPathCheck( + 'unauthenticatedClientAction', 'RedirectToLoginPage'), JMESPathCheck('defaultProvider', 'Facebook'), JMESPathCheck('enabled', True), JMESPathCheck('tokenStoreEnabled', False), @@ -1701,7 +1967,8 @@ def test_webapp_update(self, resource_group): JMESPathCheck('clientAffinityEnabled', False)]) # try out on slots - self.cmd('webapp deployment slot create -g {} -n {} -s s1'.format(resource_group, webapp_name)) + self.cmd( + 'webapp deployment slot create -g {} -n {} -s s1'.format(resource_group, webapp_name)) self.cmd('webapp update -g {} -n {} -s s1 --client-affinity-enabled true'.format(resource_group, webapp_name), checks=[ self.check('clientAffinityEnabled', True) ]) @@ -1713,8 +1980,10 @@ def test_deploy_zip(self, resource_group): webapp_name = self.create_random_name('webapp-zipDeploy-test', 40) plan_name = self.create_random_name('webapp-zipDeploy-plan', 40) zip_file = os.path.join(TEST_DIR, 'test.zip') - self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan_name)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan_name)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) self.cmd('webapp deployment source config-zip -g {} -n {} --src "{}"'.format(resource_group, webapp_name, zip_file)).assert_with_checks([ JMESPathCheck('status', 4), JMESPathCheck('deployer', 'Push-Deployer'), @@ -1745,14 +2014,18 @@ class WebappImplictIdentityTest(ScenarioTest): @AllowLargeResponse(8192) @ResourceGroupPreparer() def test_webapp_assign_system_identity(self, resource_group): - scope = '/subscriptions/{}/resourcegroups/{}'.format(self.get_subscription_id(), resource_group) + scope = '/subscriptions/{}/resourcegroups/{}'.format( + self.get_subscription_id(), resource_group) role = 'Reader' plan_name = self.create_random_name('web-msi-plan', 20) webapp_name = self.create_random_name('web-msi', 20) - self.cmd('appservice plan create -g {} -n {}'.format(resource_group, plan_name)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) + self.cmd( + 'appservice plan create -g {} -n {}'.format(resource_group, plan_name)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan_name)) with mock.patch('azure.cli.core.commands.arm._gen_guid', side_effect=self.create_guid): - result = self.cmd('webapp identity assign -g {} -n {} --role {} --scope {}'.format(resource_group, webapp_name, role, scope)).get_output_in_json() + result = self.cmd('webapp identity assign -g {} -n {} --role {} --scope {}'.format( + resource_group, webapp_name, role, scope)).get_output_in_json() self.cmd('webapp identity show -g {} -n {}'.format(resource_group, webapp_name), checks=[ self.check('principalId', result['principalId']) ]) @@ -1761,16 +2034,21 @@ def test_webapp_assign_system_identity(self, resource_group): JMESPathCheck('length([])', 1), JMESPathCheck('[0].roleDefinitionName', role) ]) - self.cmd('webapp identity show -g {} -n {}'.format(resource_group, webapp_name), checks=self.check('principalId', result['principalId'])) - self.cmd('webapp identity remove -g {} -n {}'.format(resource_group, webapp_name)) - self.cmd('webapp identity show -g {} -n {}'.format(resource_group, webapp_name), checks=self.is_empty()) + self.cmd('webapp identity show -g {} -n {}'.format(resource_group, + webapp_name), checks=self.check('principalId', result['principalId'])) + self.cmd( + 'webapp identity remove -g {} -n {}'.format(resource_group, webapp_name)) + self.cmd('webapp identity show -g {} -n {}'.format(resource_group, + webapp_name), checks=self.is_empty()) class WebappListLocationsFreeSKUTest(ScenarioTest): @ResourceGroupPreparer(name_prefix='cli_test_webapp_list-locations-free-sku-test') def test_webapp_list_locations_free_sku(self, resource_group): - asp_F1 = self.cmd('appservice list-locations --sku F1').get_output_in_json() - result = self.cmd('appservice list-locations --sku Free').get_output_in_json() + asp_F1 = self.cmd( + 'appservice list-locations --sku F1').get_output_in_json() + result = self.cmd( + 'appservice list-locations --sku Free').get_output_in_json() self.assertEqual(asp_F1, result) @@ -1789,7 +2067,8 @@ def test_webapp_triggeredWebjob_list(self, resource_group): self.cmd('webapp webjob triggered list -g {} -n {}' .format(resource_group_name, webapp_name)).assert_with_checks([ JMESPathCheck('length(@)', 1), - JMESPathCheck('[0].name', '{}/{}'.format(webapp_name, webjob_name)), + JMESPathCheck( + '[0].name', '{}/{}'.format(webapp_name, webjob_name)), JMESPathCheck('[0].type', 'Microsoft.Web/sites/triggeredwebjobs')]) @@ -1808,7 +2087,8 @@ def test_webapp_continuousWebjob_e2e(self, resource_group): self.cmd('webapp webjob continuous list -g {} -n {}' .format(resource_group_name, webapp_name)).assert_with_checks([ JMESPathCheck('length(@)', 1), - JMESPathCheck('[0].name', '{}/{}'.format(webapp_name, webjob_name)), + JMESPathCheck( + '[0].name', '{}/{}'.format(webapp_name, webjob_name)), JMESPathCheck('[0].type', 'Microsoft.Web/sites/continuouswebjobs')]) # start self.cmd('webapp webjob continuous start -g {} -n {} -w {}' @@ -1824,10 +2104,12 @@ class WebappWindowsContainerBasicE2ETest(ScenarioTest): @AllowLargeResponse() @ResourceGroupPreparer() def test_webapp_hyperv_e2e(self, resource_group): - webapp_name = self.create_random_name(prefix='webapp-hyperv-e2e', length=24) + webapp_name = self.create_random_name( + prefix='webapp-hyperv-e2e', length=24) plan = self.create_random_name(prefix='webapp-hyperv-plan', length=24) - self.cmd('appservice plan create -g {} -n {} --hyper-v --sku PC2'.format(resource_group, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --hyper-v --sku PC2'.format(resource_group, plan)) self.cmd('appservice plan list -g {}'.format(resource_group), checks=[ JMESPathCheck('length(@)', 1), JMESPathCheck('[0].name', plan), @@ -1835,7 +2117,8 @@ def test_webapp_hyperv_e2e(self, resource_group): JMESPathCheck('[0].sku.name', 'PC2') ]) self.cmd('appservice plan list -g {}'.format(resource_group), checks=[ - JMESPathCheck("length([?name=='{}' && resourceGroup=='{}'])".format(plan, resource_group), 1) + JMESPathCheck("length([?name=='{}' && resourceGroup=='{}'])".format( + plan, resource_group), 1) ]) self.cmd('appservice plan show -g {} -n {}'.format(resource_group, plan), checks=[ JMESPathCheck('name', plan) @@ -1848,13 +2131,16 @@ def test_webapp_hyperv_e2e(self, resource_group): self.cmd('webapp list -g {}'.format(resource_group), checks=[ JMESPathCheck('length(@)', 1), JMESPathCheck('[0].name', webapp_name), - JMESPathCheck('[0].hostNames[0]', webapp_name + '.azurewebsites.net') + JMESPathCheck('[0].hostNames[0]', webapp_name + + '.azurewebsites.net') ]) self.cmd('webapp config show -g {} -n {}'.format(resource_group, webapp_name), checks=[ - JMESPathCheck('windowsFxVersion', "DOCKER|microsoft/iis:nanoserver-sac2016"), + JMESPathCheck('windowsFxVersion', + "DOCKER|microsoft/iis:nanoserver-sac2016"), JMESPathCheck('linuxFxVersion', "") ]) - self.cmd('webapp config set -g {} -n {} --windows-fx-version "DOCKER|microsoft/iis"'.format(resource_group, webapp_name)) + self.cmd('webapp config set -g {} -n {} --windows-fx-version "DOCKER|microsoft/iis"'.format( + resource_group, webapp_name)) self.cmd('webapp config show -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('windowsFxVersion', "DOCKER|microsoft/iis"), JMESPathCheck('linuxFxVersion', "") @@ -1866,8 +2152,10 @@ def test_webapp_create_noAlwaysOn(self, resource_group): webapp_name = self.create_random_name('webapp-create-alwaysOn-e2e', 44) plan = self.create_random_name('plan-create-alwaysOn-e2e', 44) - self.cmd('appservice plan create -g {} -n {} --sku SHARED'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) + self.cmd( + 'appservice plan create -g {} -n {} --sku SHARED'.format(resource_group, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) # verify alwaysOn self.cmd('webapp config show -g {} -n {}'.format(resource_group, webapp_name)).assert_with_checks([ JMESPathCheck('alwaysOn', False)]) @@ -1878,7 +2166,8 @@ def test_webapp_create_linux_free(self, resource_group): plan = self.create_random_name('plan-linux-free', 24) self.cmd('appservice plan create -g {} -n {} --sku F1 --is-linux'.format(resource_group, plan), checks=[ - JMESPathCheck('reserved', True), # this weird field means it is a linux + # this weird field means it is a linux + JMESPathCheck('reserved', True), JMESPathCheck('sku.name', 'F1')]) self.cmd('webapp create -g {} -n {} --plan {} -u {} -r "node|10.14"'.format(resource_group, webapp_name, plan, TEST_REPO_URL)) @@ -1897,16 +2186,22 @@ def test_webapp_hybridconnectionE2E(self, resource_group): hyco_name = self.create_random_name('hcname', 24) um = "[{{\\\"key\\\":\\\"endpoint\\\",\\\"value\\\":\\\"vmsq1:80\\\"}}]" - self.cmd('appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) - self.cmd('relay namespace create -g {} --name {}'.format(resource_group, namespace_name)) - self.cmd('relay hyco create -g {} --namespace-name {} --name {} --user-metadata {}'.format(resource_group, namespace_name, hyco_name, um)) - self.cmd('webapp hybrid-connection add -g {} -n {} --namespace {} --hybrid-connection {}'.format(resource_group, webapp_name, namespace_name, hyco_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku S1'.format(resource_group, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) + self.cmd( + 'relay namespace create -g {} --name {}'.format(resource_group, namespace_name)) + self.cmd('relay hyco create -g {} --namespace-name {} --name {} --user-metadata {}'.format( + resource_group, namespace_name, hyco_name, um)) + self.cmd('webapp hybrid-connection add -g {} -n {} --namespace {} --hybrid-connection {}'.format( + resource_group, webapp_name, namespace_name, hyco_name)) self.cmd('webapp hybrid-connection list -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('length(@)', 1), JMESPathCheck('[0].name', hyco_name) ]) - self.cmd('webapp hybrid-connection remove -g {} -n {} --namespace {} --hybrid-connection {}'.format(resource_group, webapp_name, namespace_name, hyco_name)) + self.cmd('webapp hybrid-connection remove -g {} -n {} --namespace {} --hybrid-connection {}'.format( + resource_group, webapp_name, namespace_name, hyco_name)) self.cmd('webapp hybrid-connection list -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('length(@)', 0) ]) @@ -1918,15 +2213,20 @@ def test_webapp_vnetE2E(self, resource_group): subnet_name = self.create_random_name('swiftsubnet', 24) vnet_name = self.create_random_name('swiftname', 24) - self.cmd('network vnet create -g {} -n {} --address-prefix 10.0.0.0/16 --subnet-name {} --subnet-prefix 10.0.0.0/24'.format(resource_group, vnet_name, subnet_name)) - self.cmd('appservice plan create -g {} -n {} --sku P1V2'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) - self.cmd('webapp vnet-integration add -g {} -n {} --vnet {} --subnet {}'.format(resource_group, webapp_name, vnet_name, subnet_name)) + self.cmd('network vnet create -g {} -n {} --address-prefix 10.0.0.0/16 --subnet-name {} --subnet-prefix 10.0.0.0/24'.format( + resource_group, vnet_name, subnet_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku P1V2'.format(resource_group, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) + self.cmd('webapp vnet-integration add -g {} -n {} --vnet {} --subnet {}'.format( + resource_group, webapp_name, vnet_name, subnet_name)) self.cmd('webapp vnet-integration list -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('length(@)', 1), JMESPathCheck('[0].name', subnet_name) ]) - self.cmd('webapp vnet-integration remove -g {} -n {}'.format(resource_group, webapp_name)) + self.cmd( + 'webapp vnet-integration remove -g {} -n {}'.format(resource_group, webapp_name)) self.cmd('webapp vnet-integration list -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('length(@)', 0) ]) @@ -1938,11 +2238,16 @@ def test_webapp_vnetDelegation(self, resource_group): subnet_name = self.create_random_name('swiftsubnet', 24) vnet_name = self.create_random_name('swiftname', 24) - self.cmd('network vnet create -g {} -n {} --address-prefix 10.0.0.0/16 --subnet-name {} --subnet-prefix 10.0.0.0/24'.format(resource_group, vnet_name, subnet_name)) - self.cmd('network vnet subnet update -g {} --vnet {} --name {} --delegations Microsoft.Web/serverfarms --service-endpoints Microsoft.Storage'.format(resource_group, vnet_name, subnet_name)) - self.cmd('appservice plan create -g {} -n {} --sku P1V2'.format(resource_group, plan)) - self.cmd('webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) - self.cmd('webapp vnet-integration add -g {} -n {} --vnet {} --subnet {}'.format(resource_group, webapp_name, vnet_name, subnet_name)) + self.cmd('network vnet create -g {} -n {} --address-prefix 10.0.0.0/16 --subnet-name {} --subnet-prefix 10.0.0.0/24'.format( + resource_group, vnet_name, subnet_name)) + self.cmd('network vnet subnet update -g {} --vnet {} --name {} --delegations Microsoft.Web/serverfarms --service-endpoints Microsoft.Storage'.format( + resource_group, vnet_name, subnet_name)) + self.cmd( + 'appservice plan create -g {} -n {} --sku P1V2'.format(resource_group, plan)) + self.cmd( + 'webapp create -g {} -n {} --plan {}'.format(resource_group, webapp_name, plan)) + self.cmd('webapp vnet-integration add -g {} -n {} --vnet {} --subnet {}'.format( + resource_group, webapp_name, vnet_name, subnet_name)) self.cmd('webapp vnet-integration list -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('length(@)', 1), JMESPathCheck('[0].name', subnet_name) @@ -1950,7 +2255,8 @@ def test_webapp_vnetDelegation(self, resource_group): self.cmd(' network vnet subnet show -g {} -n {} --vnet-name {}'.format(resource_group, subnet_name, vnet_name), checks=[ JMESPathCheck('serviceEndpoints[0].service', "Microsoft.Storage") ]) - self.cmd('webapp vnet-integration remove -g {} -n {}'.format(resource_group, webapp_name)) + self.cmd( + 'webapp vnet-integration remove -g {} -n {}'.format(resource_group, webapp_name)) self.cmd('webapp vnet-integration list -g {} -n {}'.format(resource_group, webapp_name), checks=[ JMESPathCheck('length(@)', 0) ]) From 6659a0cb9000ad4e5e4593ebd390f1529f4ff28f Mon Sep 17 00:00:00 2001 From: Sisira Panchagnula Date: Thu, 20 Feb 2020 12:26:15 -0800 Subject: [PATCH 3/3] Removing the formatting changes to keep the changes to just the bug fix --- .../cli/command_modules/appservice/custom.py | 704 ++++++------------ 1 file changed, 235 insertions(+), 469 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/appservice/custom.py b/src/azure-cli/azure/cli/command_modules/appservice/custom.py index b87db1a64ee..b9214a7d588 100644 --- a/src/azure-cli/azure/cli/command_modules/appservice/custom.py +++ b/src/azure-cli/azure/cli/command_modules/appservice/custom.py @@ -76,17 +76,14 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi SiteConfig, SkuDescription, Site, NameValuePair = cmd.get_models( 'SiteConfig', 'SkuDescription', 'Site', 'NameValuePair') if deployment_source_url and deployment_local_git: - raise CLIError( - 'usage error: --deployment-source-url | --deployment-local-git') + raise CLIError('usage error: --deployment-source-url | --deployment-local-git') - docker_registry_server_url = parse_docker_image_name( - deployment_container_image_name) + docker_registry_server_url = parse_docker_image_name(deployment_container_image_name) client = web_client_factory(cmd.cli_ctx) if is_valid_resource_id(plan): parse_result = parse_resource_id(plan) - plan_info = client.app_service_plans.get( - parse_result['resource_group'], parse_result['name']) + plan_info = client.app_service_plans.get(parse_result['resource_group'], parse_result['name']) else: plan_info = client.app_service_plans.get(resource_group_name, plan) if not plan_info: @@ -100,7 +97,7 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi site_config.always_on = True webapp_def = Site(location=location, site_config=site_config, server_farm_id=plan_info.id, tags=tags, https_only=using_webapp_up) - helper = _StackRuntimeHelper(cmd=cmd, client=client, linux=is_linux) + helper = _StackRuntimeHelper(cmd, client, linux=is_linux) if is_linux: if not validate_container_app_create_options(runtime, deployment_container_image_name, @@ -117,19 +114,15 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi raise CLIError("Linux Runtime '{}' is not supported." "Please invoke 'list-runtimes' to cross check".format(runtime)) elif deployment_container_image_name: - site_config.linux_fx_version = _format_fx_version( - deployment_container_image_name) + site_config.linux_fx_version = _format_fx_version(deployment_container_image_name) site_config.app_settings.append(NameValuePair(name="WEBSITES_ENABLE_APP_SERVICE_STORAGE", value="false")) elif multicontainer_config_type and multicontainer_config_file: - encoded_config_file = _get_linux_multicontainer_encoded_config_from_file( - multicontainer_config_file) - site_config.linux_fx_version = _format_fx_version( - encoded_config_file, multicontainer_config_type) + encoded_config_file = _get_linux_multicontainer_encoded_config_from_file(multicontainer_config_file) + site_config.linux_fx_version = _format_fx_version(encoded_config_file, multicontainer_config_type) elif plan_info.is_xenon: # windows container webapp - site_config.windows_fx_version = _format_fx_version( - deployment_container_image_name) + site_config.windows_fx_version = _format_fx_version(deployment_container_image_name) elif runtime: # windows webapp with runtime specified if any([startup_file, deployment_container_image_name, multicontainer_config_file, multicontainer_config_type]): @@ -138,8 +131,7 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi "only appliable on linux webapp") match = helper.resolve(runtime) if not match: - raise CLIError("Runtime '{}' is not supported. Please invoke 'list-runtimes' to cross check".format( - runtime)) # pylint: disable=line-too-long + raise CLIError("Runtime '{}' is not supported. Please invoke 'list-runtimes' to cross check".format(runtime)) # pylint: disable=line-too-long match['setter'](cmd=cmd, stack=match, site_config=site_config) # Be consistent with portal: any windows webapp should have this even it doesn't have node in the stack if not match['displayName'].startswith('node'): @@ -154,14 +146,12 @@ def create_webapp(cmd, resource_group_name, name, plan, runtime=None, startup_fi logger.info('Will set appsetting %s', setting) if using_webapp_up: # when the routine is invoked as a help method for webapp up logger.info("will set appsetting for enabling build") - site_config.app_settings.append(NameValuePair( - name="SCM_DO_BUILD_DURING_DEPLOYMENT", value=True)) + site_config.app_settings.append(NameValuePair(name="SCM_DO_BUILD_DURING_DEPLOYMENT", value=True)) if language is not None and language.lower() == 'dotnetcore': site_config.app_settings.append(NameValuePair(name='ANCM_ADDITIONAL_ERROR_PAGE_LINK', value='https://{}.scm.azurewebsites.net/detectors'.format(name))) - poller = client.web_apps.create_or_update( - resource_group_name, name, webapp_def) + poller = client.web_apps.create_or_update(resource_group_name, name, webapp_def) webapp = LongRunningOperation(cmd.cli_ctx)(poller) # Ensure SCC operations follow right after the 'create', no precedent appsetting update commands @@ -182,10 +172,8 @@ def validate_container_app_create_options(runtime=None, deployment_container_ima multicontainer_config_type=None, multicontainer_config_file=None): if bool(multicontainer_config_type) != bool(multicontainer_config_file): return False - opts = [runtime, deployment_container_image_name, - multicontainer_config_type] - # you can only specify one out the combinations - return len([x for x in opts if x]) == 1 + opts = [runtime, deployment_container_image_name, multicontainer_config_type] + return len([x for x in opts if x]) == 1 # you can only specify one out the combinations def parse_docker_image_name(deployment_container_image_name): @@ -213,8 +201,7 @@ def update_app_settings(cmd, resource_group_name, name, settings=None, slot=None for s in src: try: temp = shell_safe_json_parse(s) - # a bit messy, but we'd like accept the output of the "list" command - if isinstance(temp, list): + if isinstance(temp, list): # a bit messy, but we'd like accept the output of the "list" command for t in temp: if t.get('slotSetting', True): slot_result[t['name']] = t['value'] @@ -239,13 +226,11 @@ def update_app_settings(cmd, resource_group_name, name, settings=None, slot=None app_settings_slot_cfg_names = [] if slot_result: new_slot_setting_names = slot_result.keys() - slot_cfg_names = client.web_apps.list_slot_configuration_names( - resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) slot_cfg_names.app_setting_names = slot_cfg_names.app_setting_names or [] slot_cfg_names.app_setting_names += new_slot_setting_names app_settings_slot_cfg_names = slot_cfg_names.app_setting_names - client.web_apps.update_slot_configuration_names( - resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) return _build_app_settings_output(result.properties, app_settings_slot_cfg_names) @@ -271,14 +256,12 @@ def add_azure_storage_account(cmd, resource_group_name, name, custom_id, storage slot, client) if slot_setting: - slot_cfg_names = client.web_apps.list_slot_configuration_names( - resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) slot_cfg_names.azure_storage_config_names = slot_cfg_names.azure_storage_config_names or [] if custom_id not in slot_cfg_names.azure_storage_config_names: slot_cfg_names.azure_storage_config_names.append(custom_id) - client.web_apps.update_slot_configuration_names( - resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) return result.properties @@ -290,8 +273,7 @@ def update_azure_storage_account(cmd, resource_group_name, name, custom_id, stor azure_storage_accounts = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_azure_storage_accounts', slot) - existing_account_config = azure_storage_accounts.properties.pop( - custom_id, None) + existing_account_config = azure_storage_accounts.properties.pop(custom_id, None) if not existing_account_config: raise CLIError("No Azure storage account configuration found with the id '{}'. " @@ -314,13 +296,11 @@ def update_azure_storage_account(cmd, resource_group_name, name, custom_id, stor slot, client) if slot_setting: - slot_cfg_names = client.web_apps.list_slot_configuration_names( - resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) slot_cfg_names.azure_storage_config_names = slot_cfg_names.azure_storage_config_names or [] if custom_id not in slot_cfg_names.azure_storage_config_names: slot_cfg_names.azure_storage_config_names.append(custom_id) - client.web_apps.update_slot_configuration_names( - resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) return result.properties @@ -360,8 +340,7 @@ def enable_zip_deploy_webapp(cmd, resource_group_name, name, src, timeout=None, def enable_zip_deploy(cmd, resource_group_name, name, src, timeout=None, slot=None): logger.warning("Getting scm site credentials for zip deployment") - user_name, password = _get_site_credential( - cmd.cli_ctx, resource_group_name, name, slot) + user_name, password = _get_site_credential(cmd.cli_ctx, resource_group_name, name, slot) try: scm_url = _get_scm_url(cmd, resource_group_name, name, slot) @@ -372,8 +351,7 @@ def enable_zip_deploy(cmd, resource_group_name, name, src, timeout=None, slot=No deployment_status_url = scm_url + '/api/deployments/latest' import urllib3 - authorization = urllib3.util.make_headers( - basic_auth='{0}:{1}'.format(user_name, password)) + authorization = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(user_name, password)) headers = authorization headers['content-type'] = 'application/octet-stream' headers['User-Agent'] = UA_AGENT @@ -384,12 +362,9 @@ def enable_zip_deploy(cmd, resource_group_name, name, src, timeout=None, slot=No # Read file content with open(os.path.realpath(os.path.expanduser(src)), 'rb') as fs: zip_content = fs.read() - logger.warning( - "Starting zip deployment. This operation can take a while to complete ...") - res = requests.post(zip_url, data=zip_content, headers=headers, - verify=not should_disable_connection_verify()) - logger.warning( - "Deployment endpoint responded with status code %d", res.status_code) + logger.warning("Starting zip deployment. This operation can take a while to complete ...") + res = requests.post(zip_url, data=zip_content, headers=headers, verify=not should_disable_connection_verify()) + logger.warning("Deployment endpoint responded with status code %d", res.status_code) # check if there's an ongoing process if res.status_code == 409: @@ -464,12 +439,10 @@ def upload_zip_to_storage(cmd, resource_group_name, name, src, slot=None): storage_connection = str(keyval['value']) if storage_connection is None: - raise CLIError( - 'Could not find a \'AzureWebJobsStorage\' application setting') + raise CLIError('Could not find a \'AzureWebJobsStorage\' application setting') container_name = "function-releases" - blob_name = "{}-{}.zip".format( - datetime.datetime.today().strftime('%Y%m%d%H%M%S'), str(uuid.uuid4())) + blob_name = "{}-{}.zip".format(datetime.datetime.today().strftime('%Y%m%d%H%M%S'), str(uuid.uuid4())) block_blob_service = BlockBlobService(connection_string=storage_connection) if not block_blob_service.exists(container_name): @@ -480,8 +453,7 @@ def progress_callback(current, total): total_length = 30 filled_length = int(round(total_length * current) / float(total)) percents = round(100.0 * current / float(total), 1) - progress_bar = '=' * filled_length + \ - '-' * (total_length - filled_length) + progress_bar = '=' * filled_length + '-' * (total_length - filled_length) progress_message = 'Uploading {} {}%'.format(progress_bar, percents) cmd.cli_ctx.get_progress_controller().add(message=progress_message) @@ -493,23 +465,19 @@ def progress_callback(current, total): blob_end = now + datetime.timedelta(weeks=520) blob_token = block_blob_service.generate_blob_shared_access_signature(container_name, blob_name, - permission=BlobPermissions( - read=True), + permission=BlobPermissions(read=True), expiry=blob_end, start=blob_start) - blob_uri = block_blob_service.make_blob_url( - container_name, blob_name, sas_token=blob_token) + blob_uri = block_blob_service.make_blob_url(container_name, blob_name, sas_token=blob_token) website_run_from_setting = "WEBSITE_RUN_FROM_PACKAGE={}".format(blob_uri) - update_app_settings(cmd, resource_group_name, name, - settings=[website_run_from_setting]) + update_app_settings(cmd, resource_group_name, name, settings=[website_run_from_setting]) client = web_client_factory(cmd.cli_ctx) try: logger.info('\nSyncing Triggers...') if slot is not None: - client.web_apps.sync_function_triggers_slot( - resource_group_name, name, slot) + client.web_apps.sync_function_triggers_slot(resource_group_name, name, slot) else: client.web_apps.sync_function_triggers(resource_group_name, name) except CloudError as ce: @@ -521,8 +489,7 @@ def progress_callback(current, total): def _generic_settings_operation(cli_ctx, resource_group_name, name, operation_name, setting_properties, slot=None, client=None): client = client or web_client_factory(cli_ctx) - operation = getattr( - client.web_apps, operation_name if slot is None else operation_name + '_slot') + operation = getattr(client.web_apps, operation_name if slot is None else operation_name + '_slot') if slot is None: return operation(resource_group_name, name, str, setting_properties) @@ -532,8 +499,7 @@ def _generic_settings_operation(cli_ctx, resource_group_name, name, operation_na def show_webapp(cmd, resource_group_name, name, slot=None, app_instance=None): webapp = app_instance if not app_instance: # when the routine is invoked as a help method, not through commands - webapp = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'get', slot) + webapp = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'get', slot) if not webapp: raise CLIError("'{}' app doesn't exist".format(name)) _rename_server_farm_props(webapp) @@ -564,8 +530,7 @@ def set_webapp(cmd, resource_group_name, name, slot=None, skip_dns_registration= def update_webapp(instance, client_affinity_enabled=None, https_only=None): if 'function' in instance.kind: - raise CLIError( - "please use 'az functionapp update' to update this function app") + raise CLIError("please use 'az functionapp update' to update this function app") if client_affinity_enabled is not None: instance.client_affinity_enabled = client_affinity_enabled == 'true' if https_only is not None: @@ -582,28 +547,23 @@ def update_functionapp(cmd, instance, plan=None): dest_plan_info = client.app_service_plans.get(dest_parse_result['resource_group'], dest_parse_result['name']) else: - dest_plan_info = client.app_service_plans.get( - instance.resource_group, plan) + dest_plan_info = client.app_service_plans.get(instance.resource_group, plan) if dest_plan_info is None: raise CLIError("The plan '{}' doesn't exist".format(plan)) - validate_plan_switch_compatibility( - cmd, client, instance, dest_plan_info) + validate_plan_switch_compatibility(cmd, client, instance, dest_plan_info) instance.server_farm_id = dest_plan_info.id return instance def validate_plan_switch_compatibility(cmd, client, src_functionapp_instance, dest_plan_instance): general_switch_msg = 'Currently the switch is only allowed between a Consumption or an Elastic Premium plan.' - src_parse_result = parse_resource_id( - src_functionapp_instance.server_farm_id) + src_parse_result = parse_resource_id(src_functionapp_instance.server_farm_id) src_plan_info = client.app_service_plans.get(src_parse_result['resource_group'], src_parse_result['name']) if src_plan_info is None: - raise CLIError( - 'Could not determine the current plan of the functionapp') + raise CLIError('Could not determine the current plan of the functionapp') if not (is_plan_consumption(cmd, src_plan_info) or is_plan_elastic_premium(cmd, src_plan_info)): - raise CLIError( - 'Your functionapp is not using a Consumption or an Elastic Premium plan. ' + general_switch_msg) + raise CLIError('Your functionapp is not using a Consumption or an Elastic Premium plan. ' + general_switch_msg) if not (is_plan_consumption(cmd, dest_plan_instance) or is_plan_elastic_premium(cmd, dest_plan_instance)): raise CLIError('You are trying to move to a plan that is not a Consumption or an Elastic Premium plan. ' + general_switch_msg) @@ -629,8 +589,7 @@ def list_deleted_webapp(cmd, resource_group_name=None, name=None, slot=None): def restore_deleted_webapp(cmd, deleted_id, resource_group_name, name, slot=None, restore_content_only=None): DeletedAppRestoreRequest = cmd.get_models('DeletedAppRestoreRequest') - request = DeletedAppRestoreRequest( - deleted_site_id=deleted_id, recover_configuration=not restore_content_only) + request = DeletedAppRestoreRequest(deleted_site_id=deleted_id, recover_configuration=not restore_content_only) return _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'restore_from_deleted_app', slot, request) @@ -642,8 +601,7 @@ def list_function_app(cmd, resource_group_name=None): def _list_app(cli_ctx, resource_group_name=None): client = web_client_factory(cli_ctx) if resource_group_name: - result = list(client.web_apps.list_by_resource_group( - resource_group_name)) + result = list(client.web_apps.list_by_resource_group(resource_group_name)) else: result = list(client.web_apps.list()) for webapp in result: @@ -656,13 +614,11 @@ def _list_deleted_app(cli_ctx, resource_group_name=None, name=None, slot=None): locations = _get_deleted_apps_locations(cli_ctx) result = list() for location in locations: - result = result + \ - list(client.deleted_web_apps.list_by_location(location)) + result = result + list(client.deleted_web_apps.list_by_location(location)) if resource_group_name: result = [r for r in result if r.resource_group == resource_group_name] if name: - result = [r for r in result if r.deleted_site_name.lower() == - name.lower()] + result = [r for r in result if r.deleted_site_name.lower() == name.lower()] if slot: result = [r for r in result if r.slot.lower() == slot.lower()] return result @@ -676,8 +632,7 @@ def getter(): def setter(webapp): webapp.identity = ManagedServiceIdentity(type='SystemAssigned') - poller = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'create_or_update', slot, webapp) + poller = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'create_or_update', slot, webapp) return LongRunningOperation(cmd.cli_ctx)(poller) from azure.cli.core.commands.arm import assign_identity as _assign_identity @@ -697,8 +652,7 @@ def getter(): def setter(webapp): webapp.identity = ManagedServiceIdentity(type='None') - poller = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'create_or_update', slot, webapp) + poller = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'create_or_update', slot, webapp) return LongRunningOperation(cmd.cli_ctx)(poller) from azure.cli.core.commands.arm import assign_identity as _assign_identity @@ -738,8 +692,7 @@ def update_auth_settings(cmd, resource_group_name, name, enabled=None, action=No for arg in args[2:]: if values.get(arg, None): - setattr(auth_settings, arg, - values[arg] if arg not in bool_flags else values[arg] == 'true') + setattr(auth_settings, arg, values[arg] if arg not in bool_flags else values[arg] == 'true') return _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_auth_settings', slot, auth_settings) @@ -794,17 +747,14 @@ def get_site_configs(cmd, resource_group_name, name, slot=None): def get_app_settings(cmd, resource_group_name, name, slot=None): - result = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot) + result = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot) client = web_client_factory(cmd.cli_ctx) - slot_app_setting_names = client.web_apps.list_slot_configuration_names( - resource_group_name, name).app_setting_names + slot_app_setting_names = client.web_apps.list_slot_configuration_names(resource_group_name, name).app_setting_names return _build_app_settings_output(result.properties, slot_app_setting_names) def get_connection_strings(cmd, resource_group_name, name, slot=None): - result = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'list_connection_strings', slot) + result = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_connection_strings', slot) client = web_client_factory(cmd.cli_ctx) slot_constr_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) \ .connection_string_names or [] @@ -829,8 +779,7 @@ def get_azure_storage_accounts(cmd, resource_group_name, name, slot=None): def _fill_ftp_publishing_url(cmd, webapp, resource_group_name, name, slot=None): profiles = list_publish_profiles(cmd, resource_group_name, name, slot) - url = next(p['publishUrl'] - for p in profiles if p['publishMethod'] == 'FTP') + url = next(p['publishUrl'] for p in profiles if p['publishMethod'] == 'FTP') setattr(webapp, 'ftpPublishingUrl', url) return webapp @@ -841,8 +790,7 @@ def _format_fx_version(custom_image_name, container_config_type=None): # handles case of only spaces if fx_version: if container_config_type: - fx_version = '{}|{}'.format( - container_config_type, custom_image_name) + fx_version = '{}|{}'.format(container_config_type, custom_image_name) elif not fx_version_lower.startswith('docker|'): fx_version = '{}|{}'.format('DOCKER', custom_image_name) else: @@ -915,15 +863,12 @@ def update_site_configs(cmd, resource_group_name, name, slot=None, number_of_wor generic_configurations=None): configs = get_site_configs(cmd, resource_group_name, name, slot) if number_of_workers is not None: - number_of_workers = validate_range_of_int_flag( - '--number-of-workers', number_of_workers, min_val=0, max_val=20) + number_of_workers = validate_range_of_int_flag('--number-of-workers', number_of_workers, min_val=0, max_val=20) if linux_fx_version: if linux_fx_version.strip().lower().startswith('docker|'): - update_app_settings(cmd, resource_group_name, name, [ - "WEBSITES_ENABLE_APP_SERVICE_STORAGE=false"]) + update_app_settings(cmd, resource_group_name, name, ["WEBSITES_ENABLE_APP_SERVICE_STORAGE=false"]) else: - delete_app_settings(cmd, resource_group_name, name, [ - "WEBSITES_ENABLE_APP_SERVICE_STORAGE"]) + delete_app_settings(cmd, resource_group_name, name, ["WEBSITES_ENABLE_APP_SERVICE_STORAGE"]) if pre_warmed_instance_count is not None: pre_warmed_instance_count = validate_range_of_int_flag('--prewarmed-instance-count', pre_warmed_instance_count, @@ -941,8 +886,7 @@ def update_site_configs(cmd, resource_group_name, name, slot=None, number_of_wor if arg in int_flags and values[arg] is not None: values[arg] = validate_and_convert_to_int(arg, values[arg]) if arg != 'generic_configurations' and values.get(arg, None): - setattr( - configs, arg, values[arg] if arg not in bool_flags else values[arg] == 'true') + setattr(configs, arg, values[arg] if arg not in bool_flags else values[arg] == 'true') generic_configurations = generic_configurations or [] result = {} @@ -960,12 +904,10 @@ def update_site_configs(cmd, resource_group_name, name, slot=None, number_of_wor def delete_app_settings(cmd, resource_group_name, name, setting_names, slot=None): - app_settings = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot) + app_settings = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'list_application_settings', slot) client = web_client_factory(cmd.cli_ctx) - slot_cfg_names = client.web_apps.list_slot_configuration_names( - resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) is_slot_settings = False for setting_name in setting_names: app_settings.properties.pop(setting_name, None) @@ -974,8 +916,7 @@ def delete_app_settings(cmd, resource_group_name, name, setting_names, slot=None is_slot_settings = True if is_slot_settings: - client.web_apps.update_slot_configuration_names( - resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) result = _generic_settings_operation(cmd.cli_ctx, resource_group_name, name, 'update_application_settings', @@ -989,8 +930,7 @@ def delete_azure_storage_accounts(cmd, resource_group_name, name, custom_id, slo 'list_azure_storage_accounts', slot) client = web_client_factory(cmd.cli_ctx) - slot_cfg_names = client.web_apps.list_slot_configuration_names( - resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) is_slot_settings = False azure_storage_accounts.properties.pop(custom_id, None) @@ -999,8 +939,7 @@ def delete_azure_storage_accounts(cmd, resource_group_name, name, custom_id, slo is_slot_settings = True if is_slot_settings: - client.web_apps.update_slot_configuration_names( - resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) result = _generic_settings_operation(cmd.cli_ctx, resource_group_name, name, 'update_azure_storage_accounts', azure_storage_accounts.properties, @@ -1012,8 +951,7 @@ def delete_azure_storage_accounts(cmd, resource_group_name, name, custom_id, slo def _ssl_context(): if sys.version_info < (3, 4) or (in_cloud_console() and sys.platform.system() == 'Windows'): try: - # added in python 2.7.13 and 3.6 - return ssl.SSLContext(ssl.PROTOCOL_TLS) + return ssl.SSLContext(ssl.PROTOCOL_TLS) # added in python 2.7.13 and 3.6 except AttributeError: return ssl.SSLContext(ssl.PROTOCOL_TLSv1) @@ -1052,12 +990,10 @@ def update_connection_strings(cmd, resource_group_name, name, connection_string_ if slot_settings: new_slot_setting_names = [n.split('=', 1)[0] for n in slot_settings] - slot_cfg_names = client.web_apps.list_slot_configuration_names( - resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) slot_cfg_names.connection_string_names = slot_cfg_names.connection_string_names or [] slot_cfg_names.connection_string_names += new_slot_setting_names - client.web_apps.update_slot_configuration_names( - resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) return result.properties @@ -1067,8 +1003,7 @@ def delete_connection_strings(cmd, resource_group_name, name, setting_names, slo 'list_connection_strings', slot) client = web_client_factory(cmd.cli_ctx) - slot_cfg_names = client.web_apps.list_slot_configuration_names( - resource_group_name, name) + slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, name) is_slot_settings = False for setting_name in setting_names: conn_strings.properties.pop(setting_name, None) @@ -1077,8 +1012,7 @@ def delete_connection_strings(cmd, resource_group_name, name, setting_names, slo is_slot_settings = True if is_slot_settings: - client.web_apps.update_slot_configuration_names( - resource_group_name, name, slot_cfg_names) + client.web_apps.update_slot_configuration_names(resource_group_name, name, slot_cfg_names) return _generic_settings_operation(cmd.cli_ctx, resource_group_name, name, 'update_connection_strings', @@ -1096,51 +1030,37 @@ def update_container_settings(cmd, resource_group_name, name, docker_registry_se multicontainer_config_type=None, multicontainer_config_file=None, slot=None): settings = [] if docker_registry_server_url is not None: - settings.append('DOCKER_REGISTRY_SERVER_URL=' + - docker_registry_server_url) + settings.append('DOCKER_REGISTRY_SERVER_URL=' + docker_registry_server_url) if (not docker_registry_server_user and not docker_registry_server_password and docker_registry_server_url and '.azurecr.io' in docker_registry_server_url): - logger.warning( - 'No credential was provided to access Azure Container Registry. Trying to look up...') + logger.warning('No credential was provided to access Azure Container Registry. Trying to look up...') parsed = urlparse(docker_registry_server_url) - registry_name = ( - parsed.netloc if parsed.scheme else parsed.path).split('.')[0] + registry_name = (parsed.netloc if parsed.scheme else parsed.path).split('.')[0] try: - docker_registry_server_user, docker_registry_server_password = _get_acr_cred( - cmd.cli_ctx, registry_name) + docker_registry_server_user, docker_registry_server_password = _get_acr_cred(cmd.cli_ctx, registry_name) except Exception as ex: # pylint: disable=broad-except - # consider throw if needed - logger.warning( - "Retrieving credentials failed with an exception:'%s'", ex) + logger.warning("Retrieving credentials failed with an exception:'%s'", ex) # consider throw if needed if docker_registry_server_user is not None: - settings.append('DOCKER_REGISTRY_SERVER_USERNAME=' + - docker_registry_server_user) + settings.append('DOCKER_REGISTRY_SERVER_USERNAME=' + docker_registry_server_user) if docker_registry_server_password is not None: - settings.append('DOCKER_REGISTRY_SERVER_PASSWORD=' + - docker_registry_server_password) + settings.append('DOCKER_REGISTRY_SERVER_PASSWORD=' + docker_registry_server_password) if docker_custom_image_name is not None: - _add_fx_version(cmd, resource_group_name, name, - docker_custom_image_name, slot) + _add_fx_version(cmd, resource_group_name, name, docker_custom_image_name, slot) if websites_enable_app_service_storage: - settings.append('WEBSITES_ENABLE_APP_SERVICE_STORAGE=' + - websites_enable_app_service_storage) + settings.append('WEBSITES_ENABLE_APP_SERVICE_STORAGE=' + websites_enable_app_service_storage) if docker_registry_server_user or docker_registry_server_password or docker_registry_server_url or websites_enable_app_service_storage: # pylint: disable=line-too-long update_app_settings(cmd, resource_group_name, name, settings, slot) settings = get_app_settings(cmd, resource_group_name, name, slot) if multicontainer_config_file and multicontainer_config_type: - encoded_config_file = _get_linux_multicontainer_encoded_config_from_file( - multicontainer_config_file) - linux_fx_version = _format_fx_version( - encoded_config_file, multicontainer_config_type) - update_site_configs(cmd, resource_group_name, name, - linux_fx_version=linux_fx_version, slot=slot) + encoded_config_file = _get_linux_multicontainer_encoded_config_from_file(multicontainer_config_file) + linux_fx_version = _format_fx_version(encoded_config_file, multicontainer_config_type) + update_site_configs(cmd, resource_group_name, name, linux_fx_version=linux_fx_version, slot=slot) elif multicontainer_config_file or multicontainer_config_type: - logger.warning( - 'Must change both settings --multicontainer-config-file FILE --multicontainer-config-type TYPE') + logger.warning('Must change both settings --multicontainer-config-file FILE --multicontainer-config-type TYPE') return _mask_creds_related_appsettings(_filter_for_container_settings(cmd, resource_group_name, name, settings, slot=slot)) @@ -1158,15 +1078,12 @@ def update_container_settings_functionapp(cmd, resource_group_name, name, docker def _get_acr_cred(cli_ctx, registry_name): from azure.mgmt.containerregistry import ContainerRegistryManagementClient from azure.cli.core.commands.parameters import get_resources_in_subscription - client = get_mgmt_service_client( - cli_ctx, ContainerRegistryManagementClient).registries + client = get_mgmt_service_client(cli_ctx, ContainerRegistryManagementClient).registries - result = get_resources_in_subscription( - cli_ctx, 'Microsoft.ContainerRegistry/registries') + result = get_resources_in_subscription(cli_ctx, 'Microsoft.ContainerRegistry/registries') result = [item for item in result if item.name.lower() == registry_name] if not result or len(result) > 1: - raise CLIError( - "No resource or more than one were found with name '{}'.".format(registry_name)) + raise CLIError("No resource or more than one were found with name '{}'.".format(registry_name)) resource_group_name = parse_resource_id(result[0].id)['resource_group'] registry = client.get(resource_group_name, registry_name) @@ -1181,8 +1098,7 @@ def _get_acr_cred(cli_ctx, registry_name): def delete_container_settings(cmd, resource_group_name, name, slot=None): _delete_linux_fx_version(cmd, resource_group_name, name, slot) - delete_app_settings(cmd, resource_group_name, name, - CONTAINER_APPSETTING_NAMES, slot) + delete_app_settings(cmd, resource_group_name, name, CONTAINER_APPSETTING_NAMES, slot) def show_container_settings(cmd, resource_group_name, name, show_multicontainer_config=None, slot=None): @@ -1204,8 +1120,7 @@ def _filter_for_container_settings(cmd, resource_group_name, name, settings, 'value': fx_version} result.append(added_image_name) if show_multicontainer_config: - decoded_value = _get_linux_multicontainer_decoded_config( - cmd, resource_group_name, name, slot) + decoded_value = _get_linux_multicontainer_decoded_config(cmd, resource_group_name, name, slot) decoded_image_name = {'name': 'DOCKER_CUSTOM_IMAGE_NAME_DECODED', 'value': decoded_value} result.append(decoded_image_name) @@ -1262,8 +1177,7 @@ def get_external_ip(cmd, resource_group_name, webapp_name): if address.internal_ip_address: ip_address = address.internal_ip_address else: - vip = next((s for s in webapp.host_name_ssl_states if s.ssl_state == - SslState.ip_based_enabled), None) + vip = next((s for s in webapp.host_name_ssl_states if s.ssl_state == SslState.ip_based_enabled), None) ip_address = vip.virtual_ip if vip else address.service_ip_address else: ip_address = _resolve_hostname_through_dns(webapp.default_host_name) @@ -1283,19 +1197,16 @@ def create_webapp_slot(cmd, resource_group_name, webapp, slot, configuration_sou if not site: raise CLIError("'{}' app doesn't exist".format(webapp)) if 'functionapp' in site.kind: - raise CLIError( - "'{}' is a function app. Please use `az functionapp deployment slot create`.".format(webapp)) + raise CLIError("'{}' is a function app. Please use `az functionapp deployment slot create`.".format(webapp)) location = site.location slot_def = Site(server_farm_id=site.server_farm_id, location=location) slot_def.site_config = SiteConfig() - poller = client.web_apps.create_or_update_slot( - resource_group_name, webapp, slot_def, slot) + poller = client.web_apps.create_or_update_slot(resource_group_name, webapp, slot_def, slot) result = LongRunningOperation(cmd.cli_ctx)(poller) if configuration_source: - update_slot_configuration_from_source( - cmd, client, resource_group_name, webapp, slot, configuration_source) + update_slot_configuration_from_source(cmd, client, resource_group_name, webapp, slot, configuration_source) result.name = result.name.split('/')[-1] return result @@ -1310,13 +1221,11 @@ def create_functionapp_slot(cmd, resource_group_name, name, slot, configuration_ location = site.location slot_def = Site(server_farm_id=site.server_farm_id, location=location) - poller = client.web_apps.create_or_update_slot( - resource_group_name, name, slot_def, slot) + poller = client.web_apps.create_or_update_slot(resource_group_name, name, slot_def, slot) result = LongRunningOperation(cmd.cli_ctx)(poller) if configuration_source: - update_slot_configuration_from_source( - cmd, client, resource_group_name, name, slot, configuration_source) + update_slot_configuration_from_source(cmd, client, resource_group_name, name, slot, configuration_source) result.name = result.name.split('/')[-1] return result @@ -1332,8 +1241,7 @@ def update_slot_configuration_from_source(cmd, client, resource_group_name, weba # slot create doesn't clone over the app-settings and connection-strings, so we do it here # also make sure slot settings don't get propagated. - slot_cfg_names = client.web_apps.list_slot_configuration_names( - resource_group_name, webapp) + slot_cfg_names = client.web_apps.list_slot_configuration_names(resource_group_name, webapp) src_slot = None if clone_from_prod else configuration_source app_settings = _generic_site_operation(cmd.cli_ctx, resource_group_name, webapp, 'list_application_settings', @@ -1369,8 +1277,7 @@ def config_source_control(cmd, resource_group_name, name, repo_url, repository_t python_framework = 'Django' if python_framework is None else python_framework python_version = 'Python 3.5.3 x86' if python_version is None else python_version - webapp_list = None if test is None else list_webapp( - resource_group_name) + webapp_list = None if test is None else list_webapp(resource_group_name) vsts_provider = VstsContinuousDeliveryProvider() cd_app_type_details = { 'cd_app_type': cd_app_type, @@ -1396,8 +1303,7 @@ def config_source_control(cmd, resource_group_name, name, repo_url, repository_t 'python_version, cd_account_create, test, slot_swap') from azure.mgmt.web.models import SiteSourceControl, SourceControl if git_token: - sc = SourceControl(location=location, - source_control_name='GitHub', token=git_token) + sc = SourceControl(location=location, source_control_name='GitHub', token=git_token) client.update_source_control('GitHub', sc) source_control = SiteSourceControl(location=location, repo_url=repo_url, branch=branch, @@ -1428,8 +1334,7 @@ def update_git_token(cmd, git_token=None): ''' client = web_client_factory(cmd.cli_ctx) from azure.mgmt.web.models import SourceControl - sc = SourceControl(name='not-really-needed', - source_control_name='GitHub', token=git_token or '') + sc = SourceControl(name='not-really-needed', source_control_name='GitHub', token=git_token or '') return client.update_source_control('GitHub', sc) @@ -1448,8 +1353,7 @@ def enable_local_git(cmd, resource_group_name, name, slot=None): site_config = SiteConfigResource(location=location) site_config.scm_type = 'LocalGit' if slot is None: - client.web_apps.create_or_update_configuration( - resource_group_name, name, site_config) + client.web_apps.create_or_update_configuration(resource_group_name, name, site_config) else: client.web_apps.create_or_update_configuration_slot(resource_group_name, name, site_config, slot) @@ -1468,11 +1372,9 @@ def sync_site_repo(cmd, resource_group_name, name, slot=None): def list_app_service_plans(cmd, resource_group_name=None): client = web_client_factory(cmd.cli_ctx) if resource_group_name is None: - # enables querying "numberOfSites" - plans = list(client.app_service_plans.list(detailed=True)) + plans = list(client.app_service_plans.list(detailed=True)) # enables querying "numberOfSites" else: - plans = list(client.app_service_plans.list_by_resource_group( - resource_group_name)) + plans = list(client.app_service_plans.list_by_resource_group(resource_group_name)) for plan in plans: # prune a few useless fields del plan.geo_region @@ -1493,10 +1395,8 @@ def create_app_service_plan(cmd, resource_group_name, name, is_linux, hyper_v, p client = web_client_factory(cmd.cli_ctx) if app_service_environment: if hyper_v: - raise CLIError( - 'Windows containers is not yet supported in app service environment') - ase_id = _validate_app_service_environment_id( - cmd.cli_ctx, app_service_environment, resource_group_name) + raise CLIError('Windows containers is not yet supported in app service environment') + ase_id = _validate_app_service_environment_id(cmd.cli_ctx, app_service_environment, resource_group_name) ase_def = HostingEnvironmentProfile(id=ase_id) ase_list = client.app_service_environments.list() ase_found = False @@ -1506,17 +1406,14 @@ def create_app_service_plan(cmd, resource_group_name, name, is_linux, hyper_v, p ase_found = True break if not ase_found: - raise CLIError( - "App service environment '{}' not found in subscription.".format(ase_id)) + raise CLIError("App service environment '{}' not found in subscription.".format(ase_id)) else: # Non-ASE ase_def = None if location is None: - location = _get_location_from_resource_group( - cmd.cli_ctx, resource_group_name) + location = _get_location_from_resource_group(cmd.cli_ctx, resource_group_name) # the api is odd on parameter naming, have to live with it for now - sku_def = SkuDescription(tier=get_sku_name( - sku), name=sku, capacity=number_of_workers) + sku_def = SkuDescription(tier=get_sku_name(sku), name=sku, capacity=number_of_workers) plan_def = AppServicePlan(location=location, tags=tags, sku=sku_def, reserved=(is_linux or None), hyper_v=(hyper_v or None), name=name, per_site_scaling=per_site_scaling, hosting_environment_profile=ase_def) @@ -1526,8 +1423,7 @@ def create_app_service_plan(cmd, resource_group_name, name, is_linux, hyper_v, p def update_app_service_plan(instance, sku=None, number_of_workers=None): if number_of_workers is None and sku is None: - logger.warning( - 'No update is done. Specify --sku and/or --number-of-workers.') + logger.warning('No update is done. Specify --sku and/or --number-of-workers.') sku_def = instance.sku if sku is not None: sku = _normalize_sku(sku) @@ -1544,10 +1440,8 @@ def update_functionapp_app_service_plan(cmd, instance, sku=None, number_of_worke instance = update_app_service_plan(instance, sku, number_of_workers) if max_burst is not None: if not is_plan_elastic_premium(cmd, instance): - raise CLIError( - "Usage error: --max-burst is only supported for Elastic Premium (EP) plans") - max_burst = validate_range_of_int_flag( - '--max-burst', max_burst, min_val=0, max_val=20) + raise CLIError("Usage error: --max-burst is only supported for Elastic Premium (EP) plans") + max_burst = validate_range_of_int_flag('--max-burst', max_burst, min_val=0, max_val=20) instance.maximum_elastic_worker_count = max_burst if number_of_workers is not None: number_of_workers = validate_range_of_int_flag('--number-of-workers / --min-instances', @@ -1575,8 +1469,7 @@ def create_backup(cmd, resource_group_name, webapp_name, storage_account_url, client = web_client_factory(cmd.cli_ctx) if backup_name and backup_name.lower().endswith('.zip'): backup_name = backup_name[:-4] - db_setting = _create_db_setting( - cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) + db_setting = _create_db_setting(cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) backup_request = BackupRequest(backup_request_name=backup_name, storage_account_url=storage_account_url, databases=db_setting) if slot: @@ -1595,8 +1488,7 @@ def update_backup_schedule(cmd, resource_group_name, webapp_name, storage_accoun if backup_name and backup_name.lower().endswith('.zip'): backup_name = backup_name[:-4] if not backup_name: - backup_name = '{0}_{1}'.format( - webapp_name, datetime.datetime.utcnow().strftime('%Y%m%d%H%M')) + backup_name = '{0}_{1}'.format(webapp_name, datetime.datetime.utcnow().strftime('%Y%m%d%H%M')) try: configuration = _generic_site_operation(cmd.cli_ctx, resource_group_name, webapp_name, @@ -1634,8 +1526,7 @@ def update_backup_schedule(cmd, resource_group_name, webapp_name, storage_accoun db_name = db_name or db.name db_connection_string = db_connection_string or db.connection_string - db_setting = _create_db_setting( - cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) + db_setting = _create_db_setting(cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) backup_schedule = BackupSchedule(frequency_interval=frequency_num, frequency_unit=frequency_unit.name, keep_at_least_one_backup=keep_at_least_one_backup, @@ -1655,8 +1546,7 @@ def restore_backup(cmd, resource_group_name, webapp_name, storage_account_url, b storage_blob_name = backup_name if not storage_blob_name.lower().endswith('.zip'): storage_blob_name += '.zip' - db_setting = _create_db_setting( - cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) + db_setting = _create_db_setting(cmd, db_name, db_type=db_type, db_connection_string=db_connection_string) restore_request = RestoreRequest(storage_account_url=storage_account_url, blob_name=storage_blob_name, overwrite=overwrite, site_name=target_name, databases=db_setting, @@ -1675,8 +1565,7 @@ def list_snapshots(cmd, resource_group_name, name, slot=None): def restore_snapshot(cmd, resource_group_name, name, time, slot=None, restore_content_only=False, # pylint: disable=redefined-outer-name source_resource_group=None, source_name=None, source_slot=None): from azure.cli.core.commands.client_factory import get_subscription_id - SnapshotRecoverySource, SnapshotRestoreRequest = cmd.get_models( - 'SnapshotRecoverySource', 'SnapshotRestoreRequest') + SnapshotRecoverySource, SnapshotRestoreRequest = cmd.get_models('SnapshotRecoverySource', 'SnapshotRestoreRequest') client = web_client_factory(cmd.cli_ctx) recover_config = not restore_content_only if all([source_resource_group, source_name]): @@ -1693,11 +1582,9 @@ def restore_snapshot(cmd, resource_group_name, name, time, slot=None, restore_co return client.web_apps.restore_snapshot_slot(resource_group_name, name, request, slot) return client.web_apps.restore_snapshot(resource_group_name, name, request) if any([source_resource_group, source_name]): - raise CLIError( - 'usage error: --source-resource-group and --source-name must both be specified if one is used') + raise CLIError('usage error: --source-resource-group and --source-name must both be specified if one is used') # Overwrite app with its own snapshot - request = SnapshotRestoreRequest( - overwrite=True, snapshot_time=time, recover_configuration=recover_config) + request = SnapshotRestoreRequest(overwrite=True, snapshot_time=time, recover_configuration=recover_config) if slot: return client.web_apps.restore_snapshot_slot(resource_group_name, name, request, slot) return client.web_apps.restore_snapshot(resource_group_name, name, request) @@ -1709,8 +1596,7 @@ def _create_db_setting(cmd, db_name, db_type, db_connection_string): if all([db_name, db_type, db_connection_string]): return [DatabaseBackupSetting(database_type=db_type, name=db_name, connection_string=db_connection_string)] if any([db_name, db_type, db_connection_string]): - raise CLIError( - 'usage error: --db-name NAME --db-type TYPE --db-connection-string STRING') + raise CLIError('usage error: --db-name NAME --db-type TYPE --db-connection-string STRING') def _parse_frequency(cmd, frequency): @@ -1735,8 +1621,7 @@ def _parse_frequency(cmd, frequency): def _get_location_from_resource_group(cli_ctx, resource_group_name): - client = get_mgmt_service_client( - cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) + client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) group = client.resource_groups.get(resource_group_name) return group.location @@ -1749,11 +1634,9 @@ def _get_location_from_webapp(client, resource_group_name, webapp): def _get_deleted_apps_locations(cli_ctx): - client = get_mgmt_service_client( - cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) + client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) web_provider = client.providers.get('Microsoft.Web') - del_sites_resource = next( - (x for x in web_provider.resource_types if x.resource_type == 'deletedSites'), None) + del_sites_resource = next((x for x in web_provider.resource_types if x.resource_type == 'deletedSites'), None) if del_sites_resource: return del_sites_resource.locations return [] @@ -1761,8 +1644,7 @@ def _get_deleted_apps_locations(cli_ctx): def _get_local_git_url(cli_ctx, client, resource_group_name, name, slot=None): user = client.get_publishing_user() - result = _generic_site_operation( - cli_ctx, resource_group_name, name, 'get_source_control', slot) + result = _generic_site_operation(cli_ctx, resource_group_name, name, 'get_source_control', slot) parsed = urlparse(result.repo_url) return '{}://{}@{}/{}.git'.format(parsed.scheme, user.publishing_user_name, parsed.netloc, name) @@ -1795,8 +1677,7 @@ def set_deployment_user(cmd, user_name, password=None): try: password = prompt_pass(msg='Password: ', confirm=True) except NoTTYException: - raise CLIError( - 'Please specify both username and password in non-interactive mode.') + raise CLIError('Please specify both username and password in non-interactive mode.') user.publishing_password = password return client.update_publishing_user(user) @@ -1817,8 +1698,7 @@ def list_publish_profiles(cmd, resource_group_name, name, slot=None): for f in content: full_xml += f.decode() - profiles = xmltodict.parse(full_xml, xml_attribs=True)[ - 'publishData']['publishProfile'] + profiles = xmltodict.parse(full_xml, xml_attribs=True)['publishData']['publishProfile'] converted = [] for profile in profiles: new = {} @@ -1851,8 +1731,7 @@ def show_container_cd_url(cmd, resource_group_name, name, slot=None): cd_settings['DOCKER_ENABLE_CI'] = docker_enabled if docker_enabled: - credentials = list_publishing_credentials( - cmd, resource_group_name, name, slot) + credentials = list_publishing_credentials(cmd, resource_group_name, name, slot) if credentials: cd_url = credentials.scm_uri + '/docker/hook' cd_settings['CI_CD_URL'] = cd_url @@ -1866,18 +1745,15 @@ def view_in_browser(cmd, resource_group_name, name, slot=None, logs=False): url = _get_url(cmd, resource_group_name, name, slot) open_page_in_browser(url) if logs: - get_streaming_log(cmd, resource_group_name, - name, provider=None, slot=slot) + get_streaming_log(cmd, resource_group_name, name, provider=None, slot=slot) def _get_url(cmd, resource_group_name, name, slot=None): SslState = cmd.get_models('SslState') - site = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'get', slot) + site = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'get', slot) if not site: raise CLIError("'{}' app doesn't exist".format(name)) - # picks the custom domain URL incase a domain is assigned - url = site.enabled_host_names[0] + url = site.enabled_host_names[0] # picks the custom domain URL incase a domain is assigned ssl_host = next((h for h in site.host_name_ssl_states if h.ssl_state != SslState.disabled), None) return ('https' if ssl_host else 'http') + '://' + url @@ -1918,8 +1794,7 @@ def config_diagnostics(cmd, resource_group_name, name, level=None, # 100 mb max log size, retention lasts 3 days. Yes we hard code it, portal does too filesystem_log_config = FileSystemHttpLogsConfig(retention_in_mb=100, retention_in_days=3, enabled=turned_on) - http_logs = HttpLogsConfig( - file_system=filesystem_log_config, azure_blob_storage=None) + http_logs = HttpLogsConfig(file_system=filesystem_log_config, azure_blob_storage=None) detailed_error_messages_logs = (None if detailed_error_messages is None else EnabledConfig(enabled=detailed_error_messages)) @@ -1941,10 +1816,8 @@ def show_diagnostic_settings(cmd, resource_group_name, name, slot=None): def config_slot_auto_swap(cmd, resource_group_name, webapp, slot, auto_swap_slot=None, disable=None): client = web_client_factory(cmd.cli_ctx) - site_config = client.web_apps.get_configuration_slot( - resource_group_name, webapp, slot) - site_config.auto_swap_slot_name = '' if disable else ( - auto_swap_slot or 'production') + site_config = client.web_apps.get_configuration_slot(resource_group_name, webapp, slot) + site_config.auto_swap_slot_name = '' if disable else (auto_swap_slot or 'production') return client.web_apps.update_configuration_slot(resource_group_name, webapp, site_config, slot) @@ -1953,8 +1826,7 @@ def list_slots(cmd, resource_group_name, webapp): slots = list(client.web_apps.list_slots(resource_group_name, webapp)) for slot in slots: slot.name = slot.name.split('/')[-1] - setattr(slot, 'app_service_plan', parse_resource_id( - slot.server_farm_id)['name']) + setattr(slot, 'app_service_plan', parse_resource_id(slot.server_farm_id)['name']) del slot.server_farm_id return slots @@ -1975,11 +1847,9 @@ def swap_slot(cmd, resource_group_name, webapp, slot, target_slot=None, action=' return result # we will reset both source slot and target slot if target_slot is None: - client.web_apps.reset_production_slot_config( - resource_group_name, webapp) + client.web_apps.reset_production_slot_config(resource_group_name, webapp) else: - client.web_apps.reset_slot_configuration_slot( - resource_group_name, webapp, target_slot) + client.web_apps.reset_slot_configuration_slot(resource_group_name, webapp, target_slot) return None @@ -2004,11 +1874,9 @@ def set_traffic_routing(cmd, resource_group_name, name, distribution): slot, percentage = r.split('=') action_host_name_slot = host_name_val + "-" + slot configs.experiments.ramp_up_rules.append(RampUpRule(action_host_name=action_host_name_slot + host_name_suffix, - reroute_percentage=float( - percentage), + reroute_percentage=float(percentage), name=slot)) - _generic_site_operation(cmd.cli_ctx, resource_group_name, - name, 'update_configuration', None, configs) + _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_configuration', None, configs) return configs.experiments.ramp_up_rules @@ -2027,10 +1895,8 @@ def add_cors(cmd, resource_group_name, name, allowed_origins, slot=None): configs = get_site_configs(cmd, resource_group_name, name, slot) if not configs.cors: configs.cors = CorsSettings() - configs.cors.allowed_origins = ( - configs.cors.allowed_origins or []) + allowed_origins - result = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs) + configs.cors.allowed_origins = (configs.cors.allowed_origins or []) + allowed_origins + result = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs) return result.cors @@ -2038,12 +1904,10 @@ def remove_cors(cmd, resource_group_name, name, allowed_origins, slot=None): configs = get_site_configs(cmd, resource_group_name, name, slot) if configs.cors: if allowed_origins: - configs.cors.allowed_origins = [x for x in ( - configs.cors.allowed_origins or []) if x not in allowed_origins] + configs.cors.allowed_origins = [x for x in (configs.cors.allowed_origins or []) if x not in allowed_origins] else: configs.cors.allowed_origins = [] - configs = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs) + configs = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'update_configuration', slot, configs) return configs.cors @@ -2058,8 +1922,7 @@ def get_streaming_log(cmd, resource_group_name, name, provider=None, slot=None): if provider: streaming_url += ('/' + provider.lstrip('/')) - user, password = _get_site_credential( - cmd.cli_ctx, resource_group_name, name, slot) + user, password = _get_site_credential(cmd.cli_ctx, resource_group_name, name, slot) t = threading.Thread(target=_get_log, args=(streaming_url, user, password)) t.daemon = True t.start() @@ -2071,15 +1934,13 @@ def get_streaming_log(cmd, resource_group_name, name, provider=None, slot=None): def download_historical_logs(cmd, resource_group_name, name, log_file=None, slot=None): scm_url = _get_scm_url(cmd, resource_group_name, name, slot) url = scm_url.rstrip('/') + '/dump' - user_name, password = _get_site_credential( - cmd.cli_ctx, resource_group_name, name, slot) + user_name, password = _get_site_credential(cmd.cli_ctx, resource_group_name, name, slot) _get_log(url, user_name, password, log_file) logger.warning('Downloaded logs to %s', log_file) def _get_site_credential(cli_ctx, resource_group_name, name, slot=None): - creds = _generic_site_operation( - cli_ctx, resource_group_name, name, 'list_publishing_credentials', slot) + creds = _generic_site_operation(cli_ctx, resource_group_name, name, 'list_publishing_credentials', slot) creds = creds.result() return (creds.publishing_user_name, creds.publishing_password) @@ -2093,10 +1954,8 @@ def _get_log(url, user_name, password, log_file=None): except ImportError: pass - http = urllib3.PoolManager( - cert_reqs='CERT_REQUIRED', ca_certs=certifi.where()) - headers = urllib3.util.make_headers( - basic_auth='{0}:{1}'.format(user_name, password)) + http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where()) + headers = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(user_name, password)) r = http.request( 'GET', url, @@ -2127,8 +1986,7 @@ def _get_log(url, user_name, password, log_file=None): def upload_ssl_cert(cmd, resource_group_name, name, certificate_password, certificate_file, slot=None): Certificate = cmd.get_models('Certificate') client = web_client_factory(cmd.cli_ctx) - webapp = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'get', slot) + webapp = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'get', slot) cert_file = open(certificate_file, 'rb') cert_contents = cert_file.read() hosting_environment_profile_param = (webapp.hosting_environment_profile.name @@ -2148,8 +2006,7 @@ def _generate_cert_name(thumb_print, hosting_environment, location, resource_gro def _get_cert(certificate_password, certificate_file): ''' Decrypts the .pfx file ''' - p12 = OpenSSL.crypto.load_pkcs12( - open(certificate_file, 'rb').read(), certificate_password) + p12 = OpenSSL.crypto.load_pkcs12(open(certificate_file, 'rb').read(), certificate_password) cert = p12.get_certificate() digest_algorithm = 'sha1' thumbprint = cert.digest(digest_algorithm).decode("utf-8").replace(':', '') @@ -2163,13 +2020,11 @@ def list_ssl_certs(cmd, resource_group_name): def delete_ssl_cert(cmd, resource_group_name, certificate_thumbprint): client = web_client_factory(cmd.cli_ctx) - webapp_certs = client.certificates.list_by_resource_group( - resource_group_name) + webapp_certs = client.certificates.list_by_resource_group(resource_group_name) for webapp_cert in webapp_certs: if webapp_cert.thumbprint == certificate_thumbprint: return client.certificates.delete(resource_group_name, webapp_cert.name) - raise CLIError("Certificate for thumbprint '{}' not found".format( - certificate_thumbprint)) + raise CLIError("Certificate for thumbprint '{}' not found".format(certificate_thumbprint)) def import_ssl_cert(cmd, resource_group_name, name, key_vault, key_vault_certificate_name): @@ -2177,22 +2032,19 @@ def import_ssl_cert(cmd, resource_group_name, name, key_vault, key_vault_certifi client = web_client_factory(cmd.cli_ctx) webapp = client.web_apps.get(resource_group_name, name) if not webapp: - raise CLIError("'{}' app doesn't exist in resource group {}".format( - name, resource_group_name)) + raise CLIError("'{}' app doesn't exist in resource group {}".format(name, resource_group_name)) server_farm_id = webapp.server_farm_id location = webapp.location kv_id = _format_key_vault_id(cmd.cli_ctx, key_vault, resource_group_name) kv_id_parts = parse_resource_id(kv_id) kv_name = kv_id_parts['name'] kv_resource_group_name = kv_id_parts['resource_group'] - cert_name = '{}-{}-{}'.format(resource_group_name, - kv_name, key_vault_certificate_name) + cert_name = '{}-{}-{}'.format(resource_group_name, kv_name, key_vault_certificate_name) lnk = 'https://azure.github.io/AppService/2016/05/24/Deploying-Azure-Web-App-Certificate-through-Key-Vault.html' lnk_msg = 'Find more details here: {}'.format(lnk) if not _check_service_principal_permissions(cmd, kv_resource_group_name, kv_name): logger.warning('Unable to verify Key Vault permissions.') - logger.warning( - 'You may need to grant Microsoft.Azure.WebSites service principal the Secret:Get permission') + logger.warning('You may need to grant Microsoft.Azure.WebSites service principal the Secret:Get permission') logger.warning(lnk_msg) kv_cert_def = Certificate(location=location, key_vault_id=kv_id, password='', @@ -2206,19 +2058,15 @@ def create_managed_ssl_cert(cmd, resource_group_name, name, hostname, slot=None) Certificate = cmd.get_models('Certificate') hostname = hostname.lower() client = web_client_factory(cmd.cli_ctx) - webapp = _generic_site_operation( - cmd.cli_ctx, resource_group_name, name, 'get', slot) + webapp = _generic_site_operation(cmd.cli_ctx, resource_group_name, name, 'get', slot) if not webapp: slot_text = "Deployment slot {} in ".format(slot) if slot else '' - raise CLIError("{0}app {1} doesn't exist in resource groupĀ {2}".format( - slot_text, name, resource_group_name)) + raise CLIError("{0}app {1} doesn't exist in resource groupĀ {2}".format(slot_text, name, resource_group_name)) parsed_plan_id = parse_resource_id(webapp.server_farm_id) - plan_info = client.app_service_plans.get( - parsed_plan_id['resource_group'], parsed_plan_id['name']) + plan_info = client.app_service_plans.get(parsed_plan_id['resource_group'], parsed_plan_id['name']) if plan_info.sku.tier.upper() == 'FREE' or plan_info.sku.tier.upper() == 'SHARED': - raise CLIError( - 'Managed Certificate is not supported on Free and Shared tier.') + raise CLIError('Managed Certificate is not supported on Free and Shared tier.') if not _verify_hostname_binding(cmd, resource_group_name, name, hostname, slot): slot_text = " --slot {}".format(slot) if slot else "" @@ -2240,8 +2088,7 @@ def _check_service_principal_permissions(cmd, resource_group_name, key_vault_nam from azure.cli.command_modules.role._client_factory import _graph_client_factory from azure.graphrbac.models import GraphErrorException kv_client = keyvault_client_vaults_factory(cmd.cli_ctx, None) - vault = kv_client.get( - resource_group_name=resource_group_name, vault_name=key_vault_name) + vault = kv_client.get(resource_group_name=resource_group_name, vault_name=key_vault_name) # Check for Microsoft.Azure.WebSites app registration AZURE_PUBLIC_WEBSITES_APP_ID = 'abfa0a7c-a6b6-4736-8310-5855508787cd' AZURE_GOV_WEBSITES_APP_ID = '6a02c803-dafd-4136-b4c3-5a6f318b4714' @@ -2254,8 +2101,7 @@ def _check_service_principal_permissions(cmd, resource_group_name, key_vault_nam if perm == "Get": return True except GraphErrorException: - # Lookup will fail for non service principals (users, groups, etc.) - pass + pass # Lookup will fail for non service principals (users, groups, etc.) return False @@ -2277,10 +2123,8 @@ def _update_ssl_binding(cmd, resource_group_name, name, certificate_thumbprint, if not webapp: raise CLIError("'{}' app doesn't exist".format(name)) - cert_resource_group_name = parse_resource_id( - webapp.server_farm_id)['resource_group'] - webapp_certs = client.certificates.list_by_resource_group( - cert_resource_group_name) + cert_resource_group_name = parse_resource_id(webapp.server_farm_id)['resource_group'] + webapp_certs = client.certificates.list_by_resource_group(cert_resource_group_name) for webapp_cert in webapp_certs: if webapp_cert.thumbprint == certificate_thumbprint: if len(webapp_cert.host_names) == 1 and not webapp_cert.host_names[0].startswith('*'): @@ -2290,16 +2134,14 @@ def _update_ssl_binding(cmd, resource_group_name, name, certificate_thumbprint, query_result = list_hostnames(cmd, resource_group_name, name, slot) hostnames_in_webapp = [x.name.split('/')[-1] for x in query_result] - to_update = _match_host_names_from_cert( - webapp_cert.host_names, hostnames_in_webapp) + to_update = _match_host_names_from_cert(webapp_cert.host_names, hostnames_in_webapp) for h in to_update: _update_host_name_ssl_state(cmd, resource_group_name, name, webapp, h, ssl_type, certificate_thumbprint, slot) return show_webapp(cmd, resource_group_name, name, slot) - raise CLIError("Certificate for thumbprint '{}' not found.".format( - certificate_thumbprint)) + raise CLIError("Certificate for thumbprint '{}' not found.".format(certificate_thumbprint)) def bind_ssl_cert(cmd, resource_group_name, name, certificate_thumbprint, ssl_type, slot=None): @@ -2357,16 +2199,14 @@ def update_site_appsettings(cmd, stack, site_config): NameValuePair = cmd.get_models('NameValuePair') if site_config.app_settings is None: site_config.app_settings = [] - site_config.app_settings += [NameValuePair(name=k, value=v) - for k, v in stack['configs'].items()] + site_config.app_settings += [NameValuePair(name=k, value=v) for k, v in stack['configs'].items()] return site_config def _load_stacks(self): if self._stacks: return os_type = ('Linux' if self._linux else 'Windows') - raw_stacks = self._client.provider.get_available_stacks( - os_type_selected=os_type, raw=True) + raw_stacks = self._client.provider.get_available_stacks(os_type_selected=os_type, raw=True) bytes_value = raw_stacks._get_next().content # pylint: disable=protected-access json_value = bytes_value.decode('utf8') json_stacks = json.loads(json_value) @@ -2407,8 +2247,7 @@ def _load_stacks(self): # deal with java, which pairs with java container version java_stack = next((s for s in stacks if s['name'] == 'java')) - java_container_stack = next( - (s for s in stacks if s['name'] == 'javaContainers')) + java_container_stack = next((s for s in stacks if s['name'] == 'javaContainers')) for java_version in java_stack['properties']['majorVersions']: for fx in java_container_stack['properties']['frameworks']: for fx_version in fx['majorVersions']: @@ -2430,34 +2269,28 @@ def _load_stacks(self): def get_app_insights_key(cli_ctx, resource_group, name): - appinsights_client = get_mgmt_service_client( - cli_ctx, ApplicationInsightsManagementClient) + appinsights_client = get_mgmt_service_client(cli_ctx, ApplicationInsightsManagementClient) appinsights = appinsights_client.components.get(resource_group, name) if appinsights is None or appinsights.instrumentation_key is None: - raise CLIError("App Insights {} under resource group {} was not found.".format( - name, resource_group)) + raise CLIError("App Insights {} under resource group {} was not found.".format(name, resource_group)) return appinsights.instrumentation_key def create_functionapp_app_service_plan(cmd, resource_group_name, name, is_linux, sku, number_of_workers=None, max_burst=None, location=None, tags=None): - SkuDescription, AppServicePlan = cmd.get_models( - 'SkuDescription', 'AppServicePlan') + SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') sku = _normalize_sku(sku) tier = get_sku_name(sku) if max_burst is not None: if tier.lower() != "elasticpremium": - raise CLIError( - "Usage error: --max-burst is only supported for Elastic Premium (EP) plans") - max_burst = validate_range_of_int_flag( - '--max-burst', max_burst, min_val=0, max_val=20) + raise CLIError("Usage error: --max-burst is only supported for Elastic Premium (EP) plans") + max_burst = validate_range_of_int_flag('--max-burst', max_burst, min_val=0, max_val=20) if number_of_workers is not None: number_of_workers = validate_range_of_int_flag('--number-of-workers / --min-elastic-worker-count', number_of_workers, min_val=0, max_val=20) client = web_client_factory(cmd.cli_ctx) if location is None: - location = _get_location_from_resource_group( - cmd.cli_ctx, resource_group_name) + location = _get_location_from_resource_group(cmd.cli_ctx, resource_group_name) sku_def = SkuDescription(tier=tier, name=sku, capacity=number_of_workers) plan_def = AppServicePlan(location=location, tags=tags, sku=sku_def, reserved=(is_linux or None), maximum_elastic_worker_count=max_burst, @@ -2466,8 +2299,7 @@ def create_functionapp_app_service_plan(cmd, resource_group_name, name, is_linux def is_plan_consumption(cmd, plan_info): - SkuDescription, AppServicePlan = cmd.get_models( - 'SkuDescription', 'AppServicePlan') + SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') if isinstance(plan_info, AppServicePlan): if isinstance(plan_info.sku, SkuDescription): return plan_info.sku.tier.lower() == 'dynamic' @@ -2475,8 +2307,7 @@ def is_plan_consumption(cmd, plan_info): def is_plan_elastic_premium(cmd, plan_info): - SkuDescription, AppServicePlan = cmd.get_models( - 'SkuDescription', 'AppServicePlan') + SkuDescription, AppServicePlan = cmd.get_models('SkuDescription', 'AppServicePlan') if isinstance(plan_info, AppServicePlan): if isinstance(plan_info.sku, SkuDescription): return plan_info.sku.tier == 'ElasticPremium' @@ -2487,8 +2318,7 @@ def validate_and_convert_to_int(flag, val): try: return int(val) except ValueError: - raise CLIError( - "Usage error: {} is expected to have an int value.".format(flag)) + raise CLIError("Usage error: {} is expected to have an int value.".format(flag)) def validate_range_of_int_flag(flag_name, value, min_val, max_val): @@ -2512,15 +2342,11 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, "be required. To create a 2.x function you would pass in the flag `--functions_version 2`") functions_version = '2' if deployment_source_url and deployment_local_git: - raise CLIError( - 'usage error: --deployment-source-url | --deployment-local-git') + raise CLIError('usage error: --deployment-source-url | --deployment-local-git') if bool(plan) == bool(consumption_plan_location): - raise CLIError( - "usage error: --plan NAME_OR_ID | --consumption-plan-location LOCATION") - SiteConfig, Site, NameValuePair = cmd.get_models( - 'SiteConfig', 'Site', 'NameValuePair') - docker_registry_server_url = parse_docker_image_name( - deployment_container_image_name) + raise CLIError("usage error: --plan NAME_OR_ID | --consumption-plan-location LOCATION") + SiteConfig, Site, NameValuePair = cmd.get_models('SiteConfig', 'Site', 'NameValuePair') + docker_registry_server_url = parse_docker_image_name(deployment_container_image_name) site_config = SiteConfig(app_settings=[]) functionapp_def = Site(location=None, site_config=site_config, tags=tags) @@ -2531,11 +2357,9 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, if consumption_plan_location: locations = list_consumption_locations(cmd) - location = next((l for l in locations if l['name'].lower( - ) == consumption_plan_location.lower()), None) + location = next((l for l in locations if l['name'].lower() == consumption_plan_location.lower()), None) if location is None: - raise CLIError( - "Location is invalid. Use: az functionapp list-consumption-locations") + raise CLIError("Location is invalid. Use: az functionapp list-consumption-locations") functionapp_def.location = consumption_plan_location functionapp_def.kind = 'functionapp' # if os_type is None, the os type is windows @@ -2544,8 +2368,7 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, else: # apps with SKU based plan if is_valid_resource_id(plan): parse_result = parse_resource_id(plan) - plan_info = client.app_service_plans.get( - parse_result['resource_group'], parse_result['name']) + plan_info = client.app_service_plans.get(parse_result['resource_group'], parse_result['name']) else: plan_info = client.app_service_plans.get(resource_group_name, plan) if not plan_info: @@ -2566,21 +2389,18 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, if not is_linux and runtime not in WINDOWS_RUNTIMES: raise CLIError("usage error: Currently supported runtimes (--runtime) in windows function apps are: {}." .format(', '.join(WINDOWS_RUNTIMES))) - site_config.app_settings.append(NameValuePair( - name='FUNCTIONS_WORKER_RUNTIME', value=runtime)) + site_config.app_settings.append(NameValuePair(name='FUNCTIONS_WORKER_RUNTIME', value=runtime)) if runtime_version is not None: if runtime is None: raise CLIError('Must specify --runtime to use --runtime-version') - allowed_versions = RUNTIME_TO_IMAGE_FUNCTIONAPP[functions_version][runtime].keys( - ) + allowed_versions = RUNTIME_TO_IMAGE_FUNCTIONAPP[functions_version][runtime].keys() if runtime_version not in allowed_versions: raise CLIError('--runtime-version {} is not supported for the selected --runtime {} and ' '--functions_version {}. Supported versions are: {}' .format(runtime_version, runtime, functions_version, ', '.join(allowed_versions))) - con_string = _validate_and_get_connection_string( - cmd.cli_ctx, resource_group_name, storage_account) + con_string = _validate_and_get_connection_string(cmd.cli_ctx, resource_group_name, storage_account) if is_linux: functionapp_def.kind = 'functionapp,linux' @@ -2593,18 +2413,15 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, functionapp_def.kind = 'functionapp,linux,container' site_config.app_settings.append(NameValuePair(name='DOCKER_CUSTOM_IMAGE_NAME', value=deployment_container_image_name)) - site_config.app_settings.append(NameValuePair( - name='FUNCTION_APP_EDIT_MODE', value='readOnly')) + site_config.app_settings.append(NameValuePair(name='FUNCTION_APP_EDIT_MODE', value='readOnly')) site_config.app_settings.append(NameValuePair(name='WEBSITES_ENABLE_APP_SERVICE_STORAGE', value='false')) - site_config.linux_fx_version = _format_fx_version( - deployment_container_image_name) + site_config.linux_fx_version = _format_fx_version(deployment_container_image_name) else: site_config.app_settings.append(NameValuePair(name='WEBSITES_ENABLE_APP_SERVICE_STORAGE', value='true')) if runtime not in RUNTIME_TO_IMAGE_FUNCTIONAPP[functions_version].keys(): - raise CLIError( - "An appropriate linux image for runtime:'{}' was not found".format(runtime)) + raise CLIError("An appropriate linux image for runtime:'{}' was not found".format(runtime)) if deployment_container_image_name is None: site_config.linux_fx_version = _get_linux_fx_functionapp(is_consumption, functions_version, @@ -2615,10 +2432,8 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, # adding appsetting to site to make it a function site_config.app_settings.append(NameValuePair(name='FUNCTIONS_EXTENSION_VERSION', value=_get_extension_version_functionapp(functions_version))) - site_config.app_settings.append(NameValuePair( - name='AzureWebJobsStorage', value=con_string)) - site_config.app_settings.append(NameValuePair( - name='AzureWebJobsDashboard', value=con_string)) + site_config.app_settings.append(NameValuePair(name='AzureWebJobsStorage', value=con_string)) + site_config.app_settings.append(NameValuePair(name='AzureWebJobsDashboard', value=con_string)) site_config.app_settings.append(NameValuePair(name='WEBSITE_NODE_DEFAULT_VERSION', value=_get_website_node_version_functionapp(functions_version, runtime, @@ -2633,8 +2448,7 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, if is_plan_elastic_premium(cmd, plan_info) or is_windows_consumption: site_config.app_settings.append(NameValuePair(name='WEBSITE_CONTENTAZUREFILECONNECTIONSTRING', value=con_string)) - site_config.app_settings.append(NameValuePair( - name='WEBSITE_CONTENTSHARE', value=name.lower())) + site_config.app_settings.append(NameValuePair(name='WEBSITE_CONTENTSHARE', value=name.lower())) create_app_insights = False @@ -2642,15 +2456,13 @@ def create_function(cmd, resource_group_name, name, storage_account, plan=None, site_config.app_settings.append(NameValuePair(name='APPINSIGHTS_INSTRUMENTATIONKEY', value=app_insights_key)) elif app_insights is not None: - instrumentation_key = get_app_insights_key( - cmd.cli_ctx, resource_group_name, app_insights) + instrumentation_key = get_app_insights_key(cmd.cli_ctx, resource_group_name, app_insights) site_config.app_settings.append(NameValuePair(name='APPINSIGHTS_INSTRUMENTATIONKEY', value=instrumentation_key)) elif not disable_app_insights: create_app_insights = True - poller = client.web_apps.create_or_update( - resource_group_name, name, functionapp_def) + poller = client.web_apps.create_or_update(resource_group_name, name, functionapp_def) functionapp = LongRunningOperation(cmd.cli_ctx)(poller) if consumption_plan_location and is_linux: @@ -2708,8 +2520,7 @@ def try_create_application_insights(cmd, functionapp): ai_name = functionapp.name ai_location = functionapp.location - app_insights_client = get_mgmt_service_client( - cmd.cli_ctx, ApplicationInsightsManagementClient) + app_insights_client = get_mgmt_service_client(cmd.cli_ctx, ApplicationInsightsManagementClient) ai_properties = { "name": ai_name, "location": ai_location, @@ -2718,8 +2529,7 @@ def try_create_application_insights(cmd, functionapp): "Application_Type": "web" } } - appinsights = app_insights_client.components.create_or_update( - ai_resource_group_name, ai_name, ai_properties) + appinsights = app_insights_client.components.create_or_update(ai_resource_group_name, ai_name, ai_properties) if appinsights is None or appinsights.instrumentation_key is None: logger.warning(creation_failed_warn) return @@ -2742,21 +2552,18 @@ def _set_remote_or_local_git(cmd, webapp, resource_group_name, name, deployment_ deployment_source_branch, manual_integration=True) except Exception as ex: # pylint: disable=broad-except ex = ex_handler_factory(no_throw=True)(ex) - logger.warning( - "Link to git repository failed due to error '%s'", ex) + logger.warning("Link to git repository failed due to error '%s'", ex) if deployment_local_git: local_git_info = enable_local_git(cmd, resource_group_name, name) - logger.warning("Local git is configured with url of '%s'", - local_git_info['url']) + logger.warning("Local git is configured with url of '%s'", local_git_info['url']) setattr(webapp, 'deploymentLocalGitUrl', local_git_info['url']) def _validate_and_get_connection_string(cli_ctx, resource_group_name, storage_account): sa_resource_group = resource_group_name if is_valid_resource_id(storage_account): - sa_resource_group = parse_resource_id( - storage_account)['resource_group'] + sa_resource_group = parse_resource_id(storage_account)['resource_group'] storage_account = parse_resource_id(storage_account)['name'] storage_client = get_mgmt_service_client(cli_ctx, StorageManagementClient) storage_properties = storage_client.storage_accounts.get_properties(sa_resource_group, @@ -2764,20 +2571,18 @@ def _validate_and_get_connection_string(cli_ctx, resource_group_name, storage_ac error_message = '' endpoints = storage_properties.primary_endpoints sku = storage_properties.sku.name - allowed_storage_types = ['Standard_GRS', 'Standard_RAGRS', - 'Standard_LRS', 'Standard_ZRS', 'Premium_LRS'] + allowed_storage_types = ['Standard_GRS', 'Standard_RAGRS', 'Standard_LRS', 'Standard_ZRS', 'Premium_LRS'] for e in ['blob', 'queue', 'table']: if not getattr(endpoints, e, None): - error_message = "Storage account '{}' has no '{}' endpoint. It must have table, queue, and blob endpoints all enabled".format(storage_account, e) # pylint: disable=line-too-long + error_message = "Storage account '{}' has no '{}' endpoint. It must have table, queue, and blob endpoints all enabled".format(storage_account, e) # pylint: disable=line-too-long if sku not in allowed_storage_types: error_message += 'Storage type {} is not allowed'.format(sku) if error_message: raise CLIError(error_message) - obj = storage_client.storage_accounts.list_keys( - sa_resource_group, storage_account) # pylint: disable=no-member + obj = storage_client.storage_accounts.list_keys(sa_resource_group, storage_account) # pylint: disable=no-member try: keys = [obj.keys[0].value, obj.keys[1].value] # pylint: disable=no-member except AttributeError: @@ -2819,8 +2624,7 @@ def _check_zip_deployment_status(cmd, rg_name, name, deployment_status_url, auth try: res_dict = response.json() except json.decoder.JSONDecodeError: - logger.warning( - "Deployment status endpoint %s returns malformed data. Retrying...", deployment_status_url) + logger.warning("Deployment status endpoint %s returns malformed data. Retrying...", deployment_status_url) res_dict = {} finally: num_trials = num_trials + 1 @@ -2832,8 +2636,7 @@ def _check_zip_deployment_status(cmd, rg_name, name, deployment_status_url, auth if res_dict.get('status', 0) == 4: break if 'progress' in res_dict: - # show only in debug mode, customers seem to find this confusing - logger.info(res_dict['progress']) + logger.info(res_dict['progress']) # show only in debug mode, customers seem to find this confusing # if the deployment is taking longer than expected if res_dict.get('status', 0) != 4: _configure_default_logging(cmd, rg_name, name) @@ -2849,22 +2652,18 @@ def list_continuous_webjobs(cmd, resource_group_name, name, slot=None): def start_continuous_webjob(cmd, resource_group_name, name, webjob_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot: - client.web_apps.start_continuous_web_job_slot( - resource_group_name, name, webjob_name, slot) + client.web_apps.start_continuous_web_job_slot(resource_group_name, name, webjob_name, slot) return client.web_apps.get_continuous_web_job_slot(resource_group_name, name, webjob_name, slot) - client.web_apps.start_continuous_web_job( - resource_group_name, name, webjob_name) + client.web_apps.start_continuous_web_job(resource_group_name, name, webjob_name) return client.web_apps.get_continuous_web_job(resource_group_name, name, webjob_name) def stop_continuous_webjob(cmd, resource_group_name, name, webjob_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot: - client.web_apps.stop_continuous_web_job_slot( - resource_group_name, name, webjob_name, slot) + client.web_apps.stop_continuous_web_job_slot(resource_group_name, name, webjob_name, slot) return client.web_apps.get_continuous_web_job_slot(resource_group_name, name, webjob_name, slot) - client.web_apps.stop_continuous_web_job( - resource_group_name, name, webjob_name) + client.web_apps.stop_continuous_web_job(resource_group_name, name, webjob_name) return client.web_apps.get_continuous_web_job(resource_group_name, name, webjob_name) @@ -2882,11 +2681,9 @@ def list_triggered_webjobs(cmd, resource_group_name, name, slot=None): def run_triggered_webjob(cmd, resource_group_name, name, webjob_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot: - client.web_apps.run_triggered_web_job_slot( - resource_group_name, name, webjob_name, slot) + client.web_apps.run_triggered_web_job_slot(resource_group_name, name, webjob_name, slot) return client.web_apps.get_triggered_web_job_slot(resource_group_name, name, webjob_name, slot) - client.web_apps.run_triggered_web_job( - resource_group_name, name, webjob_name) + client.web_apps.run_triggered_web_job(resource_group_name, name, webjob_name) return client.web_apps.get_triggered_web_job(resource_group_name, name, webjob_name) @@ -2905,11 +2702,9 @@ def list_hc(cmd, name, resource_group_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot is None: - listed_vals = client.web_apps.list_hybrid_connections( - resource_group_name, name) + listed_vals = client.web_apps.list_hybrid_connections(resource_group_name, name) else: - listed_vals = client.web_apps.list_hybrid_connections_slot( - resource_group_name, name, slot) + listed_vals = client.web_apps.list_hybrid_connections_slot(resource_group_name, name, slot) # reformats hybrid connection, to prune unnecessary fields mod_list = [] @@ -2960,13 +2755,11 @@ def add_hc(cmd, name, resource_group_name, namespace, hybrid_connection, slot=No i = i + 1 # calling the relay API to get information about the hybrid connection - hy_co = hy_co_client.get(hy_co_resource_group, - namespace, hybrid_connection) + hy_co = hy_co_client.get(hy_co_resource_group, namespace, hybrid_connection) # if the hybrid connection does not have a default sender authorization # rule, create it - hy_co_rules = hy_co_client.list_authorization_rules( - hy_co_resource_group, namespace, hybrid_connection) + hy_co_rules = hy_co_client.list_authorization_rules(hy_co_resource_group, namespace, hybrid_connection) has_default_sender_key = False for r in hy_co_rules: if r.name.lower() == "defaultsender": @@ -2979,8 +2772,7 @@ def add_hc(cmd, name, resource_group_name, namespace, hybrid_connection, slot=No hy_co_client.create_or_update_authorization_rule(hy_co_resource_group, namespace, hybrid_connection, "defaultSender", rights) - hy_co_keys = hy_co_client.list_keys( - hy_co_resource_group, namespace, hybrid_connection, "defaultSender") + hy_co_keys = hy_co_client.list_keys(hy_co_resource_group, namespace, hybrid_connection, "defaultSender") hy_co_info = hy_co.id hy_co_metadata = ast.literal_eval(hy_co.user_metadata) hy_co_hostname = '' @@ -3042,13 +2834,11 @@ def set_hc_key(cmd, plan, resource_group_name, namespace, hybrid_connection, key hy_co_client = hycos_mgmt_client_factory(cmd.cli_ctx, cmd.cli_ctx) # calling the relay function to obtain information about the hc in question - hy_co = hy_co_client.get(relay_resource_group, - namespace, hybrid_connection) + hy_co = hy_co_client.get(relay_resource_group, namespace, hybrid_connection) # if the hybrid connection does not have a default sender authorization # rule, create it - hy_co_rules = hy_co_client.list_authorization_rules( - relay_resource_group, namespace, hybrid_connection) + hy_co_rules = hy_co_client.list_authorization_rules(relay_resource_group, namespace, hybrid_connection) has_default_sender_key = False for r in hy_co_rules: if r.name.lower() == "defaultsender": @@ -3061,8 +2851,7 @@ def set_hc_key(cmd, plan, resource_group_name, namespace, hybrid_connection, key hy_co_client.create_or_update_authorization_rule(relay_resource_group, namespace, hybrid_connection, "defaultSender", rights) - hy_co_keys = hy_co_client.list_keys( - relay_resource_group, namespace, hybrid_connection, "defaultSender") + hy_co_keys = hy_co_client.list_keys(relay_resource_group, namespace, hybrid_connection, "defaultSender") hy_co_metadata = ast.literal_eval(hy_co.user_metadata) hy_co_hostname = 0 for x in hy_co_metadata: @@ -3115,8 +2904,7 @@ def remove_hc(cmd, resource_group_name, name, namespace, hybrid_connection, slot client = web_client_factory(cmd.cli_ctx) if slot is None: - return_hc = client.web_apps.delete_hybrid_connection( - resource_group_name, name, namespace, hybrid_connection) + return_hc = client.web_apps.delete_hybrid_connection(resource_group_name, name, namespace, hybrid_connection) else: return_hc = client.web_apps.delete_hybrid_connection_slot(resource_group_name, name, namespace, hybrid_connection, slot) @@ -3126,11 +2914,9 @@ def remove_hc(cmd, resource_group_name, name, namespace, hybrid_connection, slot def list_vnet_integration(cmd, name, resource_group_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot is None: - result = list(client.web_apps.list_vnet_connections( - resource_group_name, name)) + result = list(client.web_apps.list_vnet_connections(resource_group_name, name)) else: - result = list(client.web_apps.list_vnet_connections_slot( - resource_group_name, name, slot)) + result = list(client.web_apps.list_vnet_connections_slot(resource_group_name, name, slot)) mod_list = [] # reformats the vnet entry, removing unecessary information @@ -3169,8 +2955,7 @@ def list_vnet_integration(cmd, name, resource_group_name, slot=None): def add_vnet_integration(cmd, name, resource_group_name, vnet, subnet, slot=None): SwiftVirtualNetwork = cmd.get_models('SwiftVirtualNetwork') - Delegation = cmd.get_models( - 'Delegation', resource_type=ResourceType.MGMT_NETWORK) + Delegation = cmd.get_models('Delegation', resource_type=ResourceType.MGMT_NETWORK) client = web_client_factory(cmd.cli_ctx) vnet_client = network_client_factory(cmd.cli_ctx) @@ -3192,8 +2977,7 @@ def add_vnet_integration(cmd, name, resource_group_name, vnet, subnet, slot=None i = i + 1 if slot is None: - swift_connection_info = client.web_apps.get_swift_virtual_network_connection( - resource_group_name, name) + swift_connection_info = client.web_apps.get_swift_virtual_network_connection(resource_group_name, name) else: swift_connection_info = client.web_apps.get_swift_virtual_network_connection_slot(resource_group_name, name, slot) @@ -3212,8 +2996,7 @@ def add_vnet_integration(cmd, name, resource_group_name, vnet, subnet, slot=None delegated = True if not delegated: - subnetObj.delegations = [Delegation( - name="delegation", service_name="Microsoft.Web/serverFarms")] + subnetObj.delegations = [Delegation(name="delegation", service_name="Microsoft.Web/serverFarms")] vnet_client.subnets.create_or_update(vnet_resource_group, vnet, subnet, subnet_parameters=subnetObj) @@ -3246,11 +3029,9 @@ def add_vnet_integration(cmd, name, resource_group_name, vnet, subnet, slot=None def remove_vnet_integration(cmd, name, resource_group_name, slot=None): client = web_client_factory(cmd.cli_ctx) if slot is None: - return_vnet = client.web_apps.delete_swift_virtual_network( - resource_group_name, name) + return_vnet = client.web_apps.delete_swift_virtual_network(resource_group_name, name) else: - return_vnet = client.web_apps.delete_swift_virtual_network_slot( - resource_group_name, name, slot) + return_vnet = client.web_apps.delete_swift_virtual_network_slot(resource_group_name, name, slot) return return_vnet @@ -3284,8 +3065,7 @@ def webapp_up(cmd, name, resource_group_name=None, plan=None, location=None, sku site_config = None if not _create_new_app: # App exists # Get the ASP & RG info, if the ASP & RG parameters are provided we use those else we need to find those - logger.warning( - "Webapp %s already exists. The command will deploy contents to the existing app.", name) + logger.warning("Webapp %s already exists. The command will deploy contents to the existing app.", name) app_details = get_app_details(cmd, name) if app_details is None: raise CLIError("Unable to retrieve details of the existing app {}. Please check that the app is a part of " @@ -3307,8 +3087,7 @@ def webapp_up(cmd, name, resource_group_name=None, plan=None, location=None, sku .format(plan, current_plan)) plan = plan or plan_details['name'] plan_info = client.app_service_plans.get(rg_name, plan) - sku = plan_info.sku.name if isinstance( - plan_info, AppServicePlan) else 'Free' + sku = plan_info.sku.name if isinstance(plan_info, AppServicePlan) else 'Free' current_os = 'Linux' if plan_info.reserved else 'Windows' # Raise error if current OS of the app is different from the current one if current_os.lower() != os_name.lower(): @@ -3326,8 +3105,7 @@ def webapp_up(cmd, name, resource_group_name=None, plan=None, location=None, sku rg_name = get_rg_to_use(cmd, user, loc, os_name, resource_group_name) _is_linux = os_name.lower() == 'linux' _create_new_rg = should_create_new_rg(cmd, rg_name, _is_linux) - plan = get_plan_to_use(cmd, user, os_name, loc, - sku, rg_name, _create_new_rg, plan) + plan = get_plan_to_use(cmd, user, os_name, loc, sku, rg_name, _create_new_rg, plan) dry_run_str = r""" { "name" : "%s", "appserviceplan" : "%s", @@ -3368,13 +3146,11 @@ def webapp_up(cmd, name, resource_group_name=None, plan=None, location=None, sku if os_name.lower() == 'linux' and site_config.linux_fx_version != runtime_version: logger.warning('Updating runtime version from %s to %s', site_config.linux_fx_version, runtime_version) - update_site_configs(cmd, rg_name, name, - linux_fx_version=runtime_version) + update_site_configs(cmd, rg_name, name, linux_fx_version=runtime_version) elif os_name.lower() == 'windows' and site_config.windows_fx_version != runtime_version: logger.warning('Updating runtime version from %s to %s', site_config.windows_fx_version, runtime_version) - update_site_configs(cmd, rg_name, name, - windows_fx_version=runtime_version) + update_site_configs(cmd, rg_name, name, windows_fx_version=runtime_version) create_json['runtime_version'] = runtime_version # Zip contents & Deploy logger.warning("Creating zip with contents of dir %s ...", src_dir) @@ -3411,14 +3187,11 @@ def _ping_scm_site(cmd, resource_group, name): # wake up kudu, by making an SCM call import requests # work around until the timeout limits issue for linux is investigated & fixed - user_name, password = _get_site_credential( - cmd.cli_ctx, resource_group, name) + user_name, password = _get_site_credential(cmd.cli_ctx, resource_group, name) scm_url = _get_scm_url(cmd, resource_group, name) import urllib3 - authorization = urllib3.util.make_headers( - basic_auth='{}:{}'.format(user_name, password)) - requests.get(scm_url + '/api/settings', headers=authorization, - verify=not should_disable_connection_verify()) + authorization = urllib3.util.make_headers(basic_auth='{}:{}'.format(user_name, password)) + requests.get(scm_url + '/api/settings', headers=authorization, verify=not should_disable_connection_verify()) def is_webapp_up(tunnel_server): @@ -3429,8 +3202,7 @@ def get_tunnel(cmd, resource_group_name, name, port=None, slot=None): webapp = show_webapp(cmd, resource_group_name, name, slot) is_linux = webapp.reserved if not is_linux: - raise CLIError( - "Only Linux App Service Plans supported, Found a Windows App Service Plan") + raise CLIError("Only Linux App Service Plans supported, Found a Windows App Service Plan") profiles = list_publish_profiles(cmd, resource_group_name, name, slot) profile_user_name = next(p['userName'] for p in profiles) @@ -3442,8 +3214,7 @@ def get_tunnel(cmd, resource_group_name, name, port=None, slot=None): scm_url = _get_scm_url(cmd, resource_group_name, name, slot) - tunnel_server = TunnelServer( - '', port, scm_url, profile_user_name, profile_user_password) + tunnel_server = TunnelServer('', port, scm_url, profile_user_name, profile_user_password) _ping_scm_site(cmd, resource_group_name, name) _wait_for_webapp(tunnel_server) @@ -3461,13 +3232,11 @@ def create_tunnel(cmd, resource_group_name, name, port=None, slot=None, timeout= config = get_site_configs(cmd, resource_group_name, name, slot) if config.remote_debugging_enabled: - logger.warning('Tunnel is ready, connect on port %s', - tunnel_server.local_port) + logger.warning('Tunnel is ready, connect on port %s', tunnel_server.local_port) else: ssh_user_name = 'root' ssh_user_password = 'Docker!' - logger.warning( - 'SSH is available { username: %s, password: %s }', ssh_user_name, ssh_user_password) + logger.warning('SSH is available { username: %s, password: %s }', ssh_user_name, ssh_user_password) logger.warning('Ctrl + C to close') @@ -3533,8 +3302,7 @@ def _start_ssh_session(hostname, port, username, password): if tries == 0: logger.warning('Connection is not ready yet, please wait') if tries == 60: - raise CLIError( - "Timeout Error, Unable to establish a connection") + raise CLIError("Timeout Error, Unable to establish a connection") tries = tries + 1 logger.warning('.') time.sleep(1) @@ -3555,8 +3323,7 @@ def ssh_webapp(cmd, resource_group_name, name, port=None, slot=None, timeout=Non config = get_site_configs(cmd, resource_group_name, name, slot) if config.remote_debugging_enabled: raise CLIError('remote debugging is enabled, please disable') - create_tunnel_and_session(cmd, resource_group_name, - name, port=port, slot=slot, timeout=timeout) + create_tunnel_and_session(cmd, resource_group_name, name, port=port, slot=slot, timeout=timeout) def create_devops_pipeline( @@ -3579,8 +3346,7 @@ def create_devops_pipeline( def _configure_default_logging(cmd, rg_name, name): - logger.warning( - "Configuring default logging for the app, if not already enabled") + logger.warning("Configuring default logging for the app, if not already enabled") return config_diagnostics(cmd, rg_name, name, application_logging=True, web_server_logging='filesystem', docker_container_logging='true')