diff --git a/sdk/appconfiguration/azure-appconfiguration/CHANGELOG.md b/sdk/appconfiguration/azure-appconfiguration/CHANGELOG.md index 9193f70ff6ed..fc14b61ba3aa 100644 --- a/sdk/appconfiguration/azure-appconfiguration/CHANGELOG.md +++ b/sdk/appconfiguration/azure-appconfiguration/CHANGELOG.md @@ -7,6 +7,8 @@ - Added `check_configuration_settings()` method to efficiently check for configuration changes using HEAD requests, returning only headers (ETags) without response bodies. - `list_configuration_settings()` and `check_configuration_settings()` now return `ConfigurationSettingPaged` (sync) / `ConfigurationSettingPagedAsync` (async) to expose the `by_page(match_conditions=...)` API and per-page `etag` attribute for change detection. - `ConfigurationSettingPaged` and `ConfigurationSettingPagedAsync` are now publicly exported from `azure.appconfiguration`. +- Added a `description` property to `ConfigurationSetting` and `SecretReferenceConfigurationSetting` representing the description of the key-value (requires API version `2026-04-01` or later). +- Added a `description` property and a `description` keyword argument to `ConfigurationSnapshot`, and a `description` keyword argument to `begin_create_snapshot()` for both sync and async clients (requires API version `2026-04-01` or later). ### Breaking Changes diff --git a/sdk/appconfiguration/azure-appconfiguration/_metadata.json b/sdk/appconfiguration/azure-appconfiguration/_metadata.json index 599f33b5de70..798d1d9d00af 100644 --- a/sdk/appconfiguration/azure-appconfiguration/_metadata.json +++ b/sdk/appconfiguration/azure-appconfiguration/_metadata.json @@ -1,6 +1,6 @@ { - "apiVersion": "2024-09-01", + "apiVersion": "2026-04-01", "apiVersions": { - "AzureAppConfiguration": "2024-09-01" + "AzureAppConfiguration": "2026-04-01" } } \ No newline at end of file diff --git a/sdk/appconfiguration/azure-appconfiguration/apiview-properties.json b/sdk/appconfiguration/azure-appconfiguration/apiview-properties.json index fec9c5d81c24..19913b81c9df 100644 --- a/sdk/appconfiguration/azure-appconfiguration/apiview-properties.json +++ b/sdk/appconfiguration/azure-appconfiguration/apiview-properties.json @@ -54,5 +54,5 @@ "azure.appconfiguration.AzureAppConfigurationClient.check_revisions": "AzureAppConfiguration.checkRevisions", "azure.appconfiguration.aio.AzureAppConfigurationClient.check_revisions": "AzureAppConfiguration.checkRevisions" }, - "CrossLanguageVersion": "29f9953822ad" + "CrossLanguageVersion": "a2a80f4f2e80" } \ No newline at end of file diff --git a/sdk/appconfiguration/azure-appconfiguration/assets.json b/sdk/appconfiguration/azure-appconfiguration/assets.json index 56df8ec329c9..6f560b9fdef3 100644 --- a/sdk/appconfiguration/azure-appconfiguration/assets.json +++ b/sdk/appconfiguration/azure-appconfiguration/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "python", "TagPrefix": "python/appconfiguration/azure-appconfiguration", - "Tag": "python/appconfiguration/azure-appconfiguration_c861e54b5f" + "Tag": "python/appconfiguration/azure-appconfiguration_13a99205dc" } diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_azure_appconfiguration_client.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_azure_appconfiguration_client.py index 13568fee5206..89d0ebcf9151 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_azure_appconfiguration_client.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_azure_appconfiguration_client.py @@ -677,6 +677,7 @@ def begin_create_snapshot( composition_type: Optional[Union[str, SnapshotComposition]] = None, retention_period: Optional[int] = None, tags: Optional[Dict[str, str]] = None, + description: Optional[str] = None, **kwargs: Any, ) -> LROPoller[ConfigurationSnapshot]: """Create a snapshot of the configuration settings. @@ -698,13 +699,19 @@ def begin_create_snapshot( :paramtype retention_period: int or None :keyword tags: The tags of the configuration snapshot. :paramtype tags: dict[str, str] or None + :keyword description: The description of the configuration snapshot. + :paramtype description: str or None :return: A poller for create configuration snapshot operation. Call `result()` on this object to wait for the operation to complete and get the created snapshot. :rtype: ~azure.core.polling.LROPoller[~azure.appconfiguration.ConfigurationSnapshot] :raises: :class:`~azure.core.exceptions.HttpResponseError` """ snapshot = ConfigurationSnapshot( - filters=filters, composition_type=composition_type, retention_period=retention_period, tags=tags + filters=filters, + composition_type=composition_type, + retention_period=retention_period, + tags=tags, + description=description, ) return cast( LROPoller[ConfigurationSnapshot], diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_client.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_client.py index a477d39fce84..04845befa73e 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_client.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_client.py @@ -37,7 +37,7 @@ class AzureAppConfigurationClient(_AzureAppConfigurationClientOperationsMixin): credential type or a token credential type. Required. :type credential: ~azure.core.credentials.AzureKeyCredential or ~azure.core.credentials.TokenCredential - :keyword api_version: The API version to use for this operation. Known values are "2024-09-01" + :keyword api_version: The API version to use for this operation. Known values are "2026-04-01" and None. Default value is None. If not set, the operation's default API version will be used. Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_configuration.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_configuration.py index 9d022c908830..b18987b4ec05 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_configuration.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_configuration.py @@ -29,14 +29,14 @@ class AzureAppConfigurationClientConfiguration: # pylint: disable=too-many-inst credential type or a token credential type. Required. :type credential: ~azure.core.credentials.AzureKeyCredential or ~azure.core.credentials.TokenCredential - :keyword api_version: The API version to use for this operation. Known values are "2024-09-01" + :keyword api_version: The API version to use for this operation. Known values are "2026-04-01" and None. Default value is None. If not set, the operation's default API version will be used. Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str """ def __init__(self, endpoint: str, credential: Union[AzureKeyCredential, "TokenCredential"], **kwargs: Any) -> None: - api_version: str = kwargs.pop("api_version", "2024-09-01") + api_version: str = kwargs.pop("api_version", "2026-04-01") if endpoint is None: raise ValueError("Parameter 'endpoint' must not be None.") diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_operations/_operations.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_operations/_operations.py index 372a8b673df0..21f24d2d26c6 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_operations/_operations.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/_operations/_operations.py @@ -58,7 +58,7 @@ def build_azure_app_configuration_get_keys_request( # pylint: disable=name-too- _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.keyset+json, application/problem+json") # Construct URL @@ -92,7 +92,7 @@ def build_azure_app_configuration_check_keys_request( # pylint: disable=name-to _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) # Construct URL _url = "/keys" @@ -129,7 +129,7 @@ def build_azure_app_configuration_get_key_values_request( # pylint: disable=nam _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.kvset+json, application/problem+json") # Construct URL @@ -183,7 +183,7 @@ def build_azure_app_configuration_check_key_values_request( # pylint: disable=n _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) # Construct URL _url = "/kv" @@ -232,7 +232,7 @@ def build_azure_app_configuration_get_key_value_request( # pylint: disable=name _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.kv+json, application/problem+json") # Construct URL @@ -281,7 +281,7 @@ def build_azure_app_configuration_put_key_value_request( # pylint: disable=name _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.kv+json, application/problem+json") # Construct URL @@ -325,7 +325,7 @@ def build_azure_app_configuration_delete_key_value_request( # pylint: disable=n _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.kv+json, application/problem+json") # Construct URL @@ -370,7 +370,7 @@ def build_azure_app_configuration_check_key_value_request( # pylint: disable=na _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) # Construct URL _url = "/kv/{key}" path_format_arguments = { @@ -415,7 +415,7 @@ def build_azure_app_configuration_get_snapshots_request( # pylint: disable=name _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.snapshotset+json, application/problem+json") # Construct URL @@ -446,7 +446,7 @@ def build_azure_app_configuration_check_snapshots_request( # pylint: disable=na _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) # Construct URL _url = "/snapshots" @@ -474,7 +474,7 @@ def build_azure_app_configuration_get_snapshot_request( # pylint: disable=name- _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.snapshot+json, application/problem+json") # Construct URL @@ -510,7 +510,7 @@ def build_azure_app_configuration_get_operation_details_request( # pylint: disa _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -533,7 +533,7 @@ def build_azure_app_configuration_create_snapshot_request( # pylint: disable=na _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.snapshot+json, application/problem+json") # Construct URL @@ -569,7 +569,7 @@ def build_azure_app_configuration_update_snapshot_request( # pylint: disable=na _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.snapshot+json, application/problem+json") # Construct URL @@ -610,7 +610,7 @@ def build_azure_app_configuration_check_snapshot_request( # pylint: disable=nam _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) # Construct URL _url = "/snapshots/{name}" path_format_arguments = { @@ -647,7 +647,7 @@ def build_azure_app_configuration_get_labels_request( # pylint: disable=name-to _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.labelset+json, application/problem+json") # Construct URL @@ -684,7 +684,7 @@ def build_azure_app_configuration_check_labels_request( # pylint: disable=name- _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) # Construct URL _url = "/labels" @@ -718,7 +718,7 @@ def build_azure_app_configuration_put_lock_request( # pylint: disable=name-too- _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.kv+json, application/problem+json") # Construct URL @@ -760,7 +760,7 @@ def build_azure_app_configuration_delete_lock_request( # pylint: disable=name-t _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.kv+json, application/problem+json") # Construct URL @@ -804,7 +804,7 @@ def build_azure_app_configuration_get_revisions_request( # pylint: disable=name _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) accept = _headers.pop("Accept", "application/vnd.microsoft.appconfig.kvset+json, application/problem+json") # Construct URL @@ -847,7 +847,7 @@ def build_azure_app_configuration_check_revisions_request( # pylint: disable=na _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2024-09-01")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-04-01")) # Construct URL _url = "/revisions" @@ -1353,7 +1353,7 @@ def check_key_values( @distributed_trace @api_version_validation( params_added_on={"2024-09-01": ["tags"]}, - api_versions_list=["2023-11-01", "2024-09-01"], + api_versions_list=["2023-11-01", "2024-09-01", "2026-04-01"], ) def get_key_value( self, @@ -1741,7 +1741,7 @@ def delete_key_value( @distributed_trace @api_version_validation( params_added_on={"2024-09-01": ["tags"]}, - api_versions_list=["2023-11-01", "2024-09-01"], + api_versions_list=["2023-11-01", "2024-09-01", "2026-04-01"], ) def check_key_value( self, diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_client.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_client.py index f5c918a2126f..08136942332c 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_client.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_client.py @@ -37,7 +37,7 @@ class AzureAppConfigurationClient(_AzureAppConfigurationClientOperationsMixin): credential type or a token credential type. Required. :type credential: ~azure.core.credentials.AzureKeyCredential or ~azure.core.credentials_async.AsyncTokenCredential - :keyword api_version: The API version to use for this operation. Known values are "2024-09-01" + :keyword api_version: The API version to use for this operation. Known values are "2026-04-01" and None. Default value is None. If not set, the operation's default API version will be used. Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_configuration.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_configuration.py index cdd3013454df..8d883e6ff8e0 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_configuration.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_configuration.py @@ -29,7 +29,7 @@ class AzureAppConfigurationClientConfiguration: # pylint: disable=too-many-inst credential type or a token credential type. Required. :type credential: ~azure.core.credentials.AzureKeyCredential or ~azure.core.credentials_async.AsyncTokenCredential - :keyword api_version: The API version to use for this operation. Known values are "2024-09-01" + :keyword api_version: The API version to use for this operation. Known values are "2026-04-01" and None. Default value is None. If not set, the operation's default API version will be used. Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str @@ -38,7 +38,7 @@ class AzureAppConfigurationClientConfiguration: # pylint: disable=too-many-inst def __init__( self, endpoint: str, credential: Union[AzureKeyCredential, "AsyncTokenCredential"], **kwargs: Any ) -> None: - api_version: str = kwargs.pop("api_version", "2024-09-01") + api_version: str = kwargs.pop("api_version", "2026-04-01") if endpoint is None: raise ValueError("Parameter 'endpoint' must not be None.") diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_operations/_operations.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_operations/_operations.py index 8d797711dafc..cf4aca4f9514 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_operations/_operations.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/aio/_operations/_operations.py @@ -548,7 +548,7 @@ async def check_key_values( @distributed_trace_async @api_version_validation( params_added_on={"2024-09-01": ["tags"]}, - api_versions_list=["2023-11-01", "2024-09-01"], + api_versions_list=["2023-11-01", "2024-09-01", "2026-04-01"], ) async def get_key_value( self, @@ -936,7 +936,7 @@ async def delete_key_value( @distributed_trace_async @api_version_validation( params_added_on={"2024-09-01": ["tags"]}, - api_versions_list=["2023-11-01", "2024-09-01"], + api_versions_list=["2023-11-01", "2024-09-01", "2026-04-01"], ) async def check_key_value( self, diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_enums.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_enums.py index 3de27b76bd96..dfc9dba30aa6 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_enums.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_enums.py @@ -25,6 +25,8 @@ class ConfigurationSettingFields(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Last modified field.""" TAGS = "tags" """Tags field.""" + DESCRIPTION = "description" + """Description field.""" LOCKED = "locked" """Locked field.""" ETAG = "etag" @@ -85,6 +87,8 @@ class SnapshotFields(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Items count field.""" TAGS = "tags" """Tags field.""" + DESCRIPTION = "description" + """Description field.""" ETAG = "etag" """Etag field.""" diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_models.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_models.py index 04e26ae75ac1..d51d26bb5742 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_models.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_models.py @@ -93,6 +93,8 @@ class KeyValue(_Model): :vartype last_modified: ~datetime.datetime :ivar tags: The tags of the key-value. :vartype tags: dict[str, str] + :ivar description: The description of the key-value. + :vartype description: str :ivar locked: Indicates whether the key-value is locked. :vartype locked: bool :ivar etag: A value representing the current state of the resource. @@ -113,6 +115,8 @@ class KeyValue(_Model): """A date representing the last time the key-value was modified.""" tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) """The tags of the key-value.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The description of the key-value.""" locked: Optional[bool] = rest_field(visibility=["read", "create", "update", "delete", "query"]) """Indicates whether the key-value is locked.""" etag: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) @@ -127,6 +131,7 @@ def __init__( value: Optional[str] = None, last_modified: Optional[datetime.datetime] = None, tags: Optional[dict[str, str]] = None, + description: Optional[str] = None, locked: Optional[bool] = None, etag: Optional[str] = None, ) -> None: ... @@ -283,6 +288,8 @@ class Snapshot(_Model): :vartype items_count: int :ivar tags: The tags of the snapshot. :vartype tags: dict[str, str] + :ivar description: The description of the snapshot. + :vartype description: str :ivar etag: A value representing the current state of the snapshot. :vartype etag: str """ @@ -315,6 +322,8 @@ class Snapshot(_Model): """The amount of key-values in the snapshot.""" tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) """The tags of the snapshot.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The description of the snapshot.""" etag: Optional[str] = rest_field(visibility=["read"]) """A value representing the current state of the snapshot.""" @@ -326,6 +335,7 @@ def __init__( composition_type: Optional[Union[str, "_models.SnapshotComposition"]] = None, retention_period: Optional[int] = None, tags: Optional[dict[str, str]] = None, + description: Optional[str] = None, ) -> None: ... @overload diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_patch.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_patch.py index 11f59a657781..86f2a597d998 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_patch.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_generated/models/_patch.py @@ -32,6 +32,8 @@ class KeyValue(_model_base.Model): :vartype last_modified: ~datetime.datetime :ivar tags: The tags of the key-value. :vartype tags: dict[str, str] + :ivar description: The description of the key-value. + :vartype description: str :ivar locked: Indicates whether the key-value is locked. :vartype locked: bool :ivar etag: A value representing the current state of the resource. @@ -50,6 +52,8 @@ class KeyValue(_model_base.Model): """A date representing the last time the key-value was modified.""" tags: Optional[Dict[str, str]] = rest_field() """The tags of the key-value.""" + description: Optional[str] = rest_field() + """The description of the key-value.""" locked: Optional[bool] = rest_field() """Indicates whether the key-value is locked.""" etag: Optional[str] = rest_field() @@ -65,6 +69,7 @@ def __init__( value: Optional[str] = None, last_modified: Optional[datetime.datetime] = None, tags: Optional[Dict[str, str]] = None, + description: Optional[str] = None, locked: Optional[bool] = None, etag: Optional[str] = None, ) -> None: ... diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_models.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_models.py index 2662ae2bcd8f..19d50919c47c 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_models.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/_models.py @@ -44,6 +44,8 @@ class ConfigurationSetting(Model): """Indicates whether the key-value is locked.""" tags: Dict[str, str] """The tags assigned to the configuration setting.""" + description: Optional[str] + """The description of the configuration setting.""" _attribute_map = { "etag": {"key": "etag", "type": "str"}, @@ -54,6 +56,7 @@ class ConfigurationSetting(Model): "last_modified": {"key": "last_modified", "type": "iso-8601"}, "read_only": {"key": "read_only", "type": "bool"}, "tags": {"key": "tags", "type": "{str}"}, + "description": {"key": "description", "type": "str"}, } kind = "Generic" @@ -69,6 +72,7 @@ def __init__(self, **kwargs: Any) -> None: self.last_modified = kwargs.get("last_modified", None) # type: ignore[assignment] self.read_only = kwargs.get("read_only", None) # type: ignore[assignment] self.tags = kwargs.get("tags", {}) + self.description = kwargs.get("description", None) @classmethod def _from_generated(cls, key_value: KeyValue) -> "ConfigurationSetting": @@ -100,6 +104,7 @@ def _from_generated(cls, key_value: KeyValue) -> "ConfigurationSetting": tags=key_value.tags, read_only=key_value.locked, etag=key_value.etag, + description=key_value.description, ) def _to_generated(self) -> KeyValue: @@ -112,6 +117,7 @@ def _to_generated(self) -> KeyValue: tags=self.tags, locked=self.read_only, etag=self.etag, + description=self.description, ) @@ -301,6 +307,8 @@ class SecretReferenceConfigurationSetting(ConfigurationSetting): """Indicates whether the key-value is locked.""" tags: Dict[str, str] """The tags assigned to the configuration setting.""" + description: Optional[str] + """The description of the configuration setting.""" _attribute_map = { "etag": {"key": "etag", "type": "str"}, @@ -311,6 +319,7 @@ class SecretReferenceConfigurationSetting(ConfigurationSetting): "last_modified": {"key": "last_modified", "type": "iso-8601"}, "read_only": {"key": "read_only", "type": "bool"}, "tags": {"key": "tags", "type": "{str}"}, + "description": {"key": "description", "type": "str"}, } _secret_reference_content_type = "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8" kind = "SecretReference" @@ -331,6 +340,7 @@ def __init__(self, key: str, secret_id: str, **kwargs: Any) -> None: # pylint: self.last_modified = kwargs.get("last_modified", None) # type: ignore[assignment] self.read_only = kwargs.get("read_only", None) # type: ignore[assignment] self.tags = kwargs.get("tags", {}) + self.description = kwargs.get("description", None) self.secret_id = secret_id self._value = json.dumps({"uri": secret_id}) @@ -377,6 +387,7 @@ def _from_generated(cls, key_value: KeyValue) -> "SecretReferenceConfigurationSe tags=key_value.tags, read_only=key_value.locked, etag=key_value.etag, + description=key_value.description, ) def _to_generated(self) -> KeyValue: @@ -389,6 +400,7 @@ def _to_generated(self) -> KeyValue: tags=self.tags, locked=self.read_only, etag=self.etag, + description=self.description, ) @@ -447,6 +459,8 @@ class ConfigurationSnapshot: # pylint: disable=too-many-instance-attributes """The tags of the configuration snapshot.""" etag: Optional[str] """A value representing the current state of the configuration snapshot.""" + description: Optional[str] + """The description of the configuration snapshot.""" def __init__( self, @@ -455,6 +469,7 @@ def __init__( composition_type: Optional[Union[str, SnapshotComposition]] = None, retention_period: Optional[int] = None, tags: Optional[Dict[str, str]] = None, + description: Optional[str] = None, ) -> None: """ :param filters: A list of filters used to filter the key-values included in the configuration snapshot. @@ -471,6 +486,8 @@ def __init__( :paramtype retention_period: int or None :keyword tags: The tags of the configuration snapshot. :paramtype tags: dict[str, str] or None + :keyword description: The description of the configuration snapshot. + :paramtype description: str or None """ self.name = None self.status = None @@ -483,6 +500,7 @@ def __init__( self.items_count = None self.tags = tags self.etag = None + self.description = description @classmethod def _from_generated(cls, generated: GeneratedConfigurationSnapshot) -> "ConfigurationSnapshot": @@ -504,6 +522,7 @@ def _from_generated(cls, generated: GeneratedConfigurationSnapshot) -> "Configur composition_type=cast(SnapshotComposition, generated.composition_type), retention_period=generated.retention_period, tags=generated.tags, + description=generated.description, ) snapshot.name = generated.name snapshot.status = generated.status @@ -539,6 +558,7 @@ def _from_deserialized( composition_type=cast(SnapshotComposition, deserialized.composition_type), retention_period=deserialized.retention_period, tags=deserialized.tags, + description=deserialized.description, ) snapshot.name = deserialized.name snapshot.status = deserialized.status @@ -559,6 +579,7 @@ def _to_generated(self) -> GeneratedConfigurationSnapshot: composition_type=self.composition_type, retention_period=self.retention_period, tags=self.tags, + description=self.description, ) diff --git a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/aio/_azure_appconfiguration_client_async.py b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/aio/_azure_appconfiguration_client_async.py index 7cbf38af5b62..66040aa9f80a 100644 --- a/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/aio/_azure_appconfiguration_client_async.py +++ b/sdk/appconfiguration/azure-appconfiguration/azure/appconfiguration/aio/_azure_appconfiguration_client_async.py @@ -690,6 +690,7 @@ async def begin_create_snapshot( composition_type: Optional[Union[str, SnapshotComposition]] = None, retention_period: Optional[int] = None, tags: Optional[Dict[str, str]] = None, + description: Optional[str] = None, **kwargs: Any, ) -> AsyncLROPoller[ConfigurationSnapshot]: """Create a snapshot of the configuration settings. @@ -711,13 +712,19 @@ async def begin_create_snapshot( :paramtype retention_period: int or None :keyword tags: The tags of the configuration snapshot. :paramtype tags: dict[str, str] or None + :keyword description: The description of the configuration snapshot. + :paramtype description: str or None :return: A poller for create configuration snapshot operation. Call `result()` on this object to wait for the operation to complete and get the created snapshot. :rtype: ~azure.core.polling.LROPoller[~azure.appconfiguration.ConfigurationSnapshot] :raises: :class:`~azure.core.exceptions.HttpResponseError` """ snapshot = ConfigurationSnapshot( - filters=filters, composition_type=composition_type, retention_period=retention_period, tags=tags + filters=filters, + composition_type=composition_type, + retention_period=retention_period, + tags=tags, + description=description, ) return cast( AsyncLROPoller[ConfigurationSnapshot], diff --git a/sdk/appconfiguration/azure-appconfiguration/tests/test_azure_appconfiguration_client.py b/sdk/appconfiguration/azure-appconfiguration/tests/test_azure_appconfiguration_client.py index 06a63556e8a9..b3e48edb4285 100644 --- a/sdk/appconfiguration/azure-appconfiguration/tests/test_azure_appconfiguration_client.py +++ b/sdk/appconfiguration/azure-appconfiguration/tests/test_azure_appconfiguration_client.py @@ -1074,10 +1074,6 @@ def test_list_snapshots(self, appconfiguration_endpoint_string, **kwargs): set_custom_default_matcher(compare_bodies=False, excluded_headers="x-ms-content-sha256,x-ms-date") self.set_up(appconfiguration_endpoint_string) - # Only list "ready" snapshots to avoid counting archived snapshots that may expire during test runs - result = self.client.list_snapshots(status=["ready"]) - initial_snapshots = len(list(result)) - variables = kwargs.pop("variables", {}) dynamic_snapshot_name_postfix = variables.setdefault("dynamic_snapshot_name_postfix", str(int(time.time()))) @@ -1093,8 +1089,12 @@ def test_list_snapshots(self, appconfiguration_endpoint_string, **kwargs): created_snapshot2 = response2.result() assert created_snapshot2.status == "ready" - result = self.client.list_snapshots(status=["ready"]) - assert len(list(result)) == initial_snapshots + 2 + # Verify both newly created snapshots appear in the "ready" listing. Asserting on the + # absolute count is unreliable in live mode where other test runs may leave snapshots + # behind, so we only require the snapshots we just created to be present. + ready_names = {s.name for s in self.client.list_snapshots(status=["ready"])} + assert snapshot_name1 in ready_names + assert snapshot_name2 in ready_names self.tear_down() return variables diff --git a/sdk/appconfiguration/azure-appconfiguration/tests/test_azure_appconfiguration_client_async.py b/sdk/appconfiguration/azure-appconfiguration/tests/test_azure_appconfiguration_client_async.py index 30fa05d74422..92dda975b3a9 100644 --- a/sdk/appconfiguration/azure-appconfiguration/tests/test_azure_appconfiguration_client_async.py +++ b/sdk/appconfiguration/azure-appconfiguration/tests/test_azure_appconfiguration_client_async.py @@ -1099,9 +1099,6 @@ async def test_list_snapshots(self, appconfiguration_endpoint_string, **kwargs): set_custom_default_matcher(compare_bodies=False, excluded_headers="x-ms-content-sha256,x-ms-date") await self.set_up(appconfiguration_endpoint_string) - result = await self.convert_to_list(self.client.list_snapshots(status=["ready"])) - initial_snapshots = len(result) - variables = kwargs.pop("variables", {}) dynamic_snapshot_name_postfix = variables.setdefault("dynamic_snapshot_name_postfix", str(int(time.time()))) @@ -1121,8 +1118,13 @@ async def test_list_snapshots(self, appconfiguration_endpoint_string, **kwargs): created_snapshot2 = await response2.result() assert created_snapshot2.status == "ready" - result = await self.convert_to_list(self.client.list_snapshots(status=["ready"])) - assert len(result) == initial_snapshots + 2 + # Verify both newly created snapshots appear in the "ready" listing. Asserting on the + # absolute count is unreliable in live mode where other test runs may leave snapshots + # behind, so we only require the snapshots we just created to be present. + ready_snapshots = await self.convert_to_list(self.client.list_snapshots(status=["ready"])) + ready_names = {s.name for s in ready_snapshots} + assert snapshot_name1 in ready_names + assert snapshot_name2 in ready_names await self.tear_down() return variables diff --git a/sdk/appconfiguration/azure-appconfiguration/tests/test_consistency.py b/sdk/appconfiguration/azure-appconfiguration/tests/test_consistency.py index d1ae04783da9..a97671d93f80 100644 --- a/sdk/appconfiguration/azure-appconfiguration/tests/test_consistency.py +++ b/sdk/appconfiguration/azure-appconfiguration/tests/test_consistency.py @@ -10,9 +10,18 @@ from consts import APPCONFIGURATION_ENDPOINT_STRING from devtools_testutils import EnvironmentVariableLoader, recorded_by_proxy, set_custom_default_matcher from azure.appconfiguration import ( + ConfigurationSetting, + ConfigurationSettingsFilter, + ConfigurationSnapshot, FeatureFlagConfigurationSetting, + SecretReferenceConfigurationSetting, FILTER_PERCENTAGE, ) +from azure.appconfiguration._generated.models import ( + KeyValue, + KeyValueFilter, + Snapshot as GeneratedSnapshot, +) AppConfigPreparer = functools.partial( EnvironmentVariableLoader, @@ -140,3 +149,83 @@ def test_feature_flag_different_key_and_id(self): assert feature_flag.feature_id == feature_id assert feature_flag.key == key + + def test_configuration_setting_description_defaults_to_none(self): + setting = ConfigurationSetting(key="k", label="l", value="v") + assert setting.description is None + + secret_ref = SecretReferenceConfigurationSetting(key="k", secret_id="https://vault.example/secrets/s") + assert secret_ref.description is None + + snapshot = ConfigurationSnapshot(filters=[ConfigurationSettingsFilter(key="k")]) + assert snapshot.description is None + + def test_configuration_setting_description_round_trip(self): + setting = ConfigurationSetting(key="k", label="l", value="v", description="kv-desc") + assert setting.description == "kv-desc" + + generated = setting._to_generated() + assert generated.description == "kv-desc" + + round_tripped = ConfigurationSetting._from_generated(generated) + assert isinstance(round_tripped, ConfigurationSetting) + assert not isinstance(round_tripped, FeatureFlagConfigurationSetting) + assert not isinstance(round_tripped, SecretReferenceConfigurationSetting) + assert round_tripped.description == "kv-desc" + + def test_secret_reference_configuration_setting_description_round_trip(self): + secret_ref = SecretReferenceConfigurationSetting( + key="k", + secret_id="https://vault.example/secrets/s", + description="sr-desc", + ) + assert secret_ref.description == "sr-desc" + + generated = secret_ref._to_generated() + assert generated.description == "sr-desc" + + round_tripped = ConfigurationSetting._from_generated(generated) + assert isinstance(round_tripped, SecretReferenceConfigurationSetting) + assert round_tripped.description == "sr-desc" + + def test_feature_flag_description_remains_feature_flag_json_description(self): + # FeatureFlagConfigurationSetting intentionally keeps `description` as the + # feature-flag JSON description; the KV-level description is not exposed on FF. + kv_value = json.dumps({"id": "Beta", "enabled": True, "description": "ff-json-desc"}) + kv = KeyValue( + key=".appconfig.featureflag/Beta", + content_type="application/vnd.microsoft.appconfig.ff+json;charset=utf-8", + value=kv_value, + description="kv-level-desc-should-be-ignored-on-ff", + ) + ff = ConfigurationSetting._from_generated(kv) + assert isinstance(ff, FeatureFlagConfigurationSetting) + assert ff.description == "ff-json-desc" + + ff.description = "updated-ff-json-desc" + generated = ff._to_generated() + # The KV-level description is not populated from FF; the FF JSON description + # is serialized inside `value`. + assert generated.description is None + assert json.loads(generated.value)["description"] == "updated-ff-json-desc" + + def test_configuration_snapshot_description_round_trip(self): + snapshot = ConfigurationSnapshot( + filters=[ConfigurationSettingsFilter(key="k")], + description="snap-desc", + ) + assert snapshot.description == "snap-desc" + + generated = snapshot._to_generated() + assert generated.description == "snap-desc" + + round_tripped = ConfigurationSnapshot._from_generated(generated) + assert round_tripped.description == "snap-desc" + + def test_configuration_snapshot_description_from_deserialized(self): + generated = GeneratedSnapshot( + filters=[KeyValueFilter(key="k")], + description="snap-from-deserialized", + ) + snapshot = ConfigurationSnapshot._from_deserialized(response=None, deserialized=generated, response_headers={}) + assert snapshot.description == "snap-from-deserialized" diff --git a/sdk/appconfiguration/azure-appconfiguration/tests/testcase.py b/sdk/appconfiguration/azure-appconfiguration/tests/testcase.py index 7ab2c1f148ec..2ca8681adfad 100644 --- a/sdk/appconfiguration/azure-appconfiguration/tests/testcase.py +++ b/sdk/appconfiguration/azure-appconfiguration/tests/testcase.py @@ -87,9 +87,14 @@ def _assert_same_keys(self, key1, key2): assert key1.enabled == key2.enabled if key1.filters and key2.filters: assert len(key1.filters) == len(key2.filters) + # On FeatureFlagConfigurationSetting, `description` represents the + # feature-flag JSON description, not the KV-level description. assert key1.description == key2.description elif isinstance(key1, SecretReferenceConfigurationSetting): assert key1.secret_id == key2.secret_id + assert key1.description == key2.description + else: + assert key1.description == key2.description def _assert_snapshots(self, snapshot: ConfigurationSnapshot, expected_snapshot: ConfigurationSnapshot): assert snapshot.composition_type == expected_snapshot.composition_type @@ -106,3 +111,4 @@ def _assert_snapshots(self, snapshot: ConfigurationSnapshot, expected_snapshot: assert snapshot.size == expected_snapshot.size assert snapshot.status == expected_snapshot.status assert snapshot.tags == expected_snapshot.tags + assert snapshot.description == expected_snapshot.description diff --git a/sdk/appconfiguration/azure-appconfiguration/tsp-location.yaml b/sdk/appconfiguration/azure-appconfiguration/tsp-location.yaml index 6de65d0ad69b..5e79ad4ad55e 100644 --- a/sdk/appconfiguration/azure-appconfiguration/tsp-location.yaml +++ b/sdk/appconfiguration/azure-appconfiguration/tsp-location.yaml @@ -1,4 +1,4 @@ -commit: 337bb8679bad87f26c74183095df1a0e0967d3b7 +commit: 609f05e331fd1b5b71ed2c476f0d356d25053c9a repo: Azure/azure-rest-api-specs directory: specification/appconfiguration/data-plane/AppConfiguration additionalDirectories: \ No newline at end of file