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/_featuremodels.py b/src/azure-cli/azure/cli/command_modules/appconfig/_featuremodels.py index e35588f3860..e3d732b1c84 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_featuremodels.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_featuremodels.py @@ -19,6 +19,23 @@ logger = get_logger(__name__) + +def parse_feature_flag_input(value): + """Parse the --flag value as AAZ shorthand syntax, falling back to JSON. + + Mirrors AAZAnyTypeArgAction.decode_str: shorthand is tried first and, because the shorthand + parser rejects double-quoted JSON, valid JSON falls through to shell_safe_json_parse. The + @file/@- convention is expanded to file content by the CLI core before this runs. + """ + from azure.cli.core.aaz._utils import AAZShortHandSyntaxParser + from azure.cli.core.aaz.exceptions import AAZInvalidShorthandSyntaxError + + try: + return AAZShortHandSyntaxParser()(value) + except AAZInvalidShorthandSyntaxError: + return shell_safe_json_parse(value, preserve_order=True) + + # Feature Flag Models # 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..8dcb6e8267a 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,128 @@ 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-name 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-name color --description "This is a colorful feature" + - name: Enable an enhanced feature flag while setting it. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --feature-name color --enable + - name: Disable an enhanced feature flag while setting it. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --feature-name color --enable false + - name: Set an enhanced feature flag using your 'az login' credentials. + text: + az appconfig enhanced-feature-flag set --endpoint https://myappconfiguration.azconfig.io --feature-name 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-name 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-name color --telemetry-enabled + - name: Disable telemetry on an enhanced feature flag. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --feature-name color --telemetry-enabled false + - name: Set the entire enhanced feature flag from an inline JSON object. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --flag '{"name":"Beta","enabled":true,"conditions":{"requirement_type":"Any","filters":[{"name":"Microsoft.TimeWindow","parameters":{"Start":"Wed, 01 Jan 2025 00:00:00 GMT"}}]}}' + - name: Set the entire enhanced feature flag using shorthand syntax. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --flag "{name:Beta,enabled:true,conditions:{requirement_type:Any,filters:[{name:Microsoft.TimeWindow,parameters:{Start:'Wed, 01 Jan 2025 00:00:00 GMT'}}]}}" + - name: Set the entire enhanced feature flag from a JSON file. + text: + az appconfig enhanced-feature-flag set -n MyAppConfiguration --flag @flag.json + - name: Set the entire enhanced feature flag by reading the JSON from stdin. + text: + cat flag.json | az appconfig enhanced-feature-flag set -n MyAppConfiguration --flag @- + """ + +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-name 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-name 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-name 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-name 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-name 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-name 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-name 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-name 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-name 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-name 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-name 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..1562984293f 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_params.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_params.py @@ -14,14 +14,16 @@ resource_group_name_type) from azure.cli.core.commands.validators import \ get_default_location_from_resource_group +from argcomplete.completers import FilesCompleter from ._constants import ImportExportProfiles, ImportMode, FeatureFlagConstants, ARMAuthenticationMode +from ._featuremodels import parse_feature_flag_input from ._validators import (validate_appservice_name_or_id, validate_aks_cluster_name_or_id, validate_sku, validate_snapshot_query_fields, 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, @@ -29,7 +31,8 @@ validate_strict_import, validate_export_as_reference, validate_snapshot_filters, validate_snapshot_export, validate_snapshot_import, validate_tag_filters, validate_import_tag_filters, validate_dry_run, validate_kv_revision_retention_period, - validate_public_network_args) + validate_public_network_args, + validate_enhanced_feature_flag, validate_enhanced_feature_flag_input) def load_arguments(self, _): @@ -47,6 +50,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 +473,37 @@ 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_name', validator=validate_enhanced_feature_flag, 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('enable', arg_type=get_three_state_flag(), help='Enable or disable the enhanced feature flag.') + 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) + c.argument('flag', options_list=['--flag'], type=parse_feature_flag_input, + completer=FilesCompleter(), validator=validate_enhanced_feature_flag_input, + help="The entire enhanced feature flag, using the same property names, casing and types as the " + "data-plane API and 'az appconfig enhanced-feature-flag show' (name, enabled, description, " + "conditions, allocation, variants, telemetry, tags). Accepts a JSON object, a shorthand-syntax " + "object, a file path with @ prefix (e.g. @flag.json), or @- to read from stdin. Providing --flag " + "replaces the entire feature flag and cannot be combined with --enable, --description, " + "--requirement-type or --telemetry-enabled.") + + 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_name', validator=validate_enhanced_feature_flag, 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..39475f30515 100644 --- a/src/azure-cli/azure/cli/command_modules/appconfig/_validators.py +++ b/src/azure-cli/azure/cli/command_modules/appconfig/_validators.py @@ -24,7 +24,7 @@ validate_feature_flag_key, is_http_endpoint) from ._models import QueryFields -from ._constants import ImportExportProfiles +from ._constants import ImportExportProfiles, FeatureFlagConstants from ._featuremodels import FeatureQueryFields from ._snapshotmodels import SnapshotQueryFields @@ -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 = [] @@ -325,6 +330,76 @@ def validate_feature(namespace): validate_feature_flag_name(namespace.feature) +def validate_enhanced_feature_flag(namespace): + if namespace.feature_name is not None: + validate_feature_flag_name(namespace.feature_name) + + +# Properties allowed in the enhanced feature flag input accepted by --flag. Matches the schema +# emitted by 'az appconfig enhanced-feature-flag show' and the data-plane /ff API, so a flag can be +# shown, edited and set back. +FEATURE_FLAG_PROPERTIES = { + FeatureFlagConstants.NAME, + FeatureFlagConstants.ENABLED, + FeatureFlagConstants.LABEL, + FeatureFlagConstants.DESCRIPTION, + FeatureFlagConstants.CONDITIONS, + FeatureFlagConstants.ALLOCATION, + FeatureFlagConstants.VARIANTS, + FeatureFlagConstants.TELEMETRY, + FeatureFlagConstants.TAGS, +} + +# Read-only properties emitted by 'show' that are tolerated (and ignored) on input. +FEATURE_FLAG_READONLY_PROPERTIES = { + FeatureFlagConstants.LAST_MODIFIED, + "etag", +} + + +def validate_enhanced_feature_flag_input(namespace): + if getattr(namespace, 'flag', None) is None: + return + + # --flag is a full-object replacement; it cannot be mixed with the per-property content flags. + conflicting = { + '--enable': namespace.enable, + '--description': namespace.description, + '--requirement-type': namespace.requirement_type, + '--telemetry-enabled': namespace.telemetry_enabled, + } + specified = [option for option, value in conflicting.items() if value is not None] + if specified: + raise MutuallyExclusiveArgumentError( + "--flag cannot be combined with {}. Provide the entire feature flag with --flag, " + "or set individual properties without --flag.".format(", ".join(specified))) + + flag = namespace.flag + if not isinstance(flag, dict): + raise InvalidArgumentValueError( + "--flag must be a JSON object or shorthand-syntax object representing a single feature flag.") + + allowed = FEATURE_FLAG_PROPERTIES | FEATURE_FLAG_READONLY_PROPERTIES + unknown_keys = set(flag.keys()) - allowed + if unknown_keys: + raise InvalidArgumentValueError( + "Unsupported feature flag properties: {}. Allowed properties: {}.".format( + ", ".join(sorted(unknown_keys)), + ", ".join(sorted(FEATURE_FLAG_PROPERTIES)))) + + flag_name = flag.get(FeatureFlagConstants.NAME) + if namespace.feature_name is None and flag_name is None: + raise RequiredArgumentMissingError( + "The feature flag 'name' is required. Provide it inside --flag or via --feature-name.") + + if namespace.feature_name is not None and flag_name is not None and namespace.feature_name != flag_name: + raise MutuallyExclusiveArgumentError( + "Feature name mismatch: --feature-name '{}' does not match the 'name' '{}' in --flag. " + "Provide only one, or make them identical.".format(namespace.feature_name, flag_name)) + + validate_feature_flag_name(flag_name if flag_name is not None else namespace.feature_name) + + def validate_feature_key(namespace): if namespace.key is not None: validate_feature_flag_key(namespace.key) 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..b5dd030c558 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, @@ -63,6 +64,11 @@ def load_command_table(self, _): client_factory=cf_nsp_configurations ) + configstore_enhanced_featureflag_util = CliCommandType( + operations_tmpl='azure.cli.command_modules.appconfig.enhanced_feature#{}', + table_transformer=enhanced_featureflag_entry_format + ) + def get_custom_sdk(custom_module, client_factory, table_transformer): """Returns a CliCommandType instance with specified operation template based on the given custom module name. This is useful when the command is not defined in the default 'custom' module but instead in a module under @@ -141,6 +147,16 @@ 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=configstore_enhanced_featureflag_util) 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..371faa03ef9 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/appconfig/enhanced_feature.py @@ -0,0 +1,248 @@ +# -------------------------------------------------------------------------------------------- +# 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, + name=None, + label=None, + enable=None, + description=None, + requirement_type=None, + telemetry_enabled=None, + tags=None, + flag=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) + + if flag is not None: + # --flag mirrors the data-plane /ff schema (also emitted by 'show'), so deserialize it with the SDK. + flag_to_load = {k: v for k, v in flag.items() + if k not in (FeatureFlagConstants.LAST_MODIFIED, "etag")} + if feature_name is not None: + flag_to_load[FeatureFlagConstants.NAME] = feature_name + feature_flag = FeatureFlag.from_dict(flag_to_load) + if label is not None: + feature_flag.label = label + if tags is not None: + feature_flag.tags = tags + else: + try: + feature_flag = feature_flag_client.get_feature_flag(name=feature_name, 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_name, enabled=False, label=label) + + if enable is not None: + feature_flag.enabled = enable + + 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, + 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_name, 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_name, label)) + + return _serialize_feature_flag(feature_flag, fields) + + +def list_feature(cmd, + feature_name=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_name, + 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, + 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_name, 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_name, label)) + + confirmation_message = "Are you sure you want to delete the enhanced feature flag '{}' with label '{}'?".format(feature_name, label) + user_confirmation(confirmation_message, yes) + + try: + deleted_feature_flag = feature_flag_client.delete_feature_flag(name=feature_name, label=label) + except HttpResponseError as exception: + raise CLIErrors.AzureResponseError(str(exception)) + + return _serialize_feature_flag(deleted_feature_flag) + + +def enable_feature(cmd, + feature_name, + name=None, + label=None, + yes=False, + connection_string=None, + auth_mode="key", + endpoint=None): + return _set_feature_state(cmd, feature_name, enabled=True, name=name, label=label, yes=yes, + connection_string=connection_string, auth_mode=auth_mode, endpoint=endpoint) + + +def disable_feature(cmd, + feature_name, + name=None, + label=None, + yes=False, + connection_string=None, + auth_mode="key", + endpoint=None): + return _set_feature_state(cmd, feature_name, enabled=False, name=name, label=label, yes=yes, + connection_string=connection_string, auth_mode=auth_mode, endpoint=endpoint) + + +def _set_feature_state(cmd, feature_name, 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_name, 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_name, 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_name) + 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..6d791a2afc8 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/appconfig/tests/latest/recordings/test_azconfig_enhanced_feature.yaml @@ -0,0 +1,1520 @@ +interactions: +- request: + body: '{"location": "eastus", "sku": {"name": "Standard"}, "properties": {"dataPlaneProxy": + {}, "disableLocalAuth": true, "softDeleteRetentionInDays": 1, "createMode": + "Default"}}' + 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-10-05T09:27:26.262608+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.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892465217105&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=isjtAFr6kU9-uNdjo1p5AT5XLFzOxjRlyXwITK9-YIijxJaRuR9dJoNpkD32Agm4s8zUTuNkIbAWkUS7fMIZMFSx4W5PcUsOPZKp-3rgemATfbTzToItg_Tx7iqrB1IXLibi5JH_vkmfWAAUHFNUGSeBbbmqhzF5RzKtGiNwYRtCEf1R104zs3SbjYsnUJlMHdpXMwTOLFDO0k5T9j4ZDFMRNu11Gp-vvZxntO8vMDjePg_kj-Kpqbfab-qkEJKAGGfTYGYN7-YEAD3Z8HfglYgfUrF6vLZEz8FYuoFzbiPUzULH7bwZKFD6bEsO6ccib8fFv0NEHWsOOXRdXEqCdg&h=H8s3bMVyFri2y45p7vaDaTVDPDmYvhSgRCmHzSXFH5o + cache-control: + - no-cache + content-length: + - '737' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 05 Oct 2026 09:27:25 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/a6747fb6-0dbb-4d1a-8cbe-599d5a60bd39 + x-ms-ratelimit-remaining-subscription-global-writes: + - '11999' + x-ms-ratelimit-remaining-subscription-writes: + - '799' + x-msedge-ref: + - 'Ref A: D028782DE0C348FAB695E53B8E410956 Ref B: VIEAA3060301033 Ref C: 2026-10-05T09:27:24Z' + 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.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892465217105&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=isjtAFr6kU9-uNdjo1p5AT5XLFzOxjRlyXwITK9-YIijxJaRuR9dJoNpkD32Agm4s8zUTuNkIbAWkUS7fMIZMFSx4W5PcUsOPZKp-3rgemATfbTzToItg_Tx7iqrB1IXLibi5JH_vkmfWAAUHFNUGSeBbbmqhzF5RzKtGiNwYRtCEf1R104zs3SbjYsnUJlMHdpXMwTOLFDO0k5T9j4ZDFMRNu11Gp-vvZxntO8vMDjePg_kj-Kpqbfab-qkEJKAGGfTYGYN7-YEAD3Z8HfglYgfUrF6vLZEz8FYuoFzbiPUzULH7bwZKFD6bEsO6ccib8fFv0NEHWsOOXRdXEqCdg&h=H8s3bMVyFri2y45p7vaDaTVDPDmYvhSgRCmHzSXFH5o + response: + body: + string: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c", + "name": "Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c", "status": "Creating", + "error": null}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892479253655&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=QluI5YWemmG144UpS7Uyje48j6mGOrCvvfw00I1pnbznq332r3FhZMFQL5gD0Kjzfsc_Tkkz-bOZBaYbPfNT_SQYIGQ1EpC4evlK--PiMAxGOkE0fG9NNv7GvbeVvHU2YjoJerP0l_T2OQgPVQ8NmN4I8XhrFJeH3SWtCo1__01bB9Ex7ECCVPEtNJMtwa0CvzouWrlTOXajMylCQcyTjrRv_Rj7dGW6RU_kyGa4YZDDNiOVOR1IhuGD6BaRYFCjdjZmF5WNt7bzoTQr1rtv3U5vPvigFOqTmphIlkq7mQT1BXGR-RaUJ0JWujFO1Y3sswfj5JVSDQnRjoJXFNgCTw&h=54AHfD5aMwV2Y65H4eG-1BkeC1cOPEsXgNfe_ZjzSwc + cache-control: + - no-cache + content-length: + - '268' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 05 Oct 2026 09:27: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/fc57a720-45bc-4709-8946-306648c3e03f + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 5B913AA1D66C41DF9183D621A6E44077 Ref B: VIEAA3060302033 Ref C: 2026-10-05T09:27:27Z' + 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.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892465217105&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=isjtAFr6kU9-uNdjo1p5AT5XLFzOxjRlyXwITK9-YIijxJaRuR9dJoNpkD32Agm4s8zUTuNkIbAWkUS7fMIZMFSx4W5PcUsOPZKp-3rgemATfbTzToItg_Tx7iqrB1IXLibi5JH_vkmfWAAUHFNUGSeBbbmqhzF5RzKtGiNwYRtCEf1R104zs3SbjYsnUJlMHdpXMwTOLFDO0k5T9j4ZDFMRNu11Gp-vvZxntO8vMDjePg_kj-Kpqbfab-qkEJKAGGfTYGYN7-YEAD3Z8HfglYgfUrF6vLZEz8FYuoFzbiPUzULH7bwZKFD6bEsO6ccib8fFv0NEHWsOOXRdXEqCdg&h=H8s3bMVyFri2y45p7vaDaTVDPDmYvhSgRCmHzSXFH5o + response: + body: + string: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c", + "name": "Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c", "status": "Creating", + "error": null}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892595255886&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=f-ix1sW70Bg7q3ZsVEwqOo38A7F7JcpIuZUzIQQQd2Y5KXl2JBhxuqxLIm6Xd0y7CHXue0Bg5gQb92jVSFzjWhFLRfU6xeaW6m23DfKMcU-nIc2ht88bvOfyGjTdFF6N_26x2WguzVlShaQitlglxfVWEAS5VUF2PyT-QhzD1SWZmp2dZGp6hKZodnjD4sqrWnu5x0_gQoC5niP_UXYe-ZEfLzn8TW7QcHkVAgIPWK6zIm7u1rutOz1gx4yJ6UhUKGJ96i88IV-oIAgoHAuwcIsrhgObQK5dDWXwrmxC5oalDmoFXudIHRSE4ZlTAH9gkqNXEjX7_G13f9MrCAJPsw&h=NoOiY4PxlhkJTTKw__x6sm9Y3ZYTEx0a_NnRR62KH_k + cache-control: + - no-cache + content-length: + - '268' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 05 Oct 2026 09:27:38 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/ccaae374-529e-47e0-b402-b68b39a39623 + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 285DB1E19B4D4889AD589EA8F107D9D9 Ref B: VIEAA3060307049 Ref C: 2026-10-05T09:27:38Z' + 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.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892465217105&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=isjtAFr6kU9-uNdjo1p5AT5XLFzOxjRlyXwITK9-YIijxJaRuR9dJoNpkD32Agm4s8zUTuNkIbAWkUS7fMIZMFSx4W5PcUsOPZKp-3rgemATfbTzToItg_Tx7iqrB1IXLibi5JH_vkmfWAAUHFNUGSeBbbmqhzF5RzKtGiNwYRtCEf1R104zs3SbjYsnUJlMHdpXMwTOLFDO0k5T9j4ZDFMRNu11Gp-vvZxntO8vMDjePg_kj-Kpqbfab-qkEJKAGGfTYGYN7-YEAD3Z8HfglYgfUrF6vLZEz8FYuoFzbiPUzULH7bwZKFD6bEsO6ccib8fFv0NEHWsOOXRdXEqCdg&h=H8s3bMVyFri2y45p7vaDaTVDPDmYvhSgRCmHzSXFH5o + response: + body: + string: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c", + "name": "Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c", "status": "Creating", + "error": null}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892710636952&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=dN_d2xDeUZmwYCXtOb3ZPLzCmsjBfmUwudwh87j4Ti-8-mYEGTybbgI-vwogV9ZwF6Ee_wZ3sUAqutI8D8CMgKanZdKgmNolsdDl_MWuo8OJw-Jymi86UJG6IW07-nv6zNmoWsC4Z_7ZKzVtM2RJGJEkhnQh3CIJ4Ut4-K8gWK0NyO4SdCJpCRO0gR1WZYTgp-SscdzmlHi_ZOcCB2GbHENo_stYaJ7w7J1PmKrAZbq-5bOSIvjm0BZ8BXrYHfw8H2hy6RGFxSLtJkVJBujjwcv9uZ0-JX35LjaelTLTJK1QC1Jd7qeAebfow23wBfgQB1AGhO2vORxvq7lZuwYH-w&h=eZiw_fL6HNsngzuZD4sZL8UtJ_0o-Y4YmbP7x2wlOwY + cache-control: + - no-cache + content-length: + - '268' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 05 Oct 2026 09:27:50 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/e72bfe81-9707-4bf4-83a4-e73bb627b50f + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 19C91550AF6E456A9F33D0915CACA4A3 Ref B: VIEAA3060308027 Ref C: 2026-10-05T09:27:50Z' + 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.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892465217105&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=isjtAFr6kU9-uNdjo1p5AT5XLFzOxjRlyXwITK9-YIijxJaRuR9dJoNpkD32Agm4s8zUTuNkIbAWkUS7fMIZMFSx4W5PcUsOPZKp-3rgemATfbTzToItg_Tx7iqrB1IXLibi5JH_vkmfWAAUHFNUGSeBbbmqhzF5RzKtGiNwYRtCEf1R104zs3SbjYsnUJlMHdpXMwTOLFDO0k5T9j4ZDFMRNu11Gp-vvZxntO8vMDjePg_kj-Kpqbfab-qkEJKAGGfTYGYN7-YEAD3Z8HfglYgfUrF6vLZEz8FYuoFzbiPUzULH7bwZKFD6bEsO6ccib8fFv0NEHWsOOXRdXEqCdg&h=H8s3bMVyFri2y45p7vaDaTVDPDmYvhSgRCmHzSXFH5o + response: + body: + string: '{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c", + "name": "Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c", "status": "Succeeded", + "error": null}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.AppConfiguration/locations/eastus/operationsStatus/Y29uZmlndXJhdGlvblN0b3Jlcw.Qx0YKz68dOSRx3OshFzaQCZeqnxnaenxbNZa3Al1H5c?api-version=2025-08-01-preview&t=639267892823727086&c=MIIHlTCCBn2gAwIBAgIRALLGu8EppFcH5hmisV5_CugwDQYJKoZIhvcNAQELBQAwNjE0MDIGA1UEAxMrQ0NNRSBHMSBUTFMgUlNBIDIwNDggU0hBMjU2IDIwNDkgV1VTMiBDQSAwMTAeFw0yNjA5MjIwMjM0MjdaFw0yNjEyMTcwODM0MjdaMEAxPjA8BgNVBAMTNWFzeW5jb3BlcmF0aW9uc2lnbmluZ2NlcnRpZmljYXRlLm1hbmFnZW1lbnQuYXp1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvlHl6MWFh4sVyDX86SXho6up73n3Cw8SF05--Tw4T0GdREq123FDaCGsXT67bi7TMBEp3R7zxuuIRVLJrd8nP04XrFyXWxBPsoot39e_4jVqwwqq_xPzzdQo_m8FiMDffvBOztXpj6xmwkFjqdbcyzXUghb4_DCxxidZPzF-0tQmB6GGN3YCA8MnVOSvLr2Wm1iVXqAPOFt6PrJ614gH3U3xYurR002trOdUkIzQtDS4mBgJs_-homb3k-xbkYDWJJz6Zq2jjCTRImTE7hetrqJtgmX2xr9s0qR32-LsCN56AmbIgDNFxjIM0Yz6JFhfie_gb_LiA-jT_BIvdehDdQIDAQABo4IEkjCCBI4wgZ0GA1UdIASBlTCBkjAMBgorBgEEAYI3ewEBMGYGCisGAQQBgjd7AgIwWDBWBggrBgEFBQcCAjBKHkgAMwAzAGUAMAAxADkAMgAxAC0ANABkADYANAAtADQAZgA4AGMALQBhADAANQA1AC0ANQBiAGQAYQBmAGYAZAA1AGUAMwAzAGQwDAYKKwYBBAGCN3sDAjAMBgorBgEEAYI3ewQCMAwGA1UdEwEB_wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB_wQEAwIFoDAdBgNVHQ4EFgQUiGnw78TPrSmERHdsg2J0cunwKVcwHwYDVR0jBBgwFoAUrONy-gOyc549lcjvh1uu3Ruh7WgwggGyBgNVHR8EggGpMIIBpTBpoGegZYZjaHR0cDovL3ByaW1hcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMGugaaBnhmVodHRwOi8vc2Vjb25kYXJ5LWNkbi5wa2kuY29yZS53aW5kb3dzLm5ldC93ZXN0dXMyL2NybHMvY2NtZXdlc3R1czJwa2kvY2NtZXdlc3R1czJpY2EwMS84My9jdXJyZW50LmNybDBaoFigVoZUaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3dlc3R1czIvY3Jscy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxLzgzL2N1cnJlbnQuY3JsMG-gbaBrhmlodHRwOi8vY2NtZXdlc3R1czJwa2kud2VzdHVzMi5wa2kuY29yZS53aW5kb3dzLm5ldC9jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzL2NjbWV3ZXN0dXMyaWNhMDEvODMvY3VycmVudC5jcmwwggG3BggrBgEFBQcBAQSCAakwggGlMGwGCCsGAQUFBzAChmBodHRwOi8vcHJpbWFyeS1jZG4ucGtpLmNvcmUud2luZG93cy5uZXQvd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwbgYIKwYBBQUHMAKGYmh0dHA6Ly9zZWNvbmRhcnktY2RuLnBraS5jb3JlLndpbmRvd3MubmV0L3dlc3R1czIvY2FjZXJ0cy9jY21ld2VzdHVzMnBraS9jY21ld2VzdHVzMmljYTAxL2NlcnQuY2VyMF0GCCsGAQUFBzAChlFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vd2VzdHVzMi9jYWNlcnRzL2NjbWV3ZXN0dXMycGtpL2NjbWV3ZXN0dXMyaWNhMDEvY2VydC5jZXIwZgYIKwYBBQUHMAKGWmh0dHA6Ly9jY21ld2VzdHVzMnBraS53ZXN0dXMyLnBraS5jb3JlLndpbmRvd3MubmV0L2NlcnRpZmljYXRlQXV0aG9yaXRpZXMvY2NtZXdlc3R1czJpY2EwMTANBgkqhkiG9w0BAQsFAAOCAQEALRW5985M5NN07kPutlPzc14J5dboz3nWyaPtQ-QQ2rBZDxrcI1GnZMee0TddyNP7lIWPuYF88VsWVrNfipBB1ABLo2dhr4x_as6S5BRKG79pGnpwYSuL3eqk8CsPU7zuMZwfgBEptu-2q1y3b-CPcq_Viv0ttMphLKaOJUasBAyA6I1GuGX9gQZM9E9H-q1UlvWUvGD2a9izQyRaWOBNFGl5NZROuyzEEuRoCigJZ2w-MSrHdIjea0v3_mbXsBj-atG5csSypntOvFlo7chHVdj-8huq2UqJlouVQevelH3Ps-2bp0Afma5w_SmUYLk6hXiPVOuzGdmHO7xlAFUV1A&s=tYvjiB8EZWlY00glqHjoCVxpCzxt9njNHklCRx110Osexa8oA87WOAxCCknIq1cvfuO11aVZKHNH_hGWuZbm1AJtpZ-bkJQTVgts44WPOh8iUzesaZVBoZysBUfoM_yW9KJpG34fVk8dB-doy5vdH23m8yobg76R40MJuWqlW3nkel6DU1XcL4iC44c5GKGjmltR8FywqPEdAkno3QrYbl46npyhYb4iUKWgddg9Pd73dU-Jm1oqulDAkHuRPSf52c5HSD8LShlHBjPyVBN8hFGykxkpMLDSJ1kqwnzzSYBDn3nDbfLhYkp6Vb0jtklocNkCZtsITl5g99XrbnGeXA&h=DtejTy-zihNTqlFwCEma-qrftWq54qGfY1cmCv8w2Ck + cache-control: + - no-cache + content-length: + - '269' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 05 Oct 2026 09:28:02 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47,objectId=43ddb22f-baef-4d3f-9e56-3a89871b9b59/westeurope/b59c15c2-a775-4fd5-a65b-3879e8a7fab0 + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + 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-10-05T09:27:26+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-10-05T09:27:26+00:00", "lastModifiedBy": "test@example.com", "lastModifiedByType": + "User", "lastModifiedAt": "2026-10-05T09:27:26+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: + - Mon, 05 Oct 2026 09:28:03 GMT + etag: + - '"65030d1f-0000-0100-0000-6ac36d7f0000"' + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + 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: + - Mon, 05 Oct 2026 09:28:05 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDA5NQ==;sn=14095 + x-ms-date: + - Mon, 05 Oct 2026 09:28:05 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=NzotMSMxNDA5NQ== + 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": "ttZn9rVnhaac51qTusr7V3MeV_F4GjF9hmG2xxx5vFE", "name": "Beta", + "label": "v1", "enabled": false, "description": null, "variants": [], "allocation": + null, "conditions": null, "telemetry": null, "tags": {}, "last_modified": + "2026-10-05T09:28:06+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: + - Mon, 05 Oct 2026 09:28:06 GMT + etag: + - '"ttZn9rVnhaac51qTusr7V3MeV_F4GjF9hmG2xxx5vFE"' + last-modified: + - Mon, 05 Oct 2026 09:28:06 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDA5Ng==;sn=14096 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:06 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": "ttZn9rVnhaac51qTusr7V3MeV_F4GjF9hmG2xxx5vFE", "name": "Beta", + "label": "v1", "enabled": false, "description": null, "variants": [], "allocation": + null, "conditions": null, "telemetry": null, "tags": {}, "last_modified": + "2026-10-05T09:28:06+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: + - Mon, 05 Oct 2026 09:28:07 GMT + etag: + - '"ttZn9rVnhaac51qTusr7V3MeV_F4GjF9hmG2xxx5vFE"' + last-modified: + - Mon, 05 Oct 2026 09:28:06 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDA5Ng==;sn=14096 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:07 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=NzotMSMxNDA5Ng== + 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": "dL8VBvDgSFPWfRcGVeGUXiWmKApTKDZPVB9JU-9oMFs", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-10-05T09:28:08+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: + - Mon, 05 Oct 2026 09:28:08 GMT + etag: + - '"dL8VBvDgSFPWfRcGVeGUXiWmKApTKDZPVB9JU-9oMFs"' + last-modified: + - Mon, 05 Oct 2026 09:28:08 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDA5Nw==;sn=14097 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:08 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": "dL8VBvDgSFPWfRcGVeGUXiWmKApTKDZPVB9JU-9oMFs", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-10-05T09:28:08+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: + - Mon, 05 Oct 2026 09:28:08 GMT + etag: + - '"dL8VBvDgSFPWfRcGVeGUXiWmKApTKDZPVB9JU-9oMFs"' + last-modified: + - Mon, 05 Oct 2026 09:28:08 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDA5OA==;sn=14098 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:08 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": "dL8VBvDgSFPWfRcGVeGUXiWmKApTKDZPVB9JU-9oMFs", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-10-05T09:28:08+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: + - Mon, 05 Oct 2026 09:28:09 GMT + etag: + - '"dL8VBvDgSFPWfRcGVeGUXiWmKApTKDZPVB9JU-9oMFs"' + last-modified: + - Mon, 05 Oct 2026 09:28:08 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDA5OA==;sn=14098 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:09 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": "dL8VBvDgSFPWfRcGVeGUXiWmKApTKDZPVB9JU-9oMFs", "name": "Beta", + "label": "v1", "enabled": false, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-10-05T09:28:08+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: + - Mon, 05 Oct 2026 09:28:10 GMT + etag: + - '"dL8VBvDgSFPWfRcGVeGUXiWmKApTKDZPVB9JU-9oMFs"' + last-modified: + - Mon, 05 Oct 2026 09:28:08 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDA5OA==;sn=14098 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:10 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=NzotMSMxNDA5OA== + 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": "RzQqWFSpiF6udPzYDBWi1EXI1MMOM2pOg7C1-TL0Vbs", "name": "Beta", + "label": "v1", "enabled": true, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-10-05T09:28:11+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: + - Mon, 05 Oct 2026 09:28:11 GMT + etag: + - '"RzQqWFSpiF6udPzYDBWi1EXI1MMOM2pOg7C1-TL0Vbs"' + last-modified: + - Mon, 05 Oct 2026 09:28:11 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDA5OQ==;sn=14099 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:11 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": "RzQqWFSpiF6udPzYDBWi1EXI1MMOM2pOg7C1-TL0Vbs", "name": "Beta", + "label": "v1", "enabled": true, "description": "Beta Testing Feature Flag", + "variants": [], "allocation": null, "conditions": {"requirement_type": "Any"}, + "telemetry": null, "tags": {}, "last_modified": "2026-10-05T09:28:11+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: + - Mon, 05 Oct 2026 09:28:11 GMT + etag: + - '"RzQqWFSpiF6udPzYDBWi1EXI1MMOM2pOg7C1-TL0Vbs"' + last-modified: + - Mon, 05 Oct 2026 09:28:11 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDEwMA==;sn=14100 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:11 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=NzotMSMxNDEwMA== + 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": "3x5HWMjTD6UHituYS5JsvaUhZdG_1CcpDX4TpX0oSIM", "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-10-05T09:28:12+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: + - Mon, 05 Oct 2026 09:28:12 GMT + etag: + - '"3x5HWMjTD6UHituYS5JsvaUhZdG_1CcpDX4TpX0oSIM"' + last-modified: + - Mon, 05 Oct 2026 09:28:12 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDEwMQ==;sn=14101 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:12 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": "3x5HWMjTD6UHituYS5JsvaUhZdG_1CcpDX4TpX0oSIM", "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-10-05T09:28:12+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: + - Mon, 05 Oct 2026 09:28:13 GMT + etag: + - '"3x5HWMjTD6UHituYS5JsvaUhZdG_1CcpDX4TpX0oSIM"' + last-modified: + - Mon, 05 Oct 2026 09:28:12 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDEwMg==;sn=14102 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:13 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=NzotMSMxNDEwMg== + 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": "JYEWacQoWBpkcUY_X4XjHUdGEvFYL1t8Oqb9Y6psso8", "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-10-05T09:28:14+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: + - Mon, 05 Oct 2026 09:28:14 GMT + etag: + - '"JYEWacQoWBpkcUY_X4XjHUdGEvFYL1t8Oqb9Y6psso8"' + last-modified: + - Mon, 05 Oct 2026 09:28:14 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDEwMw==;sn=14103 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:14 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": "JYEWacQoWBpkcUY_X4XjHUdGEvFYL1t8Oqb9Y6psso8", "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-10-05T09:28:14+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: + - Mon, 05 Oct 2026 09:28:14 GMT + etag: + - '"JYEWacQoWBpkcUY_X4XjHUdGEvFYL1t8Oqb9Y6psso8"' + last-modified: + - Mon, 05 Oct 2026 09:28:14 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDEwNA==;sn=14104 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:14 GMT + status: + code: 200 + message: OK +- request: + body: '{"enabled": true, "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: + - '214' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + Sync-Token: + - dyZf1=NzotMSMxNDEwNA== + 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": "4VBH-d2MfKvRefkpmx2aoJLZt5V-znPzeMSX169iI1s", "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-10-05T09:28:15+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: + - Mon, 05 Oct 2026 09:28:15 GMT + etag: + - '"4VBH-d2MfKvRefkpmx2aoJLZt5V-znPzeMSX169iI1s"' + last-modified: + - Mon, 05 Oct 2026 09:28:15 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDEwNQ==;sn=14105 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:15 GMT + status: + code: 200 + message: OK +- request: + body: '{"enabled": true, "description": "Set via --flag JSON", "conditions": {"requirement_type": + "All", "filters": [{"name": "Microsoft.TimeWindow", "parameters": {"Start": + "Wed, 01 Jan 2025 00:00:00 GMT"}}]}, "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: + - '215' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + 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": "aL49SboAip-Rp22HyRmSNZd4lZaYKrq7CCYcjKeb3XY", "name": "Beta", + "label": "v1", "enabled": true, "description": "Set via --flag JSON", "variants": + [], "allocation": null, "conditions": {"requirement_type": "All", "filters": + [{"name": "Microsoft.TimeWindow", "parameters": {"Start": "Wed, 01 Jan 2025 + 00:00:00 GMT"}}]}, "telemetry": null, "tags": {}, "last_modified": "2026-10-05T09:28:16+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: + - Mon, 05 Oct 2026 09:28:16 GMT + etag: + - '"aL49SboAip-Rp22HyRmSNZd4lZaYKrq7CCYcjKeb3XY"' + last-modified: + - Mon, 05 Oct 2026 09:28:16 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDEwNw==;sn=14107 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:16 GMT + status: + code: 200 + message: OK +- request: + body: '{"enabled": true, "description": "Set via --flag shorthand", "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: + - '72' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + 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": "TSdf_10xwjqxoJkoNNJ5axoR1TfufceP2aCNzDw6zBo", "name": "Beta", + "label": "v1", "enabled": true, "description": "Set via --flag shorthand", + "variants": [], "allocation": null, "conditions": null, "telemetry": null, + "tags": {}, "last_modified": "2026-10-05T09:28:17+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: + - Mon, 05 Oct 2026 09:28:17 GMT + etag: + - '"TSdf_10xwjqxoJkoNNJ5axoR1TfufceP2aCNzDw6zBo"' + last-modified: + - Mon, 05 Oct 2026 09:28:17 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDEwOQ==;sn=14109 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:17 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": "TSdf_10xwjqxoJkoNNJ5axoR1TfufceP2aCNzDw6zBo", "name": "Beta", + "label": "v1", "enabled": true, "description": "Set via --flag shorthand", + "variants": [], "allocation": null, "conditions": null, "telemetry": null, + "tags": {}, "last_modified": "2026-10-05T09:28:17+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: + - Mon, 05 Oct 2026 09:28:17 GMT + etag: + - '"TSdf_10xwjqxoJkoNNJ5axoR1TfufceP2aCNzDw6zBo"' + last-modified: + - Mon, 05 Oct 2026 09:28:17 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMA==;sn=14110 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:17 GMT + status: + code: 200 + message: OK +- request: + body: '{"enabled": false, "description": "Set via --flag shorthand", "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: + - '89' + Content-Type: + - application/json;profile="https://azconfig.io/mime-profiles/ff";charset=utf-8 + Sync-Token: + - dyZf1=NzotMSMxNDExMA== + 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": "DA67CHcemiIVyeX2FDvMQvRKFqw3CNqbox4C-M7ZHrs", "name": "Beta", + "label": "v1", "enabled": false, "description": "Set via --flag shorthand", + "variants": [], "allocation": null, "conditions": null, "telemetry": null, + "tags": {}, "last_modified": "2026-10-05T09:28:18+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: + - Mon, 05 Oct 2026 09:28:18 GMT + etag: + - '"DA67CHcemiIVyeX2FDvMQvRKFqw3CNqbox4C-M7ZHrs"' + last-modified: + - Mon, 05 Oct 2026 09:28:18 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMQ==;sn=14111 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:18 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": "BdqMbBy_TC79vbL9p7EIidbObZuUUA6gWD4o391BoFU", "items": [{"etag": + "DA67CHcemiIVyeX2FDvMQvRKFqw3CNqbox4C-M7ZHrs", "name": "Beta", "label": "v1", + "enabled": false, "description": "Set via --flag shorthand", "variants": [], + "allocation": null, "conditions": null, "telemetry": null, "tags": {}, "last_modified": + "2026-10-05T09:28:18+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: + - Mon, 05 Oct 2026 09:28:19 GMT + etag: + - '"BdqMbBy_TC79vbL9p7EIidbObZuUUA6gWD4o391BoFU"' + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMg==;sn=14112 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:19 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": "DA67CHcemiIVyeX2FDvMQvRKFqw3CNqbox4C-M7ZHrs", "name": "Beta", + "label": "v1", "enabled": false, "description": "Set via --flag shorthand", + "variants": [], "allocation": null, "conditions": null, "telemetry": null, + "tags": {}, "last_modified": "2026-10-05T09:28:18+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: + - Mon, 05 Oct 2026 09:28:20 GMT + etag: + - '"DA67CHcemiIVyeX2FDvMQvRKFqw3CNqbox4C-M7ZHrs"' + last-modified: + - Mon, 05 Oct 2026 09:28:18 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMg==;sn=14112 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:20 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=NzotMSMxNDExMg== + 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": "DA67CHcemiIVyeX2FDvMQvRKFqw3CNqbox4C-M7ZHrs", "name": "Beta", + "label": "v1", "enabled": false, "description": "Set via --flag shorthand", + "variants": [], "allocation": null, "conditions": null, "telemetry": null, + "tags": {}, "last_modified": "2026-10-05T09:28:18+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: + - Mon, 05 Oct 2026 09:28:20 GMT + etag: + - '"DA67CHcemiIVyeX2FDvMQvRKFqw3CNqbox4C-M7ZHrs"' + last-modified: + - Mon, 05 Oct 2026 09:28:18 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMw==;sn=14113 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:20 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: + - Mon, 05 Oct 2026 09:28:21 GMT + etag: + - '"oIiYybBKOJkhO4-JNQpPcUeed073Y5rY5FTb4e0GksU"' + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMw==;sn=14113 + transfer-encoding: + - chunked + x-ms-date: + - Mon, 05 Oct 2026 09:28:21 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: + - Mon, 05 Oct 2026 09:28:22 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMw==;sn=14113 + x-ms-date: + - Mon, 05 Oct 2026 09:28:22 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: + - Mon, 05 Oct 2026 09:28:23 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMw==;sn=14113 + x-ms-date: + - Mon, 05 Oct 2026 09:28:23 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: + - Mon, 05 Oct 2026 09:28:24 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMw==;sn=14113 + x-ms-date: + - Mon, 05 Oct 2026 09:28:24 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: + - Mon, 05 Oct 2026 09:28:24 GMT + strict-transport-security: + - max-age=31536000; includeSubDomains + sync-token: + - dyZf1=NzotMSMxNDExMw==;sn=14113 + x-ms-date: + - Mon, 05 Oct 2026 09:28:24 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..9283ac957e1 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/appconfig/tests/latest/test_appconfig_enhanced_feature_commands.py @@ -0,0 +1,168 @@ +# -------------------------------------------------------------------------------------------- +# 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, MutuallyExclusiveArgumentError +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_name': 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-name {feature_name} --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-name {feature_name} --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-name {feature_name} --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-name {feature_name} --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-name {feature_name} --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-name {feature_name} --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)]) + + # Toggle the enabled state with the top-level --enable argument on set (other properties preserved) + self.cmd('appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --feature-name {feature_name} --label {label} --enable false -y', + checks=[self.check('enabled', False), + self.check('description', updated_entry_description), + self.check('telemetry.enabled', True)]) + self.cmd('appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --feature-name {feature_name} --label {label} --enable -y', + checks=[self.check('enabled', True), + self.check('description', updated_entry_description), + self.check('telemetry.enabled', True)]) + + # Set the entire flag as raw JSON with --flag (full replace of all properties) + self.kwargs['flag_json'] = '{"name":"Beta","enabled":true,"description":"Set via --flag JSON","conditions":{"requirement_type":"All","filters":[{"name":"Microsoft.TimeWindow","parameters":{"Start":"Wed, 01 Jan 2025 00:00:00 GMT"}}]}}' + self.cmd("appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --label {label} --flag '{flag_json}' -y", + checks=[self.check('name', entry_feature), + self.check('enabled', True), + self.check('description', 'Set via --flag JSON'), + self.check('conditions.requirement_type', 'All'), + self.check('conditions.filters[0].name', 'Microsoft.TimeWindow')]) + + # Overwrite the same flag with shorthand syntax - full replace drops the previous conditions + self.kwargs['flag_shorthand'] = "{name:Beta,enabled:true,description:'Set via --flag shorthand'}" + self.cmd('appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --label {label} --flag "{flag_shorthand}" -y', + checks=[self.check('name', entry_feature), + self.check('enabled', True), + self.check('description', 'Set via --flag shorthand'), + self.check('conditions', None)]) + + # --flag is mutually exclusive with content arguments (validated before any request) + with self.assertRaisesRegex(MutuallyExclusiveArgumentError, "--flag cannot be combined with --description"): + self.cmd("appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --label {label} --flag '{flag_json}' --description x -y") + + with self.assertRaisesRegex(MutuallyExclusiveArgumentError, "--flag cannot be combined with --enable"): + self.cmd("appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --label {label} --flag '{flag_json}' --enable -y") + + # The name inside --flag must match --feature-name when both are provided + self.kwargs['flag_mismatch'] = '{"name":"Delta","enabled":true}' + with self.assertRaisesRegex(MutuallyExclusiveArgumentError, "Feature name mismatch"): + self.cmd("appconfig enhanced-feature-flag set --endpoint {endpoint} --auth-mode login --feature-name {feature_name} --label {label} --flag '{flag_mismatch}' -y") + + # Disable the enhanced feature flag + self.cmd('appconfig enhanced-feature-flag disable --endpoint {endpoint} --auth-mode login --feature-name {feature_name} --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-name {feature_name} --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-name {feature_name} --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-name {feature_name} --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-name {feature_name} --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-name {feature_name} --label {label} -y') +