diff --git a/src/azure-cli/HISTORY.rst b/src/azure-cli/HISTORY.rst index c222025df06..71400950aa5 100644 --- a/src/azure-cli/HISTORY.rst +++ b/src/azure-cli/HISTORY.rst @@ -27,6 +27,7 @@ Release History **App Config** +* `az appconfig enhanced-feature-flag`: Add command group to manage enhanced feature flags using the new data-plane `FeatureFlagClient` * Sanitize resource group name in data-plane test recordings (#33906) **App Service** diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/_constants.py b/src/azure-cli/azure/cli/command_modules/appconfig/_constants.py index 12bdbf5a033..5a8325af404 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_constants.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_constants.py @@ -22,6 +22,9 @@ class FeatureFlagConstants: REQUIREMENT_TYPE = "requirement_type" DISPLAY_NAME = "display_name" NAME = "name" + LABEL = "label" + TAGS = "tags" + LAST_MODIFIED = "last_modified" FILTER_PARAMETERS = "parameters" ALLOCATION = "allocation" TELEMETRY = "telemetry" diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/_format.py b/src/azure-cli/azure/cli/command_modules/appconfig/_format.py index f5493ea9e28..6b2ab169267 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_format.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_format.py @@ -34,6 +34,10 @@ def featureflag_entry_format(result): return _output_format(result, _featureflag_entry_format_group) +def enhanced_featureflag_entry_format(result): + return _output_format(result, _enhanced_featureflag_entry_format_group) + + def featurefilter_entry_format(result): return _output_format(result, _featurefilter_entry_format_group) @@ -146,6 +150,22 @@ def _featureflag_entry_format_group(item): ]) +def _enhanced_featureflag_entry_format_group(item): + + return OrderedDict([ + ('NAME', _get_value(item, 'name')), + ('ENABLED', _get_value(item, 'enabled')), + ('LABEL', _get_value(item, 'label')), + ('DESCRIPTION', _get_value(item, 'description')), + ('LAST MODIFIED', _format_datetime(_get_value_by_names(item, ['lastModified', 'last_modified']))), + ('TAGS', _get_value(item, 'tags')), + ('CONDITIONS', _get_value(item, 'conditions')), + ('VARIANTS', _get_value(item, 'variants')), + ('ALLOCATION', _get_value(item, 'allocation')), + ('TELEMETRY', _get_value(item, 'telemetry')) + ]) + + def _snapshot_output_format_group(item): return OrderedDict([ diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/_help.py b/src/azure-cli/azure/cli/command_modules/appconfig/_help.py index e3df673eb45..9a9a104bf3c 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_help.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_help.py @@ -612,6 +612,110 @@ az appconfig feature disable -n MyAppConfiguration --key .appconfig.featureflag/MyApp1:Beta """ +helps['appconfig enhanced-feature-flag'] = """ + type: group + short-summary: Manage enhanced feature flags stored in an App Configuration store. + """ + +helps['appconfig enhanced-feature-flag set'] = """ + type: command + short-summary: Set an enhanced feature flag. + examples: + - name: Set an enhanced feature flag with label MyLabel. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --feature color --label MyLabel + - name: Set an enhanced feature flag with null label using connection string and set a description. + text: + az appconfig enhanced-feature-flag set --connection-string Endpoint=https://contoso.azconfig.io;Id=xxx;Secret=xxx --feature color --description "This is a colorful feature" + - name: Set an enhanced feature flag using your 'az login' credentials. + text: + az appconfig enhanced-feature-flag set --endpoint https://myappconfiguration.azconfig.io --feature color --label MyLabel --auth-mode login + - name: Set an enhanced feature flag with tags "tag1=value1" and "tag2=value2". + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --feature color --tags tag1=value1 tag2=value2 + - name: Set an enhanced feature flag with telemetry enabled. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --feature color --telemetry-enabled + - name: Disable telemetry on an enhanced feature flag. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --feature color --telemetry-enabled false + """ + +helps['appconfig enhanced-feature-flag delete'] = """ + type: command + short-summary: Delete an enhanced feature flag. + examples: + - name: Delete an enhanced feature flag using App Configuration store name without confirmation. + text: + az appconfig enhanced-feature-flag delete -n MyAppConfiguration --feature color --label MyLabel --yes + - name: Delete an enhanced feature flag using connection string. + text: + az appconfig enhanced-feature-flag delete --connection-string Endpoint=https://contoso.azconfig.io;Id=xxx;Secret=xxx --feature color --label MyLabel + - name: Delete an enhanced feature flag using App Configuration store endpoint and your 'az login' credentials. + text: + az appconfig enhanced-feature-flag delete --endpoint https://myappconfiguration.azconfig.io --feature color --auth-mode login + """ + +helps['appconfig enhanced-feature-flag show'] = """ + type: command + short-summary: Show all attributes of an enhanced feature flag. + examples: + - name: Show an enhanced feature flag using App Configuration store name with a specific label. + text: + az appconfig enhanced-feature-flag show -n MyAppConfiguration --feature color --label MyLabel + - name: Show an enhanced feature flag using connection string and field filters. + text: + az appconfig enhanced-feature-flag show --connection-string Endpoint=https://contoso.azconfig.io;Id=xxx;Secret=xxx --feature color --fields name enabled conditions + - name: Show an enhanced feature flag using App Configuration store endpoint and your 'az login' credentials. + text: + az appconfig enhanced-feature-flag show --endpoint https://myappconfiguration.azconfig.io --feature color --auth-mode login + """ + +helps['appconfig enhanced-feature-flag list'] = """ + type: command + short-summary: List enhanced feature flags. + examples: + - name: List all enhanced feature flags. + text: + az appconfig enhanced-feature-flag list -n MyAppConfiguration + - name: List a specific feature for any label starting with v1. using connection string. + text: + az appconfig enhanced-feature-flag list --feature color --connection-string Endpoint=https://contoso.azconfig.io;Id=xxx;Secret=xxx --label v1.* + - name: List all features with any labels and query only name, enabled and conditions. + text: + az appconfig enhanced-feature-flag list --connection-string Endpoint=https://contoso.azconfig.io;Id=xxx;Secret=xxx --fields name enabled conditions + - name: List 150 enhanced feature flags with any labels. + text: + az appconfig enhanced-feature-flag list --connection-string Endpoint=https://contoso.azconfig.io;Id=xxx;Secret=xxx --top 150 + - name: List all enhanced feature flags with specific tags. + text: + az appconfig enhanced-feature-flag list -n MyAppConfiguration --tags tag1=value1 tag2=value2 + """ + +helps['appconfig enhanced-feature-flag enable'] = """ + type: command + short-summary: Enable an enhanced feature flag to turn it ON for use. + examples: + - name: Enable an enhanced feature flag using App Configuration store name. + text: + az appconfig enhanced-feature-flag enable -n MyAppConfiguration --feature color --label test + - name: Force enabling an enhanced feature flag using connection string. + text: + az appconfig enhanced-feature-flag enable --connection-string Endpoint=https://contoso.azconfig.io;Id=xxx;Secret=xxx --feature color --label test --yes + """ + +helps['appconfig enhanced-feature-flag disable'] = """ + type: command + short-summary: Disable an enhanced feature flag to turn it OFF for use. + examples: + - name: Disable an enhanced feature flag using App Configuration store name. + text: + az appconfig enhanced-feature-flag disable -n MyAppConfiguration --feature color --label test + - name: Force disabling an enhanced feature flag using connection string. + text: + az appconfig enhanced-feature-flag disable --connection-string Endpoint=https://contoso.azconfig.io;Id=xxx;Secret=xxx --feature color --label test --yes + """ + helps['appconfig feature filter'] = """ type: group short-summary: Manage filters associated with feature flags stored in an App Configuration store. diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/_params.py b/src/azure-cli/azure/cli/command_modules/appconfig/_params.py index f28e4e66069..140170efc69 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_params.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_params.py @@ -21,7 +21,7 @@ validate_connection_string, validate_datetime, validate_export, validate_import, validate_import_depth, validate_query_fields, - validate_feature_query_fields, validate_filter_parameters, + validate_feature_query_fields, validate_enhanced_feature_query_fields, validate_filter_parameters, validate_separator, validate_secret_identifier, validate_key, validate_feature, validate_feature_key, validate_identity, validate_auth_mode, validate_snapshot_reference, @@ -47,6 +47,12 @@ def load_arguments(self, _): validator=validate_feature_query_fields, arg_type=get_enum_type(['name', 'key', 'label', 'locked', 'last_modified', 'state', 'description', 'conditions']) ) + enhanced_feature_fields_arg_type = CLIArgumentType( + nargs='+', + help='Customize output fields for Enhanced Feature Flags.', + validator=validate_enhanced_feature_query_fields, + arg_type=get_enum_type(['name', 'enabled', 'label', 'description', 'conditions', 'variants', 'allocation', 'tags', 'last_modified']) + ) snapshot_fields_arg_type = CLIArgumentType( nargs='+', help='Customize output fields for Snapshots', @@ -464,6 +470,28 @@ def load_arguments(self, _): c.argument('label', help="If no label specified, display filters from the feature flag with null label by default.") c.argument('all_', help="List all filters associated with a feature flag.") + with self.argument_context('appconfig enhanced-feature-flag') as c: + c.argument('name', arg_type=data_plane_name_arg_type) + c.argument('feature', validator=validate_feature, help="Name of the enhanced feature flag. Enhanced feature flag name cannot contain the '%' or ':' characters.") + c.argument('label', help="If no label specified, uses the null label.") + + with self.argument_context('appconfig enhanced-feature-flag set') as c: + c.argument('description', help='Description of the enhanced feature flag to be set.') + c.argument('requirement_type', arg_type=get_enum_type([FeatureFlagConstants.REQUIREMENT_TYPE_ALL, FeatureFlagConstants.REQUIREMENT_TYPE_ANY]), + help='Requirement type determines if filters should use "Any" or "All" logic when evaluating the state of an enhanced feature flag.') + c.argument('telemetry_enabled', arg_type=get_three_state_flag(), help='Enable or disable telemetry for the enhanced feature flag.') + c.argument('tags', arg_type=tags_type) + + with self.argument_context('appconfig enhanced-feature-flag show') as c: + c.argument('fields', arg_type=enhanced_feature_fields_arg_type) + + with self.argument_context('appconfig enhanced-feature-flag list') as c: + c.argument('feature', validator=validate_feature, help='Name of the enhanced feature flag to be listed. Support star sign as filters, for instance * means all enhanced feature flags and abc* means enhanced feature flags with abc as prefix.') + c.argument('label', help="If no label specified, list all labels. Support star sign as filters, for instance * means all labels and abc* means labels with abc as prefix.") + c.argument('fields', arg_type=enhanced_feature_fields_arg_type) + c.argument('all_', help="List all enhanced feature flags.") + c.argument('tags', arg_type=tags_arg_type, help="If no tags are specified, list all enhanced feature flags with any tags. Support space-separated tags: key[=value] [key[=value] ...].") + with self.argument_context('appconfig replica') as c: c.argument('store_name', arg_type=store_name_arg_type) c.argument('name', arg_type=replica_name_arg_type) diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/_utils.py b/src/azure-cli/azure/cli/command_modules/appconfig/_utils.py index c13363e1bab..3263994ff60 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_utils.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_utils.py @@ -6,7 +6,7 @@ # pylint: disable=line-too-long from knack.log import get_logger from knack.util import CLIError -from azure.appconfiguration import AzureAppConfigurationClient +from azure.appconfiguration import AzureAppConfigurationClient, FeatureFlagClient from azure.core.exceptions import HttpResponseError from azure.core.credentials import AzureKeyCredential from azure.cli.core.azclierror import (ValidationError, @@ -177,15 +177,14 @@ def send(self, request, **kwargs): # pylint: disable=arguments-differ return super().send(request, **kwargs) -def get_appconfig_data_client(cmd, name, connection_string, auth_mode, endpoint): - azconfig_client = None +def _get_data_plane_retry_policy(): # Configure retries with exponential backoff (factor=0.5) capped at 30 seconds, # with an overall retry timeout of 100 seconds. # We set retry count to a high number so the retry policy can continue retrying until # the timeout is reached. The actual retry timing may vary, for example when the service # returns a Retry-After header and the policy uses that delay instead of the exponential backoff. retry_count = 9999 - retry_policy = RetryPolicy( + return RetryPolicy( retry_total=retry_count, retry_connect=retry_count, retry_read=retry_count, @@ -195,6 +194,36 @@ def get_appconfig_data_client(cmd, name, connection_string, auth_mode, endpoint) timeout=100 # seconds ) + +def resolve_login_credential(cmd, name, endpoint): + if not endpoint: + try: + if name: + _, endpoint = resolve_store_metadata(cmd, name) + else: + raise RequiredArgumentMissingError("App Configuration endpoint or name should be provided if auth mode is 'login'.") + except Exception as ex: + raise CLIError(str(ex) + "\nYou may be able to resolve this issue by providing App Configuration endpoint instead of name.") + + from azure.cli.core._profile import Profile + from azure.cli.core.cloud import get_active_cloud + from ._credential import AppConfigurationCliCredential + profile = Profile(cli_ctx=cmd.cli_ctx) + cred, _, _ = profile.get_login_credentials() + + current_cloud = get_active_cloud(cmd.cli_ctx) + if hasattr(current_cloud.endpoints, "appconfig_auth_token_audience"): + token_audience = current_cloud.endpoints.appconfig_auth_token_audience + else: + token_audience = endpoint + + return AppConfigurationCliCredential(cred, token_audience), endpoint + + +def get_appconfig_data_client(cmd, name, connection_string, auth_mode, endpoint): + azconfig_client = None + retry_policy = _get_data_plane_retry_policy() + if auth_mode == "anonymous": try: azconfig_client = AzureAppConfigurationClient( @@ -217,30 +246,9 @@ def get_appconfig_data_client(cmd, name, connection_string, auth_mode, endpoint) raise CLIError("Failed to initialize AzureAppConfigurationClient due to an exception: {}".format(str(ex))) if auth_mode == "login": - if not endpoint: - try: - if name: - _, endpoint = resolve_store_metadata(cmd, name) - else: - raise RequiredArgumentMissingError("App Configuration endpoint or name should be provided if auth mode is 'login'.") - except Exception as ex: - raise CLIError(str(ex) + "\nYou may be able to resolve this issue by providing App Configuration endpoint instead of name.") - - from azure.cli.core._profile import Profile - from azure.cli.core.cloud import get_active_cloud - from ._credential import AppConfigurationCliCredential - profile = Profile(cli_ctx=cmd.cli_ctx) - cred, _, _ = profile.get_login_credentials() - - current_cloud = get_active_cloud(cmd.cli_ctx) - token_audience = None - if hasattr(current_cloud.endpoints, "appconfig_auth_token_audience"): - token_audience = current_cloud.endpoints.appconfig_auth_token_audience - else: - token_audience = endpoint - + credential, endpoint = resolve_login_credential(cmd, name, endpoint) try: - azconfig_client = AzureAppConfigurationClient(credential=AppConfigurationCliCredential(cred, token_audience), + azconfig_client = AzureAppConfigurationClient(credential=credential, base_url=endpoint, user_agent=HttpHeaders.USER_AGENT, retry_policy=retry_policy) @@ -250,6 +258,44 @@ def get_appconfig_data_client(cmd, name, connection_string, auth_mode, endpoint) return azconfig_client +def get_appconfig_feature_flag_client(cmd, name, connection_string, auth_mode, endpoint): + feature_flag_client = None + retry_policy = _get_data_plane_retry_policy() + + if auth_mode == "anonymous": + try: + feature_flag_client = FeatureFlagClient( + base_url=endpoint, + credential=AzureKeyCredential(key=""), + id_credential="", + user_agent=HttpHeaders.USER_AGENT, + transport=AuthHeaderRequestsTransport(), + retry_policy=retry_policy) + except (ValueError, TypeError) as ex: + raise CLIError("Failed to initialize FeatureFlagClient due to an exception: {}".format(str(ex))) + + if auth_mode == "key": + connection_string = resolve_connection_string(cmd, name, connection_string) + try: + feature_flag_client = FeatureFlagClient.from_connection_string(connection_string=connection_string, + user_agent=HttpHeaders.USER_AGENT, + retry_policy=retry_policy) + except ValueError as ex: + raise CLIError("Failed to initialize FeatureFlagClient due to an exception: {}".format(str(ex))) + + if auth_mode == "login": + credential, endpoint = resolve_login_credential(cmd, name, endpoint) + try: + feature_flag_client = FeatureFlagClient(credential=credential, + base_url=endpoint, + user_agent=HttpHeaders.USER_AGENT, + retry_policy=retry_policy) + except (ValueError, TypeError) as ex: + raise CLIError("Failed to initialize FeatureFlagClient due to an exception: {}".format(str(ex))) + + return feature_flag_client + + def is_json_content_type(content_type): if not content_type: return False diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/_validators.py b/src/azure-cli/azure/cli/command_modules/appconfig/_validators.py index 1be0a67ad08..0ee1e5b1f3a 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_validators.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_validators.py @@ -214,6 +214,11 @@ def validate_feature_query_fields(namespace): namespace.fields = fields +def validate_enhanced_feature_query_fields(namespace): + if namespace.fields: + namespace.fields = [field.lower() for field in namespace.fields] + + def validate_snapshot_query_fields(namespace): if namespace.fields: fields = [] diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/commands.py b/src/azure-cli/azure/cli/command_modules/appconfig/commands.py index 022b679b832..119265012a8 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/commands.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/commands.py @@ -13,6 +13,7 @@ configstore_output_format, keyvalue_entry_format, featureflag_entry_format, + enhanced_featureflag_entry_format, featurefilter_entry_format, deleted_configstore_output_format, configstore_replica_output_format, @@ -141,6 +142,18 @@ def get_custom_sdk(custom_module, client_factory, table_transformer): g.custom_show_command('show', 'show_filter') g.custom_command('list', 'list_filter') + # Enhanced FeatureManagement Commands + with self.command_group('appconfig enhanced-feature-flag', + custom_command_type=get_custom_sdk('enhanced_feature', + None, + enhanced_featureflag_entry_format)) as g: + g.custom_command('set', 'set_feature') + g.custom_command('delete', 'delete_feature') + g.custom_show_command('show', 'show_feature') + g.custom_command('list', 'list_feature') + g.custom_command('enable', 'enable_feature') + g.custom_command('disable', 'disable_feature') + # Snapshot Commands with self.command_group('appconfig snapshot', configstore_snapshot_util) as g: g.command('create', 'create_snapshot') diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/enhanced_feature.py b/src/azure-cli/azure/cli/command_modules/appconfig/enhanced_feature.py new file mode 100644 index 00000000000..94815889629 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/appconfig/enhanced_feature.py @@ -0,0 +1,231 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +# pylint: disable=line-too-long + +import json + +from knack.log import get_logger +from azure.appconfiguration import (FeatureFlag, + FeatureFlagConditions, + FeatureFlagTelemetryConfiguration) +from azure.core.exceptions import HttpResponseError, ResourceNotFoundError +from azure.cli.core.util import user_confirmation +import azure.cli.core.azclierror as CLIErrors + +from ._constants import FeatureFlagConstants +from ._utils import get_appconfig_feature_flag_client + +logger = get_logger(__name__) + +# Enhanced feature flag commands # + + +def set_feature(cmd, + feature, + name=None, + label=None, + description=None, + requirement_type=None, + telemetry_enabled=None, + tags=None, + yes=False, + connection_string=None, + auth_mode="key", + endpoint=None): + feature_flag_client = get_appconfig_feature_flag_client(cmd, name, connection_string, auth_mode, endpoint) + + try: + feature_flag = feature_flag_client.get_feature_flag(name=feature, label=label) + except ResourceNotFoundError: + feature_flag = None + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError("Failed to retrieve enhanced feature flag from config store. " + str(exception)) + + if feature_flag is None: + feature_flag = FeatureFlag(name=feature, enabled=False, label=label) + + if description is not None: + feature_flag.description = description + + if requirement_type is not None: + if feature_flag.conditions is None: + feature_flag.conditions = FeatureFlagConditions() + feature_flag.conditions.requirement_type = requirement_type + + if telemetry_enabled is not None: + if feature_flag.telemetry is None: + feature_flag.telemetry = FeatureFlagTelemetryConfiguration(enabled=telemetry_enabled) + else: + feature_flag.telemetry.enabled = telemetry_enabled + + if tags is not None: + feature_flag.tags = tags + + entry = json.dumps(_serialize_feature_flag(feature_flag), indent=2, sort_keys=True, ensure_ascii=False, default=str) + confirmation_message = "Are you sure you want to set the enhanced feature flag: \n" + entry + "\n" + user_confirmation(confirmation_message, yes) + + try: + updated_feature_flag = feature_flag_client.set_feature_flag(feature_flag) + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError(str(exception)) + + return _serialize_feature_flag(updated_feature_flag) + + +def show_feature(cmd, + feature, + name=None, + label=None, + fields=None, + connection_string=None, + auth_mode="key", + endpoint=None): + feature_flag_client = get_appconfig_feature_flag_client(cmd, name, connection_string, auth_mode, endpoint) + + try: + feature_flag = feature_flag_client.get_feature_flag(name=feature, label=label) + except ResourceNotFoundError: + feature_flag = None + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError(str(exception)) + + if feature_flag is None: + raise CLIErrors.ResourceNotFoundError("Enhanced feature flag '{}' with label '{}' does not exist.".format(feature, label)) + + return _serialize_feature_flag(feature_flag, fields) + + +def list_feature(cmd, + feature=None, + name=None, + label=None, + fields=None, + all_=False, + top=None, + tags=None, + connection_string=None, + auth_mode="key", + endpoint=None): + feature_flag_client = get_appconfig_feature_flag_client(cmd, name, connection_string, auth_mode, endpoint) + + try: + feature_flags = feature_flag_client.list_feature_flags(name_filter=feature, + label_filter=label, + tags_filter=tags) + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError("Failed to read enhanced feature flag(s) that match the specified feature and label. " + str(exception)) + + result = [] + count = 0 + for feature_flag in feature_flags: + result.append(_serialize_feature_flag(feature_flag, fields)) + count += 1 + if not all_ and count >= (top if top is not None else 100): + break + + return result + + +def delete_feature(cmd, + feature, + name=None, + label=None, + yes=False, + connection_string=None, + auth_mode="key", + endpoint=None): + feature_flag_client = get_appconfig_feature_flag_client(cmd, name, connection_string, auth_mode, endpoint) + + try: + feature_flag = feature_flag_client.get_feature_flag(name=feature, label=label) + except ResourceNotFoundError: + feature_flag = None + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError(str(exception)) + + if feature_flag is None: + raise CLIErrors.ResourceNotFoundError("Enhanced feature flag '{}' with label '{}' does not exist.".format(feature, label)) + + confirmation_message = "Are you sure you want to delete the enhanced feature flag '{}' with label '{}'?".format(feature, label) + user_confirmation(confirmation_message, yes) + + try: + deleted_feature_flag = feature_flag_client.delete_feature_flag(name=feature, label=label) + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError(str(exception)) + + return _serialize_feature_flag(deleted_feature_flag) + + +def enable_feature(cmd, + feature, + name=None, + label=None, + yes=False, + connection_string=None, + auth_mode="key", + endpoint=None): + return _set_feature_state(cmd, feature, enabled=True, name=name, label=label, yes=yes, + connection_string=connection_string, auth_mode=auth_mode, endpoint=endpoint) + + +def disable_feature(cmd, + feature, + name=None, + label=None, + yes=False, + connection_string=None, + auth_mode="key", + endpoint=None): + return _set_feature_state(cmd, feature, enabled=False, name=name, label=label, yes=yes, + connection_string=connection_string, auth_mode=auth_mode, endpoint=endpoint) + + +def _set_feature_state(cmd, feature, enabled, name, label, yes, connection_string, auth_mode, endpoint): + feature_flag_client = get_appconfig_feature_flag_client(cmd, name, connection_string, auth_mode, endpoint) + + try: + feature_flag = feature_flag_client.get_feature_flag(name=feature, label=label) + except ResourceNotFoundError: + feature_flag = None + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError("Failed to retrieve enhanced feature flag from config store. " + str(exception)) + + if feature_flag is None: + raise CLIErrors.ResourceNotFoundError("Enhanced feature flag '{}' with label '{}' not found.".format(feature, label)) + + feature_flag.enabled = enabled + action = "enable" if enabled else "disable" + confirmation_message = "Are you sure you want to {} this enhanced feature flag '{}'?".format(action, feature) + user_confirmation(confirmation_message, yes) + + try: + updated_feature_flag = feature_flag_client.set_feature_flag(feature_flag) + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError(str(exception)) + + return _serialize_feature_flag(updated_feature_flag) + + +def _serialize_feature_flag(feature_flag, fields=None): + result = { + FeatureFlagConstants.NAME: feature_flag.name, + FeatureFlagConstants.ENABLED: feature_flag.enabled, + FeatureFlagConstants.LABEL: feature_flag.label, + FeatureFlagConstants.DESCRIPTION: feature_flag.description, + FeatureFlagConstants.CONDITIONS: feature_flag.conditions.as_dict() if feature_flag.conditions is not None else None, + FeatureFlagConstants.VARIANTS: [variant.as_dict() for variant in feature_flag.variants] if feature_flag.variants is not None else None, + FeatureFlagConstants.ALLOCATION: feature_flag.allocation.as_dict() if feature_flag.allocation is not None else None, + FeatureFlagConstants.TELEMETRY: feature_flag.telemetry.as_dict() if feature_flag.telemetry is not None else None, + FeatureFlagConstants.TAGS: feature_flag.tags, + FeatureFlagConstants.LAST_MODIFIED: feature_flag.last_modified, + } + + if fields: + return {field: result[field] for field in fields if field in result} + + return result diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/tests/latest/recordings/test_azconfig_enhanced_feature.yaml b/src/azure-cli/azure/cli/command_modules/appconfig/tests/latest/recordings/test_azconfig_enhanced_feature.yaml new file mode 100644 index 00000000000..211f81bff45 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/appconfig/tests/latest/recordings/test_azconfig_enhanced_feature.yaml @@ -0,0 +1,1233 @@ +interactions: +- request: + body: '{"location": "eastus", "sku": {"name": "Standard"}, "properties": {"createMode": + "Default", "dataPlaneProxy": {}, "disableLocalAuth": true, "softDeleteRetentionInDays": + 1}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - appconfig create + Connection: + - keep-alive + Content-Length: + - '172' + Content-Type: + - application/json + ParameterSetName: + - -n -g -l --sku --retention-days --disable-local-auth + User-Agent: + - AZURECLI/2.90.0 azsdk-python-core/1.39.0 Python/3.12.10 (Windows-11-10.0.26200-SP0) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.AppConfiguration/configurationStores/enhancedfeature000002?api-version=2025-08-01-preview + response: + body: + string: '{"type": "Microsoft.AppConfiguration/configurationStores", "location": + "eastus", "properties": {"provisioningState": "Creating", "creationDate": + "2026-09-08T10:15:52.6935393+00:00", "endpoint": null, "encryption": null, + "privateEndpointConnections": null, "disableLocalAuth": null, "softDeleteRetentionInDays": + null, "defaultKeyValueRevisionRetentionPeriodInSeconds": null, "enablePurgeProtection": + null, "dataPlaneProxy": null, "telemetry": null, "azureFrontDoor": null}, + "sku": {"name": "Standard"}, "systemData": null, "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.AppConfiguration/configurationStores/enhancedfeature000002", + "name": "enhancedfeature000002", "tags": {}}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593527589627&c=MIIHlTCCBn2gAwIBAgIRAN0yZzL8aR42UZysboj3ciowDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgRVVTMiBDQSAwMTAeFw0yNjA4MTQwMDQwMTRaFw0yNzAyMDkwNjQwMTRaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzoSOkVR7MNj87TdZrq2tsL7eEWBZ1UxYUjlHs2t1x6Xn31o-6e5yM1I79Xw17HpG_ZRC01sH0DmLucuBF6EGQR50aTJ6mx22HrEe4YQhQiTieYabApNFEW7C1Z3sqhwTVaWGvV9-nw9anTx1HztS5s2jjMeJoebstq-wBIvYIOyM7hj12vYY5vdXTn9Sask3V8S3KBxdPpOFhQ5pKF6CgT-fQ9-scbzgeKeWuPXZTO0EeH02xAsj1c-lki5VGv0RewzD2beJxGO1-CxJFOfH9H3UnlZMKLg6kT-aBTn6RuYVuLJoMYYC-eHbYtahA3x5r3yutNG8gegIMlLlcdTGAQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQU7naFfTwmNksX70OjHOYQPsR55KIwHwYDVR0jBBgwFoAU_Ow-26p8H4IeBbihBvlD5wKzCrkwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NybHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS8zOS9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZWVhc3R1czJwa2kuZWFzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWVlYXN0dXMyaWNhMDEvMzkvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY2FjZXJ0cy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEAJrRoJWjIzsymA0Vpio4e2hRDOWlG5PpWmWos3Gflt8XcQwRsU-vvdeWk-uT-wHYn52846N5Ue5cbvM8NV-labOA852VL2mtuHnz7bkkRfWTlP-tB-JYDS8l0yGcTENq-UNlakbleLgtfD-Qr09l853jhegiUP3vJKLXMCFF1C2maSNhwZg1MlrEswNSPzRH0Xj9q0-487lH42RncuRXCIqd8ljf1_8v-IXMl6WtDdQDYjQE_s-OHN0BNXt0t4wTd5ikeG6NCH2SHC2wB-PchAiE5P4oHK6Vx3M0q3TEexP11Up6I9ksnpNBw256ZKPa0pX3urxLa215fDhtScA9RzA&s=yX035LGtPDJF5Nh3oInN8TUtcB77lTNmJ-VtQgCo4kH9TJkqb75n1QBEX3APS9AdY4b79UfHq2_o06lrg3IVhhaBjdwf1wHcu-ZXMrs9w96_ur2-ZFVrIBGRkZY-tWVZnfjzcdeZZzSMNomEwZKdgSWFw64vdj09NjX-q63D1iZgSD_KzgcjJAa8Zh4eaKm8va3Ruqsbv6nCa06kWqcqR1wyCQyuwdyXbkaj0_J2FJY5TviVEM56tz5BSMXCMcmgzUF5N2w9OohX03ASk-BYpN7QeG2TWdyl0uva5zr_-5ZM0kDbb9Re3B_oCp5W-j9U3tRyATgwJ8YKn2Xd3hVRCg&h=FX6FGlf51XERB_PNV6m8V_IEYzLWOEHddonStQlZOkw + cache-control: + - no-cache + content-length: + - '738' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:15:51 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47,objectId=43ddb22f-baef-4d3f-9e56-3a89871b9b59/eastus/500144fc-f5c7-4fa8-8179-6970daf85ab7 + x-ms-ratelimit-remaining-subscription-global-writes: + - '11999' + x-ms-ratelimit-remaining-subscription-writes: + - '799' + x-msedge-ref: + - 'Ref A: 03553DDCD29F4604A846A176A0C3DDC0 Ref B: VIEAA3060305051 Ref C: 2026-09-08T10:15:52Z' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - appconfig create + Connection: + - keep-alive + ParameterSetName: + - -n -g -l --sku --retention-days --disable-local-auth + User-Agent: + - AZURECLI/2.90.0 azsdk-python-core/1.39.0 Python/3.12.10 (Windows-11-10.0.26200-SP0) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593527589627&c=MIIHlTCCBn2gAwIBAgIRAN0yZzL8aR42UZysboj3ciowDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgRVVTMiBDQSAwMTAeFw0yNjA4MTQwMDQwMTRaFw0yNzAyMDkwNjQwMTRaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzoSOkVR7MNj87TdZrq2tsL7eEWBZ1UxYUjlHs2t1x6Xn31o-6e5yM1I79Xw17HpG_ZRC01sH0DmLucuBF6EGQR50aTJ6mx22HrEe4YQhQiTieYabApNFEW7C1Z3sqhwTVaWGvV9-nw9anTx1HztS5s2jjMeJoebstq-wBIvYIOyM7hj12vYY5vdXTn9Sask3V8S3KBxdPpOFhQ5pKF6CgT-fQ9-scbzgeKeWuPXZTO0EeH02xAsj1c-lki5VGv0RewzD2beJxGO1-CxJFOfH9H3UnlZMKLg6kT-aBTn6RuYVuLJoMYYC-eHbYtahA3x5r3yutNG8gegIMlLlcdTGAQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQU7naFfTwmNksX70OjHOYQPsR55KIwHwYDVR0jBBgwFoAU_Ow-26p8H4IeBbihBvlD5wKzCrkwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NybHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS8zOS9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZWVhc3R1czJwa2kuZWFzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWVlYXN0dXMyaWNhMDEvMzkvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY2FjZXJ0cy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEAJrRoJWjIzsymA0Vpio4e2hRDOWlG5PpWmWos3Gflt8XcQwRsU-vvdeWk-uT-wHYn52846N5Ue5cbvM8NV-labOA852VL2mtuHnz7bkkRfWTlP-tB-JYDS8l0yGcTENq-UNlakbleLgtfD-Qr09l853jhegiUP3vJKLXMCFF1C2maSNhwZg1MlrEswNSPzRH0Xj9q0-487lH42RncuRXCIqd8ljf1_8v-IXMl6WtDdQDYjQE_s-OHN0BNXt0t4wTd5ikeG6NCH2SHC2wB-PchAiE5P4oHK6Vx3M0q3TEexP11Up6I9ksnpNBw256ZKPa0pX3urxLa215fDhtScA9RzA&s=yX035LGtPDJF5Nh3oInN8TUtcB77lTNmJ-VtQgCo4kH9TJkqb75n1QBEX3APS9AdY4b79UfHq2_o06lrg3IVhhaBjdwf1wHcu-ZXMrs9w96_ur2-ZFVrIBGRkZY-tWVZnfjzcdeZZzSMNomEwZKdgSWFw64vdj09NjX-q63D1iZgSD_KzgcjJAa8Zh4eaKm8va3Ruqsbv6nCa06kWqcqR1wyCQyuwdyXbkaj0_J2FJY5TviVEM56tz5BSMXCMcmgzUF5N2w9OohX03ASk-BYpN7QeG2TWdyl0uva5zr_-5ZM0kDbb9Re3B_oCp5W-j9U3tRyATgwJ8YKn2Xd3hVRCg&h=FX6FGlf51XERB_PNV6m8V_IEYzLWOEHddonStQlZOkw + response: + body: + string: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo", + "name": "zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo", "status": "Creating", + "error": null}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593544327957&c=MIIHlDCCBnygAwIBAgIQeEidveEb90AyQzV3Vg_ZqzANBgkqhkiG9w0BAQsFADA2MTQwMgYDVQQDEytDQ01FIEcxIFRMUyBSU0EgMjA0OCBTSEEyNTYgMjA0OSBFVVMyIENBIDAxMB4XDTI2MDgxNDAyMjAwMFoXDTI3MDIwOTA4MjAwMFowQDE-MDwGA1UEAxM1YXN5bmNvcGVyYXRpb25zaWduaW5nY2VydGlmaWNhdGUubWFuYWdlbWVudC5henVyZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYxs1-79GYWLBbRPIjkwmCOuHul311U9QxeCklZJjzNEtw5oYC99Nn4o26HdePGYfCeWxFBBuTI_xU-6PRUWpPx24WQj3WYK8hqYdXcqL2q5tJcniwzbZRvtl3KSxJ5gDfK6mMoWo9Bnpbv0HAPf0rxJrvrjhxhxO2OuoocOrsBJD0GU6tj0AL9IyM2KqgqkjydjjlbyKdj5ydVbYsBSIY_fLPoyaJMgclHKrtffFIP37m_67StoFxvnXES6LfXhnjO7piUhHLZ3OgjUD0ujkwKp_TzEBZnCcjfHa7tw2logS-4_OqjgukICvKaH0guAbHU3odMES0Hne8iI23PN9hAgMBAAGjggSSMIIEjjCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwDAYDVR0TAQH_BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDgYDVR0PAQH_BAQDAgWgMB0GA1UdDgQWBBSLlzPAnD-FGNAB1-EkGmsJT_MwxzAfBgNVHSMEGDAWgBT87D7bqnwfgh4FuKEG-UPnArMKuTCCAbIGA1UdHwSCAakwggGlMGmgZ6BlhmNodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jcmxzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvMzMvY3VycmVudC5jcmwwa6BpoGeGZWh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzMzL2N1cnJlbnQuY3JsMFqgWKBWhlRodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jcmxzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvMzMvY3VycmVudC5jcmwwb6BtoGuGaWh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMS8zMy9jdXJyZW50LmNybDCCAbcGCCsGAQUFBwEBBIIBqTCCAaUwbAYIKwYBBQUHMAKGYGh0dHA6Ly9wcmltYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NhY2VydHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS9jZXJ0LmNlcjBuBggrBgEFBQcwAoZiaHR0cDovL3NlY29uZGFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwXQYIKwYBBQUHMAKGUWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9lYXN0dXMyL2NhY2VydHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS9jZXJ0LmNlcjBmBggrBgEFBQcwAoZaaHR0cDovL2NjbWVlYXN0dXMycGtpLmVhc3R1czIucGtpLmNvcmUud2luZG93cy5uZXQvY2VydGlmaWNhdGVBdXRob3JpdGllcy9jY21lZWFzdHVzMmljYTAxMA0GCSqGSIb3DQEBCwUAA4IBAQCFUdwB9UkyOPYGCRoKPKNoAL2NWGCqRS_DcylwcLIBC3_ZaaQQOYsdLw76zS1Ab1gVmnx3QzsOf3VAbZMYAeLIgiS3UQVlOBcDBWINNC5Gn5CcBhOsbw2C4-x9f6EiEQ7r4xvAdW0MzovTeYxie1KhshskO2UqymIklAVd2ygaIL2AlcTxnzffFHJQ2dY9CPVmRsbhoIJCya6FbQbGODxthCqapX2XAmdu-Em1VaO163PYTcwa_JjQraiHpBheSXgr_vioV3l_G32GIZoI_06-_lkGB9j0jMjaqy0ZzsbZtSu4zwnP28TrazrTy8wivHNsjrS6kYTALeY6lCPhYSH1&s=pEEnDgOuf5MPBP1QSv8HPLXFG7QMSlibU4n_MiwwaV4FTOW_laxYtx1zkds6eTR9ztvEU-GHBIHUGXNiWPp1sS9ojBXWyEB03H_N9WFWqAwiLwGAaAKT572HhKE_ABnxUAA-U6f9K25h0lFSNmZakqKCi76_f-awdzx2GYarJIFMpyiJJZCTBAwG-K5J4DC64CK5HPfHQ7fLAdh2Odfd5g6Jon4zx2NkUkTUUEF0Fnbqme7kaJczDKJIutNdMpfeL8gnns4_oxAT33kwER9dn-VNjEDcjx57ThXLvhBNquZujDh7ohbBrj88wnIVxL_X9XujiFYx050sCmz-cSerPw&h=2_jjIA0k-iSHlxdFOw8fP4GxS-2DTYNSq-y3UdmtGbE + cache-control: + - no-cache + content-length: + - '268' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:15:53 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47,objectId=43ddb22f-baef-4d3f-9e56-3a89871b9b59/westeurope/4a1d9450-43bb-4467-8516-ecba5a239fdb + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 48E94BC1A3A04C1396E4222F0D3A4F5B Ref B: VIEAA3060304029 Ref C: 2026-09-08T10:15:53Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - appconfig create + Connection: + - keep-alive + ParameterSetName: + - -n -g -l --sku --retention-days --disable-local-auth + User-Agent: + - AZURECLI/2.90.0 azsdk-python-core/1.39.0 Python/3.12.10 (Windows-11-10.0.26200-SP0) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593527589627&c=MIIHlTCCBn2gAwIBAgIRAN0yZzL8aR42UZysboj3ciowDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgRVVTMiBDQSAwMTAeFw0yNjA4MTQwMDQwMTRaFw0yNzAyMDkwNjQwMTRaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzoSOkVR7MNj87TdZrq2tsL7eEWBZ1UxYUjlHs2t1x6Xn31o-6e5yM1I79Xw17HpG_ZRC01sH0DmLucuBF6EGQR50aTJ6mx22HrEe4YQhQiTieYabApNFEW7C1Z3sqhwTVaWGvV9-nw9anTx1HztS5s2jjMeJoebstq-wBIvYIOyM7hj12vYY5vdXTn9Sask3V8S3KBxdPpOFhQ5pKF6CgT-fQ9-scbzgeKeWuPXZTO0EeH02xAsj1c-lki5VGv0RewzD2beJxGO1-CxJFOfH9H3UnlZMKLg6kT-aBTn6RuYVuLJoMYYC-eHbYtahA3x5r3yutNG8gegIMlLlcdTGAQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQU7naFfTwmNksX70OjHOYQPsR55KIwHwYDVR0jBBgwFoAU_Ow-26p8H4IeBbihBvlD5wKzCrkwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NybHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS8zOS9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZWVhc3R1czJwa2kuZWFzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWVlYXN0dXMyaWNhMDEvMzkvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY2FjZXJ0cy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEAJrRoJWjIzsymA0Vpio4e2hRDOWlG5PpWmWos3Gflt8XcQwRsU-vvdeWk-uT-wHYn52846N5Ue5cbvM8NV-labOA852VL2mtuHnz7bkkRfWTlP-tB-JYDS8l0yGcTENq-UNlakbleLgtfD-Qr09l853jhegiUP3vJKLXMCFF1C2maSNhwZg1MlrEswNSPzRH0Xj9q0-487lH42RncuRXCIqd8ljf1_8v-IXMl6WtDdQDYjQE_s-OHN0BNXt0t4wTd5ikeG6NCH2SHC2wB-PchAiE5P4oHK6Vx3M0q3TEexP11Up6I9ksnpNBw256ZKPa0pX3urxLa215fDhtScA9RzA&s=yX035LGtPDJF5Nh3oInN8TUtcB77lTNmJ-VtQgCo4kH9TJkqb75n1QBEX3APS9AdY4b79UfHq2_o06lrg3IVhhaBjdwf1wHcu-ZXMrs9w96_ur2-ZFVrIBGRkZY-tWVZnfjzcdeZZzSMNomEwZKdgSWFw64vdj09NjX-q63D1iZgSD_KzgcjJAa8Zh4eaKm8va3Ruqsbv6nCa06kWqcqR1wyCQyuwdyXbkaj0_J2FJY5TviVEM56tz5BSMXCMcmgzUF5N2w9OohX03ASk-BYpN7QeG2TWdyl0uva5zr_-5ZM0kDbb9Re3B_oCp5W-j9U3tRyATgwJ8YKn2Xd3hVRCg&h=FX6FGlf51XERB_PNV6m8V_IEYzLWOEHddonStQlZOkw + response: + body: + string: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo", + "name": "zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo", "status": "Creating", + "error": null}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593660526802&c=MIIHlDCCBnygAwIBAgIQeEidveEb90AyQzV3Vg_ZqzANBgkqhkiG9w0BAQsFADA2MTQwMgYDVQQDEytDQ01FIEcxIFRMUyBSU0EgMjA0OCBTSEEyNTYgMjA0OSBFVVMyIENBIDAxMB4XDTI2MDgxNDAyMjAwMFoXDTI3MDIwOTA4MjAwMFowQDE-MDwGA1UEAxM1YXN5bmNvcGVyYXRpb25zaWduaW5nY2VydGlmaWNhdGUubWFuYWdlbWVudC5henVyZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYxs1-79GYWLBbRPIjkwmCOuHul311U9QxeCklZJjzNEtw5oYC99Nn4o26HdePGYfCeWxFBBuTI_xU-6PRUWpPx24WQj3WYK8hqYdXcqL2q5tJcniwzbZRvtl3KSxJ5gDfK6mMoWo9Bnpbv0HAPf0rxJrvrjhxhxO2OuoocOrsBJD0GU6tj0AL9IyM2KqgqkjydjjlbyKdj5ydVbYsBSIY_fLPoyaJMgclHKrtffFIP37m_67StoFxvnXES6LfXhnjO7piUhHLZ3OgjUD0ujkwKp_TzEBZnCcjfHa7tw2logS-4_OqjgukICvKaH0guAbHU3odMES0Hne8iI23PN9hAgMBAAGjggSSMIIEjjCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwDAYDVR0TAQH_BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDgYDVR0PAQH_BAQDAgWgMB0GA1UdDgQWBBSLlzPAnD-FGNAB1-EkGmsJT_MwxzAfBgNVHSMEGDAWgBT87D7bqnwfgh4FuKEG-UPnArMKuTCCAbIGA1UdHwSCAakwggGlMGmgZ6BlhmNodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jcmxzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvMzMvY3VycmVudC5jcmwwa6BpoGeGZWh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzMzL2N1cnJlbnQuY3JsMFqgWKBWhlRodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jcmxzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvMzMvY3VycmVudC5jcmwwb6BtoGuGaWh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMS8zMy9jdXJyZW50LmNybDCCAbcGCCsGAQUFBwEBBIIBqTCCAaUwbAYIKwYBBQUHMAKGYGh0dHA6Ly9wcmltYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NhY2VydHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS9jZXJ0LmNlcjBuBggrBgEFBQcwAoZiaHR0cDovL3NlY29uZGFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwXQYIKwYBBQUHMAKGUWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9lYXN0dXMyL2NhY2VydHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS9jZXJ0LmNlcjBmBggrBgEFBQcwAoZaaHR0cDovL2NjbWVlYXN0dXMycGtpLmVhc3R1czIucGtpLmNvcmUud2luZG93cy5uZXQvY2VydGlmaWNhdGVBdXRob3JpdGllcy9jY21lZWFzdHVzMmljYTAxMA0GCSqGSIb3DQEBCwUAA4IBAQCFUdwB9UkyOPYGCRoKPKNoAL2NWGCqRS_DcylwcLIBC3_ZaaQQOYsdLw76zS1Ab1gVmnx3QzsOf3VAbZMYAeLIgiS3UQVlOBcDBWINNC5Gn5CcBhOsbw2C4-x9f6EiEQ7r4xvAdW0MzovTeYxie1KhshskO2UqymIklAVd2ygaIL2AlcTxnzffFHJQ2dY9CPVmRsbhoIJCya6FbQbGODxthCqapX2XAmdu-Em1VaO163PYTcwa_JjQraiHpBheSXgr_vioV3l_G32GIZoI_06-_lkGB9j0jMjaqy0ZzsbZtSu4zwnP28TrazrTy8wivHNsjrS6kYTALeY6lCPhYSH1&s=0NyU91Jq5OwujhDhSvhL8pVAbBc2UfgDOfKt8pWvLFeCYXImr7MeHlSOX5DXAuOl4lsgb8-8BQDBjuO6QCAS-ow3w_XKSc2pMBRMCthqdOjxVlHm-iVCX7EoLTJI2Iwt43eKZzzyTj0ZP61sYCSotMqxk9uNnzQCCv7rUPO_mNoUbsVOEAywFjQ1I9DdtWGgFD4P_CR0C0nU91jED8xZvS_sjFhVuRz0JEJuYnZ4zaBmosKoQVytCfYYiLScmO4fGbt0auLoERaPR6U1F1C108ulP4AVsr4112ICtnnfK-N-QbEJtulz_kG4XEgXhZ2bJY4CMsT4fnSwyHh8qZop-Q&h=yNUBZkaKwyWOUjVfp1r7fA8BOipw8s7vhSnnHibPqgw + cache-control: + - no-cache + content-length: + - '268' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:05 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47,objectId=43ddb22f-baef-4d3f-9e56-3a89871b9b59/westeurope/b0fad1ee-3c97-4f88-af29-e70f94f928b1 + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: EE215661146044B2A79B84180B771557 Ref B: VIEAA3060304033 Ref C: 2026-09-08T10:16:05Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - appconfig create + Connection: + - keep-alive + ParameterSetName: + - -n -g -l --sku --retention-days --disable-local-auth + User-Agent: + - AZURECLI/2.90.0 azsdk-python-core/1.39.0 Python/3.12.10 (Windows-11-10.0.26200-SP0) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593527589627&c=MIIHlTCCBn2gAwIBAgIRAN0yZzL8aR42UZysboj3ciowDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgRVVTMiBDQSAwMTAeFw0yNjA4MTQwMDQwMTRaFw0yNzAyMDkwNjQwMTRaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzoSOkVR7MNj87TdZrq2tsL7eEWBZ1UxYUjlHs2t1x6Xn31o-6e5yM1I79Xw17HpG_ZRC01sH0DmLucuBF6EGQR50aTJ6mx22HrEe4YQhQiTieYabApNFEW7C1Z3sqhwTVaWGvV9-nw9anTx1HztS5s2jjMeJoebstq-wBIvYIOyM7hj12vYY5vdXTn9Sask3V8S3KBxdPpOFhQ5pKF6CgT-fQ9-scbzgeKeWuPXZTO0EeH02xAsj1c-lki5VGv0RewzD2beJxGO1-CxJFOfH9H3UnlZMKLg6kT-aBTn6RuYVuLJoMYYC-eHbYtahA3x5r3yutNG8gegIMlLlcdTGAQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQU7naFfTwmNksX70OjHOYQPsR55KIwHwYDVR0jBBgwFoAU_Ow-26p8H4IeBbihBvlD5wKzCrkwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NybHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS8zOS9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZWVhc3R1czJwa2kuZWFzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWVlYXN0dXMyaWNhMDEvMzkvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY2FjZXJ0cy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEAJrRoJWjIzsymA0Vpio4e2hRDOWlG5PpWmWos3Gflt8XcQwRsU-vvdeWk-uT-wHYn52846N5Ue5cbvM8NV-labOA852VL2mtuHnz7bkkRfWTlP-tB-JYDS8l0yGcTENq-UNlakbleLgtfD-Qr09l853jhegiUP3vJKLXMCFF1C2maSNhwZg1MlrEswNSPzRH0Xj9q0-487lH42RncuRXCIqd8ljf1_8v-IXMl6WtDdQDYjQE_s-OHN0BNXt0t4wTd5ikeG6NCH2SHC2wB-PchAiE5P4oHK6Vx3M0q3TEexP11Up6I9ksnpNBw256ZKPa0pX3urxLa215fDhtScA9RzA&s=yX035LGtPDJF5Nh3oInN8TUtcB77lTNmJ-VtQgCo4kH9TJkqb75n1QBEX3APS9AdY4b79UfHq2_o06lrg3IVhhaBjdwf1wHcu-ZXMrs9w96_ur2-ZFVrIBGRkZY-tWVZnfjzcdeZZzSMNomEwZKdgSWFw64vdj09NjX-q63D1iZgSD_KzgcjJAa8Zh4eaKm8va3Ruqsbv6nCa06kWqcqR1wyCQyuwdyXbkaj0_J2FJY5TviVEM56tz5BSMXCMcmgzUF5N2w9OohX03ASk-BYpN7QeG2TWdyl0uva5zr_-5ZM0kDbb9Re3B_oCp5W-j9U3tRyATgwJ8YKn2Xd3hVRCg&h=FX6FGlf51XERB_PNV6m8V_IEYzLWOEHddonStQlZOkw + response: + body: + string: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo", + "name": "zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo", "status": "Creating", + "error": null}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593774677876&c=MIIHlDCCBnygAwIBAgIQeEidveEb90AyQzV3Vg_ZqzANBgkqhkiG9w0BAQsFADA2MTQwMgYDVQQDEytDQ01FIEcxIFRMUyBSU0EgMjA0OCBTSEEyNTYgMjA0OSBFVVMyIENBIDAxMB4XDTI2MDgxNDAyMjAwMFoXDTI3MDIwOTA4MjAwMFowQDE-MDwGA1UEAxM1YXN5bmNvcGVyYXRpb25zaWduaW5nY2VydGlmaWNhdGUubWFuYWdlbWVudC5henVyZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYxs1-79GYWLBbRPIjkwmCOuHul311U9QxeCklZJjzNEtw5oYC99Nn4o26HdePGYfCeWxFBBuTI_xU-6PRUWpPx24WQj3WYK8hqYdXcqL2q5tJcniwzbZRvtl3KSxJ5gDfK6mMoWo9Bnpbv0HAPf0rxJrvrjhxhxO2OuoocOrsBJD0GU6tj0AL9IyM2KqgqkjydjjlbyKdj5ydVbYsBSIY_fLPoyaJMgclHKrtffFIP37m_67StoFxvnXES6LfXhnjO7piUhHLZ3OgjUD0ujkwKp_TzEBZnCcjfHa7tw2logS-4_OqjgukICvKaH0guAbHU3odMES0Hne8iI23PN9hAgMBAAGjggSSMIIEjjCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwDAYDVR0TAQH_BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDgYDVR0PAQH_BAQDAgWgMB0GA1UdDgQWBBSLlzPAnD-FGNAB1-EkGmsJT_MwxzAfBgNVHSMEGDAWgBT87D7bqnwfgh4FuKEG-UPnArMKuTCCAbIGA1UdHwSCAakwggGlMGmgZ6BlhmNodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jcmxzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvMzMvY3VycmVudC5jcmwwa6BpoGeGZWh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzMzL2N1cnJlbnQuY3JsMFqgWKBWhlRodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jcmxzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvMzMvY3VycmVudC5jcmwwb6BtoGuGaWh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMS8zMy9jdXJyZW50LmNybDCCAbcGCCsGAQUFBwEBBIIBqTCCAaUwbAYIKwYBBQUHMAKGYGh0dHA6Ly9wcmltYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NhY2VydHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS9jZXJ0LmNlcjBuBggrBgEFBQcwAoZiaHR0cDovL3NlY29uZGFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwXQYIKwYBBQUHMAKGUWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9lYXN0dXMyL2NhY2VydHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS9jZXJ0LmNlcjBmBggrBgEFBQcwAoZaaHR0cDovL2NjbWVlYXN0dXMycGtpLmVhc3R1czIucGtpLmNvcmUud2luZG93cy5uZXQvY2VydGlmaWNhdGVBdXRob3JpdGllcy9jY21lZWFzdHVzMmljYTAxMA0GCSqGSIb3DQEBCwUAA4IBAQCFUdwB9UkyOPYGCRoKPKNoAL2NWGCqRS_DcylwcLIBC3_ZaaQQOYsdLw76zS1Ab1gVmnx3QzsOf3VAbZMYAeLIgiS3UQVlOBcDBWINNC5Gn5CcBhOsbw2C4-x9f6EiEQ7r4xvAdW0MzovTeYxie1KhshskO2UqymIklAVd2ygaIL2AlcTxnzffFHJQ2dY9CPVmRsbhoIJCya6FbQbGODxthCqapX2XAmdu-Em1VaO163PYTcwa_JjQraiHpBheSXgr_vioV3l_G32GIZoI_06-_lkGB9j0jMjaqy0ZzsbZtSu4zwnP28TrazrTy8wivHNsjrS6kYTALeY6lCPhYSH1&s=Qf_e5lsCF9eKJK6_bBybE-031AZl005b-BNQn8wTfoBY4RVhiTxPebsGOXG1Bk4QBdUMBcGnI5Rs934zvC6HpjixBvwNmKXMcoynAL0gf6UdNtK8SsTBTu3F6rFMbTtTJzOXS9BbsRzFcK5Bz5-FBYvaY30evICocgw-SUh3ABTx0fGmsRGtfb5EVtNW0sqGs1Ac5C0sFPj69D_O1K5-ABf_qgk5Iktsrj-Gs5Vvx_zMGPZ62OVfdfP7_PpypJ-X8Kd7zLZiXKPd2dio-i_HK8WyWmrIeuZE_jnVyJ2kLWrfWLFZc-0jr87mh1q_2hVQu_6l_7ujeKqdOngXmIm80Q&h=SxoY3BUEWiWGcmEoFkE881qT8fjLlvmktByIuVxt0Zc + cache-control: + - no-cache + content-length: + - '268' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:16 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47,objectId=43ddb22f-baef-4d3f-9e56-3a89871b9b59/westeurope/5f768fb1-cf72-4954-9f30-5384c081485b + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: EBC3ABE994D043989908AB8DCD75A189 Ref B: VIEAA3060306027 Ref C: 2026-09-08T10:16:16Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - appconfig create + Connection: + - keep-alive + ParameterSetName: + - -n -g -l --sku --retention-days --disable-local-auth + User-Agent: + - AZURECLI/2.90.0 azsdk-python-core/1.39.0 Python/3.12.10 (Windows-11-10.0.26200-SP0) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593527589627&c=MIIHlTCCBn2gAwIBAgIRAN0yZzL8aR42UZysboj3ciowDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgRVVTMiBDQSAwMTAeFw0yNjA4MTQwMDQwMTRaFw0yNzAyMDkwNjQwMTRaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzoSOkVR7MNj87TdZrq2tsL7eEWBZ1UxYUjlHs2t1x6Xn31o-6e5yM1I79Xw17HpG_ZRC01sH0DmLucuBF6EGQR50aTJ6mx22HrEe4YQhQiTieYabApNFEW7C1Z3sqhwTVaWGvV9-nw9anTx1HztS5s2jjMeJoebstq-wBIvYIOyM7hj12vYY5vdXTn9Sask3V8S3KBxdPpOFhQ5pKF6CgT-fQ9-scbzgeKeWuPXZTO0EeH02xAsj1c-lki5VGv0RewzD2beJxGO1-CxJFOfH9H3UnlZMKLg6kT-aBTn6RuYVuLJoMYYC-eHbYtahA3x5r3yutNG8gegIMlLlcdTGAQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQU7naFfTwmNksX70OjHOYQPsR55KIwHwYDVR0jBBgwFoAU_Ow-26p8H4IeBbihBvlD5wKzCrkwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NybHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS8zOS9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzM5L2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZWVhc3R1czJwa2kuZWFzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWVlYXN0dXMyaWNhMDEvMzkvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY2FjZXJ0cy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEAJrRoJWjIzsymA0Vpio4e2hRDOWlG5PpWmWos3Gflt8XcQwRsU-vvdeWk-uT-wHYn52846N5Ue5cbvM8NV-labOA852VL2mtuHnz7bkkRfWTlP-tB-JYDS8l0yGcTENq-UNlakbleLgtfD-Qr09l853jhegiUP3vJKLXMCFF1C2maSNhwZg1MlrEswNSPzRH0Xj9q0-487lH42RncuRXCIqd8ljf1_8v-IXMl6WtDdQDYjQE_s-OHN0BNXt0t4wTd5ikeG6NCH2SHC2wB-PchAiE5P4oHK6Vx3M0q3TEexP11Up6I9ksnpNBw256ZKPa0pX3urxLa215fDhtScA9RzA&s=yX035LGtPDJF5Nh3oInN8TUtcB77lTNmJ-VtQgCo4kH9TJkqb75n1QBEX3APS9AdY4b79UfHq2_o06lrg3IVhhaBjdwf1wHcu-ZXMrs9w96_ur2-ZFVrIBGRkZY-tWVZnfjzcdeZZzSMNomEwZKdgSWFw64vdj09NjX-q63D1iZgSD_KzgcjJAa8Zh4eaKm8va3Ruqsbv6nCa06kWqcqR1wyCQyuwdyXbkaj0_J2FJY5TviVEM56tz5BSMXCMcmgzUF5N2w9OohX03ASk-BYpN7QeG2TWdyl0uva5zr_-5ZM0kDbb9Re3B_oCp5W-j9U3tRyATgwJ8YKn2Xd3hVRCg&h=FX6FGlf51XERB_PNV6m8V_IEYzLWOEHddonStQlZOkw + response: + body: + string: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo", + "name": "zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo", "status": "Succeeded", + "error": null}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.zXon2rpNaXroX-cOsztkUQpti3FUIaGKUA4EG1WDWgo?api-version=2025-08-01-preview&t=639244593888417875&c=MIIHlDCCBnygAwIBAgIQeEidveEb90AyQzV3Vg_ZqzANBgkqhkiG9w0BAQsFADA2MTQwMgYDVQQDEytDQ01FIEcxIFRMUyBSU0EgMjA0OCBTSEEyNTYgMjA0OSBFVVMyIENBIDAxMB4XDTI2MDgxNDAyMjAwMFoXDTI3MDIwOTA4MjAwMFowQDE-MDwGA1UEAxM1YXN5bmNvcGVyYXRpb25zaWduaW5nY2VydGlmaWNhdGUubWFuYWdlbWVudC5henVyZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYxs1-79GYWLBbRPIjkwmCOuHul311U9QxeCklZJjzNEtw5oYC99Nn4o26HdePGYfCeWxFBBuTI_xU-6PRUWpPx24WQj3WYK8hqYdXcqL2q5tJcniwzbZRvtl3KSxJ5gDfK6mMoWo9Bnpbv0HAPf0rxJrvrjhxhxO2OuoocOrsBJD0GU6tj0AL9IyM2KqgqkjydjjlbyKdj5ydVbYsBSIY_fLPoyaJMgclHKrtffFIP37m_67StoFxvnXES6LfXhnjO7piUhHLZ3OgjUD0ujkwKp_TzEBZnCcjfHa7tw2logS-4_OqjgukICvKaH0guAbHU3odMES0Hne8iI23PN9hAgMBAAGjggSSMIIEjjCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwDAYDVR0TAQH_BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDgYDVR0PAQH_BAQDAgWgMB0GA1UdDgQWBBSLlzPAnD-FGNAB1-EkGmsJT_MwxzAfBgNVHSMEGDAWgBT87D7bqnwfgh4FuKEG-UPnArMKuTCCAbIGA1UdHwSCAakwggGlMGmgZ6BlhmNodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jcmxzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvMzMvY3VycmVudC5jcmwwa6BpoGeGZWh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L2Vhc3R1czIvY3Jscy9jY21lZWFzdHVzMnBraS9jY21lZWFzdHVzMmljYTAxLzMzL2N1cnJlbnQuY3JsMFqgWKBWhlRodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vZWFzdHVzMi9jcmxzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvMzMvY3VycmVudC5jcmwwb6BtoGuGaWh0dHA6Ly9jY21lZWFzdHVzMnBraS5lYXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZWVhc3R1czJpY2EwMS8zMy9jdXJyZW50LmNybDCCAbcGCCsGAQUFBwEBBIIBqTCCAaUwbAYIKwYBBQUHMAKGYGh0dHA6Ly9wcmltYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC9lYXN0dXMyL2NhY2VydHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS9jZXJ0LmNlcjBuBggrBgEFBQcwAoZiaHR0cDovL3NlY29uZGFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvZWFzdHVzMi9jYWNlcnRzL2NjbWVlYXN0dXMycGtpL2NjbWVlYXN0dXMyaWNhMDEvY2VydC5jZXIwXQYIKwYBBQUHMAKGUWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9lYXN0dXMyL2NhY2VydHMvY2NtZWVhc3R1czJwa2kvY2NtZWVhc3R1czJpY2EwMS9jZXJ0LmNlcjBmBggrBgEFBQcwAoZaaHR0cDovL2NjbWVlYXN0dXMycGtpLmVhc3R1czIucGtpLmNvcmUud2luZG93cy5uZXQvY2VydGlmaWNhdGVBdXRob3JpdGllcy9jY21lZWFzdHVzMmljYTAxMA0GCSqGSIb3DQEBCwUAA4IBAQCFUdwB9UkyOPYGCRoKPKNoAL2NWGCqRS_DcylwcLIBC3_ZaaQQOYsdLw76zS1Ab1gVmnx3QzsOf3VAbZMYAeLIgiS3UQVlOBcDBWINNC5Gn5CcBhOsbw2C4-x9f6EiEQ7r4xvAdW0MzovTeYxie1KhshskO2UqymIklAVd2ygaIL2AlcTxnzffFHJQ2dY9CPVmRsbhoIJCya6FbQbGODxthCqapX2XAmdu-Em1VaO163PYTcwa_JjQraiHpBheSXgr_vioV3l_G32GIZoI_06-_lkGB9j0jMjaqy0ZzsbZtSu4zwnP28TrazrTy8wivHNsjrS6kYTALeY6lCPhYSH1&s=l2hY8F1Sib-ezy62lUcGXJ8AqZzVetsLEZ6DnaqU4jfOX0kwJdfR2baAQ3-t2rV7hZqAuEyjyPrgD8wpp4v7Yonc_hoC4a41Nufd98M46tSygaYsetkjYmgj1YBFH3jqw2itWwxAHBKlUXym9DW5qaJ5lYwaD_SpNl9GNMsBX0fCU1qi3GQPWyIHl4E3Mxbbc8o9aioYmK8ecRHvnn38e5Lnw69NdKBV0USXzRMfKfHQH2dUduf4LnO7cVFrwhDt309RLSjGDZB5iCm23nOcpqRdNXoAZ95TMpH4RnQ42I6Xlngj1_WiCTZ_FQOCAxujEDcHZGf1oqR1YtlRHfOkmA&h=ZzzEH7w4Hl2G10JFVVyHdtgiaDOfaxyhGyW05vXzKwc + cache-control: + - no-cache + content-length: + - '269' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:27 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47,objectId=43ddb22f-baef-4d3f-9e56-3a89871b9b59/westeurope/8a6dd5f9-8e7a-4275-92d7-3b086febe760 + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: B0303EF5E49C480CAC97CBC08E11FB46 Ref B: AMS231022012019 Ref C: 2026-09-08T10:16:28Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - appconfig create + Connection: + - keep-alive + ParameterSetName: + - -n -g -l --sku --retention-days --disable-local-auth + User-Agent: + - AZURECLI/2.90.0 azsdk-python-core/1.39.0 Python/3.12.10 (Windows-11-10.0.26200-SP0) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.AppConfiguration/configurationStores/enhancedfeature000002?api-version=2025-08-01-preview + response: + body: + string: '{"type": "Microsoft.AppConfiguration/configurationStores", "location": + "eastus", "properties": {"provisioningState": "Succeeded", "creationDate": + "2026-09-08T10:15:52+00:00", "endpoint": "https://enhancedfeature000002.azconfig.io", + "encryption": {"keyVaultProperties": null}, "privateEndpointConnections": + null, "disableLocalAuth": true, "softDeleteRetentionInDays": 1, "defaultKeyValueRevisionRetentionPeriodInSeconds": + 2592000, "enablePurgeProtection": false, "dataPlaneProxy": {"authenticationMode": + "Local", "privateLinkDelegation": "Disabled"}, "telemetry": {"resourceId": + null}, "azureFrontDoor": {"resourceId": null}}, "sku": {"name": "standard"}, + "systemData": {"createdBy": "test@example.com", "createdByType": "User", "createdAt": + "2026-09-08T10:15:52+00:00", "lastModifiedBy": "test@example.com", "lastModifiedByType": + "User", "lastModifiedAt": "2026-09-08T10:15:52+00:00"}, "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.AppConfiguration/configurationStores/enhancedfeature000002", + "name": "enhancedfeature000002", "tags": {}}' + headers: + cache-control: + - no-cache + content-length: + - '1102' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:29 GMT + etag: + - '"1f064da9-0000-0100-0000-6a9fe0590000"' + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: F4AF86AB98024350B26BFB6BD0E5DBFE Ref B: VIEAA3060307025 Ref C: 2026-09-08T10:16:29Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-length: + - '0' + date: + - Tue, 08 Sep 2026 10:16:32 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTE1;sn=6915 + x-ms-date: + - Tue, 08 Sep 2026 10:16:32 GMT + status: + code: 404 + message: Not Found +- request: + body: '{"enabled": false, "tags": {}}' + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '30' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + Sync-Token: + - dyZf1=NzotMSM2OTE1 + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: PUT + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "pxLfcI6mo9zA053P7SaCHe5zPySKYyku_cakPnstBjI", "name": "Beta", + "label": "v1", "enabled": false, "description": null, "variants": [], "allocation": + null, "conditions": null, "telemetry": null, "tags": {}, "last_modified": + "2026-09-08T10:16:32+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:32 GMT + etag: + - '"pxLfcI6mo9zA053P7SaCHe5zPySKYyku_cakPnstBjI"' + last-modified: + - Tue, 08 Sep 2026 10:16:32 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTE2;sn=6916 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:32 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "pxLfcI6mo9zA053P7SaCHe5zPySKYyku_cakPnstBjI", "name": "Beta", + "label": "v1", "enabled": false, "description": null, "variants": [], "allocation": + null, "conditions": null, "telemetry": null, "tags": {}, "last_modified": + "2026-09-08T10:16:32+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:33 GMT + etag: + - '"pxLfcI6mo9zA053P7SaCHe5zPySKYyku_cakPnstBjI"' + last-modified: + - Tue, 08 Sep 2026 10:16:32 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTE2;sn=6916 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:33 GMT + status: + code: 200 + message: OK +- request: + body: '{"enabled": false, "description": "Beta Testing Feature Flag", "conditions": + {"requirement_type": "Any"}, "variants": [], "tags": {}}' + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '133' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + Sync-Token: + - dyZf1=NzotMSM2OTE2 + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: PUT + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "dqD0bpKGEkFM81FUSoDJDAcQC4B5MvkuVijKgNk_UCA", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-09-08T10:16:34+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:34 GMT + etag: + - '"dqD0bpKGEkFM81FUSoDJDAcQC4B5MvkuVijKgNk_UCA"' + last-modified: + - Tue, 08 Sep 2026 10:16:34 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTE3;sn=6917 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:34 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "dqD0bpKGEkFM81FUSoDJDAcQC4B5MvkuVijKgNk_UCA", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-09-08T10:16:34+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:35 GMT + etag: + - '"dqD0bpKGEkFM81FUSoDJDAcQC4B5MvkuVijKgNk_UCA"' + last-modified: + - Tue, 08 Sep 2026 10:16:34 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTE4;sn=6918 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:35 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "dqD0bpKGEkFM81FUSoDJDAcQC4B5MvkuVijKgNk_UCA", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-09-08T10:16:34+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:35 GMT + etag: + - '"dqD0bpKGEkFM81FUSoDJDAcQC4B5MvkuVijKgNk_UCA"' + last-modified: + - Tue, 08 Sep 2026 10:16:34 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTE4;sn=6918 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:35 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "dqD0bpKGEkFM81FUSoDJDAcQC4B5MvkuVijKgNk_UCA", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-09-08T10:16:34+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:36 GMT + etag: + - '"dqD0bpKGEkFM81FUSoDJDAcQC4B5MvkuVijKgNk_UCA"' + last-modified: + - Tue, 08 Sep 2026 10:16:34 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTE4;sn=6918 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:36 GMT + status: + code: 200 + message: OK +- request: + body: '{"enabled": true, "description": "Beta Testing Feature Flag", "conditions": + {"requirement_type": "Any"}, "variants": [], "tags": {}}' + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '132' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + Sync-Token: + - dyZf1=NzotMSM2OTE4 + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: PUT + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "_WvUQv39yyzQoR2OKcosWfJBu47KqhTZY8FfvNz69J0", "name": "Beta", + "label": "v1", "enabled": true, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-09-08T10:16:37+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:37 GMT + etag: + - '"_WvUQv39yyzQoR2OKcosWfJBu47KqhTZY8FfvNz69J0"' + last-modified: + - Tue, 08 Sep 2026 10:16:37 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTE5;sn=6919 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:37 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "_WvUQv39yyzQoR2OKcosWfJBu47KqhTZY8FfvNz69J0", "name": "Beta", + "label": "v1", "enabled": true, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-09-08T10:16:37+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:38 GMT + etag: + - '"_WvUQv39yyzQoR2OKcosWfJBu47KqhTZY8FfvNz69J0"' + last-modified: + - Tue, 08 Sep 2026 10:16:37 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTIw;sn=6920 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:38 GMT + status: + code: 200 + message: OK +- request: + body: '{"enabled": true, "description": "Beta Testing Feature Flag", "conditions": + {"requirement_type": "Any"}, "variants": [], "telemetry": {"enabled": true}, + "tags": {"tag1": "value1", "tag2": "value2"}}' + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '198' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + Sync-Token: + - dyZf1=NzotMSM2OTIw + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: PUT + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "hRgHPsnnzF4wtK6RlZK2auzpAKwhpGWnF_qebhu7X8M", "name": "Beta", + "label": "v1", "enabled": true, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": {"enabled": true, "metadata": {}}, "tags": {"tag1": "value1", + "tag2": "value2"}, "last_modified": "2026-09-08T10:16:38+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:38 GMT + etag: + - '"hRgHPsnnzF4wtK6RlZK2auzpAKwhpGWnF_qebhu7X8M"' + last-modified: + - Tue, 08 Sep 2026 10:16:38 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTIx;sn=6921 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:38 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "hRgHPsnnzF4wtK6RlZK2auzpAKwhpGWnF_qebhu7X8M", "name": "Beta", + "label": "v1", "enabled": true, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": {"enabled": true, "metadata": {}}, "tags": {"tag1": "value1", + "tag2": "value2"}, "last_modified": "2026-09-08T10:16:38+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:39 GMT + etag: + - '"hRgHPsnnzF4wtK6RlZK2auzpAKwhpGWnF_qebhu7X8M"' + last-modified: + - Tue, 08 Sep 2026 10:16:38 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTIy;sn=6922 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:39 GMT + status: + code: 200 + message: OK +- request: + body: '{"enabled": false, "description": "Beta Testing Feature Flag", "conditions": + {"requirement_type": "Any"}, "variants": [], "telemetry": {"enabled": true, + "metadata": {}}, "tags": {"tag1": "value1", "tag2": "value2"}}' + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '215' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + Sync-Token: + - dyZf1=NzotMSM2OTIy + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: PUT + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "EBEiUslkIyQZDWgOI5m03I4p73ybvmH3fhcRci51m8Y", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": {"enabled": true, "metadata": {}}, "tags": {"tag1": "value1", + "tag2": "value2"}, "last_modified": "2026-09-08T10:16:40+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:40 GMT + etag: + - '"EBEiUslkIyQZDWgOI5m03I4p73ybvmH3fhcRci51m8Y"' + last-modified: + - Tue, 08 Sep 2026 10:16:40 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTIz;sn=6923 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:40 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ffset";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff?api-version=2026-05-01-preview + response: + body: + string: '{"etag": "h56qYo-HMS_bwomF0nZThK19M7GbpJlOUYlHvLS-UWw", "items": [{"etag": + "EBEiUslkIyQZDWgOI5m03I4p73ybvmH3fhcRci51m8Y", "name": "Beta", "label": "v1", + "enabled": false, "description": "Beta Testing Feature Flag", "variants": + [], "allocation": null, "conditions": {"requirement_type": "Any"}, "telemetry": + {"enabled": true, "metadata": {}}, "tags": {"tag1": "value1", "tag2": "value2"}, + "last_modified": "2026-09-08T10:16:40+00:00"}]}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ffset"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:41 GMT + etag: + - '"h56qYo-HMS_bwomF0nZThK19M7GbpJlOUYlHvLS-UWw"' + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTI0;sn=6924 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:41 GMT + x-ms-item-count: + - '1' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "EBEiUslkIyQZDWgOI5m03I4p73ybvmH3fhcRci51m8Y", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": {"enabled": true, "metadata": {}}, "tags": {"tag1": "value1", + "tag2": "value2"}, "last_modified": "2026-09-08T10:16:40+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:42 GMT + etag: + - '"EBEiUslkIyQZDWgOI5m03I4p73ybvmH3fhcRci51m8Y"' + last-modified: + - Tue, 08 Sep 2026 10:16:40 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTI0;sn=6924 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:42 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Sync-Token: + - dyZf1=NzotMSM2OTI0 + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: DELETE + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '{"etag": "EBEiUslkIyQZDWgOI5m03I4p73ybvmH3fhcRci51m8Y", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": {"enabled": true, "metadata": {}}, "tags": {"tag1": "value1", + "tag2": "value2"}, "last_modified": "2026-09-08T10:16:40+00:00"}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ff"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:42 GMT + etag: + - '"EBEiUslkIyQZDWgOI5m03I4p73ybvmH3fhcRci51m8Y"' + last-modified: + - Tue, 08 Sep 2026 10:16:40 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTI1;sn=6925 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:42 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ffset";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff?api-version=2026-05-01-preview + response: + body: + string: '{"etag": "oIiYybBKOJkhO4-JNQpPcUeed073Y5rY5FTb4e0GksU", "items": []}' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-type: + - application/json; profile="https://azconfig.io/mime-profiles/ffset"; charset=utf-8 + date: + - Tue, 08 Sep 2026 10:16:43 GMT + etag: + - '"oIiYybBKOJkhO4-JNQpPcUeed073Y5rY5FTb4e0GksU"' + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTI1;sn=6925 + transfer-encoding: + - chunked + x-ms-date: + - Tue, 08 Sep 2026 10:16:43 GMT + x-ms-item-count: + - '0' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-length: + - '0' + date: + - Tue, 08 Sep 2026 10:16:44 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTI1;sn=6925 + x-ms-date: + - Tue, 08 Sep 2026 10:16:44 GMT + status: + code: 404 + message: Not Found +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-length: + - '0' + date: + - Tue, 08 Sep 2026 10:16:44 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTI1;sn=6925 + x-ms-date: + - Tue, 08 Sep 2026 10:16:44 GMT + status: + code: 404 + message: Not Found +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-length: + - '0' + date: + - Tue, 08 Sep 2026 10:16:45 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTI1;sn=6925 + x-ms-date: + - Tue, 08 Sep 2026 10:16:45 GMT + status: + code: 404 + message: Not Found +- request: + body: null + headers: + Accept: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8, + application/problem+json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - AZURECLI.APPCONFIG/2.90.0 azsdk-python-appconfiguration/1.0.0b1 Python/3.12.10 + (Windows-11-10.0.26200-SP0) + method: GET + uri: https://enhancedfeature000002.azconfig.io/ff/Beta?api-version=2026-05-01-preview&label=v1 + response: + body: + string: '' + headers: + access-control-allow-origin: + - '*' + connection: + - keep-alive + content-length: + - '0' + date: + - Tue, 08 Sep 2026 10:16:46 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSM2OTI1;sn=6925 + x-ms-date: + - Tue, 08 Sep 2026 10:16:46 GMT + status: + code: 404 + message: Not Found +version: 1 diff --git a/src/azure-cli/azure/cli/command_modules/appconfig/tests/latest/test_appconfig_enhanced_feature_commands.py b/src/azure-cli/azure/cli/command_modules/appconfig/tests/latest/test_appconfig_enhanced_feature_commands.py new file mode 100644 index 00000000000..12ab654adb2 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/appconfig/tests/latest/test_appconfig_enhanced_feature_commands.py @@ -0,0 +1,129 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import os + +from azure.cli.testsdk import ScenarioTest +from azure.cli.core.azclierror import ResourceNotFoundError +from azure.cli.command_modules.appconfig._constants import FeatureFlagConstants +from azure.cli.testsdk.scenario_tests import AllowLargeResponse +from azure.cli.command_modules.appconfig.tests.latest._test_utils import AppConfigResourceGroupPreparer, create_config_store, CredentialResponseSanitizer, register_appconfig_query_matcher, register_appconfig_recording_processors + +TEST_DIR = os.path.abspath(os.path.join(os.path.abspath(__file__), '..')) + + +class AppConfigEnhancedFeatureScenarioTest(ScenarioTest): + + def __init__(self, *args, **kwargs): + kwargs["recording_processors"] = kwargs.get("recording_processors", []) + [CredentialResponseSanitizer()] + super().__init__(*args, **kwargs) + register_appconfig_query_matcher(self) + register_appconfig_recording_processors(self) + + @AppConfigResourceGroupPreparer(parameter_name_for_location='location') + @AllowLargeResponse() + # Uses Entra ID auth (store created with local auth disabled). For live recording, set + # AZURE_CLI_TEST_DEV_RESOURCE_GROUP_NAME to a group where you hold "App Configuration Data Owner". + def test_azconfig_enhanced_feature(self, resource_group, location): + config_store_name = self.create_random_name(prefix='enhancedfeature', length=24) + + location = 'eastus' + sku = 'standard' + self.kwargs.update({ + 'config_store_name': config_store_name, + 'rg_loc': location, + 'rg': resource_group, + 'sku': sku, + 'endpoint': 'https://' + config_store_name + '.azconfig.io' + }) + create_config_store(self, self.kwargs, disable_local_auth=True) + + entry_feature = 'Beta' + entry_label = 'v1' + + self.kwargs.update({ + 'feature': entry_feature, + 'label': entry_label + }) + + # Create a brand new enhanced feature flag entry (disabled by default) + self.cmd('appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} -y', + checks=[self.check('name', entry_feature), + self.check('enabled', False), + self.check('label', entry_label)]) + + # Update an existing enhanced feature flag with a description and requirement type + updated_entry_description = "Beta Testing Feature Flag" + updated_requirement_type = FeatureFlagConstants.REQUIREMENT_TYPE_ANY + self.kwargs.update({ + 'description': updated_entry_description, + 'requirement_type': updated_requirement_type + }) + self.cmd('appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} --description "{description}" --requirement-type {requirement_type} -y', + checks=[self.check('name', entry_feature), + self.check('enabled', False), + self.check('label', entry_label), + self.check('description', updated_entry_description), + self.check('conditions.requirement_type', updated_requirement_type)]) + + # Show the enhanced feature flag + self.cmd('appconfig enhanced-feature-flag show --endpoint {endpoint} --auth-mode login --feature {feature} --label {label}', + checks=[self.check('name', entry_feature), + self.check('label', entry_label), + self.check('description', updated_entry_description)]) + + # Show with field filters + self.cmd('appconfig enhanced-feature-flag show --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} --fields name enabled', + checks=[self.check('name', entry_feature), + self.check('enabled', False)]) + + # Enable the enhanced feature flag + self.cmd('appconfig enhanced-feature-flag enable --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} -y', + checks=[self.check('name', entry_feature), + self.check('enabled', True)]) + + # Update telemetry and tags on the enabled flag - enabled state and description must be preserved + self.cmd('appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} --telemetry-enabled true --tags tag1=value1 tag2=value2 -y', + checks=[self.check('enabled', True), + self.check('description', updated_entry_description), + self.check('telemetry.enabled', True), + self.check('tags.tag1', 'value1'), + self.check('tags.tag2', 'value2'), + self.check('conditions.requirement_type', updated_requirement_type)]) + + # Disable the enhanced feature flag + self.cmd('appconfig enhanced-feature-flag disable --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} -y', + checks=[self.check('name', entry_feature), + self.check('enabled', False)]) + + # List enhanced feature flags + self.cmd('appconfig enhanced-feature-flag list --endpoint {endpoint} --auth-mode login', + checks=[self.check('[0].name', entry_feature)]) + + # Delete the enhanced feature flag + self.cmd('appconfig enhanced-feature-flag delete --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} -y', + checks=[self.check('name', entry_feature), + self.check('label', entry_label)]) + + # Confirm deletion + self.cmd('appconfig enhanced-feature-flag list --endpoint {endpoint} --auth-mode login', + checks=[self.is_empty()]) + + # Show a non-existent enhanced feature flag should fail + with self.assertRaisesRegex(ResourceNotFoundError, "Enhanced feature flag '{}' with label '{}' does not exist.".format(entry_feature, entry_label)): + self.cmd('appconfig enhanced-feature-flag show --endpoint {endpoint} --auth-mode login --feature {feature} --label {label}') + + # Enable a non-existent enhanced feature flag should fail + with self.assertRaisesRegex(ResourceNotFoundError, "Enhanced feature flag '{}' with label '{}' not found.".format(entry_feature, entry_label)): + self.cmd('appconfig enhanced-feature-flag enable --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} -y') + + # Disable a non-existent enhanced feature flag should fail + with self.assertRaisesRegex(ResourceNotFoundError, "Enhanced feature flag '{}' with label '{}' not found.".format(entry_feature, entry_label)): + self.cmd('appconfig enhanced-feature-flag disable --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} -y') + + # Delete a non-existent enhanced feature flag should fail + with self.assertRaisesRegex(ResourceNotFoundError, "Enhanced feature flag '{}' with label '{}' does not exist.".format(entry_feature, entry_label)): + self.cmd('appconfig enhanced-feature-flag delete --endpoint {endpoint} --auth-mode login --feature {feature} --label {label} -y') +