Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
378 changes: 314 additions & 64 deletions sdk/appconfiguration/azure-appconfiguration-provider/README.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ pip install azure.appconfiguration.provider

| File | Description |
|-------------|-------------|
| aad_sample.py | demos connecting to app configuration with Azure Active Directory |
| entra_id_sample.py | demos connecting to app configuration with Entra ID |
| connection_string_sample.py | demos connecting to app configuration with a Connection String |
| key_vault_reference_sample.py | demos resolving key vault references with App Configuration |

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,22 @@ async def main():
credential = get_credential(authority, is_async=True)
kwargs = get_client_modifications()

# Connecting to Azure App Configuration using AAD
# [START create_provider_entra_id_async]
from azure.appconfiguration.provider.aio import load

# Connecting to Azure App Configuration using Entra ID
config = await load(endpoint=endpoint, credential=credential, **kwargs)
print(config["message"])

await credential.close()
await config.close()
# [END create_provider_entra_id_async]

# Connecting to Azure App Configuration using AAD and trim key prefixes
# [START trim_prefixes_entra_id_async]
# Connecting to Azure App Configuration using Entra ID and trim key prefixes
trimmed = ["test."]
config = await load(endpoint=endpoint, credential=credential, trim_prefixes=trimmed, **kwargs)
# [END trim_prefixes_entra_id_async]

print(config["message"])

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ async def main():
credential = get_credential(authority, is_async=True)
kwargs = get_client_modifications()

# Connection to Azure App Configuration using AAD with Provided Client
# Connection to Azure App Configuration using Entra ID with Provided Client
client_configs = {key_vault_uri: {"credential": credential}}
selects = [SettingSelector(key_filter="*", label_filter="prod")]
config = await load(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ async def main():
credential = get_credential(authority, is_async=True)
kwargs = get_client_modifications()

# Connection to Azure App Configuration using AAD and Resolving Key Vault References
# Connection to Azure App Configuration using Entra ID and Resolving Key Vault References
selects = [SettingSelector(key_filter="*", label_filter="prod")]

config = await load(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,36 @@
kwargs = get_client_modifications()
connection_string = os.environ["APPCONFIGURATION_CONNECTION_STRING"]

# [START create_provider_connection_string]
import os
from azure.appconfiguration.provider import load

connection_string = os.environ["APPCONFIGURATION_CONNECTION_STRING"]

# Connecting to Azure App Configuration using connection string
config = load(connection_string=connection_string, **kwargs)
config = load(connection_string=connection_string)
# [END create_provider_connection_string]

print(config["message"])
print(config["my_json"]["key"])

# [START trim_prefixes_connection_string]
from azure.appconfiguration.provider import load

# Connecting to Azure App Configuration using connection string and trimmed key prefixes
trimmed = ["test."]
config = load(connection_string=connection_string, trim_prefixes=trimmed, **kwargs)
# [END trim_prefixes_connection_string]

print(config["message"])

# [START setting_selector_connection_string]
from azure.appconfiguration.provider import load, SettingSelector

# Connection to Azure App Configuration using SettingSelector
selects = [SettingSelector(key_filter="message*")]
config = load(connection_string=connection_string, selects=selects, **kwargs)
# [END setting_selector_connection_string]

print("message found: " + str("message" in config))
print("test.message found: " + str("test.message" in config))
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# ------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# -------------------------------------------------------------------------
import os
from sample_utilities import get_authority, get_credential, get_client_modifications
from azure.appconfiguration.provider import load, SettingSelector

endpoint = os.environ.get("APPCONFIGURATION_ENDPOINT_STRING")
authority = get_authority(endpoint)
credential = get_credential(authority)
kwargs = get_client_modifications()

# [START create_provider_entra_id]
import os
from azure.appconfiguration.provider import load
from azure.identity import DefaultAzureCredential

endpoint = os.environ["APPCONFIGURATION_ENDPOINT_STRING"]
credential = DefaultAzureCredential()

# Connecting to Azure App Configuration using Entra ID
config = load(endpoint=endpoint, credential=credential)
# [END create_provider_entra_id]

print(config["message"])

# [START trim_prefixes_entra_id]
from azure.appconfiguration.provider import load

# Connecting to Azure App Configuration using Entra ID and trim key prefixes
trimmed = ["test."]
config = load(endpoint=endpoint, credential=credential, trim_prefixes=trimmed, **kwargs)
# [END trim_prefixes_entra_id]

print(config["message"])

# [START setting_selector_entra_id]
from azure.appconfiguration.provider import load, SettingSelector

# Connection to Azure App Configuration using SettingSelector
selects = [SettingSelector(key_filter="message*")]
config = load(
endpoint=endpoint,
credential=credential,
selects=selects,
feature_flag_enabled=True,
feature_flag_selectors=None,
**kwargs,
)
# [END setting_selector_entra_id]

print("message found: " + str("message" in config))
print("test.message found: " + str("test.message" in config))
print("feature_flag_enabled found: " + str(config.get("feature_management")))

# [START tag_filters]
from azure.appconfiguration.provider import load, SettingSelector

# Filtering by tags
selects = [SettingSelector(key_filter="*", tag_filters=["env=prod"])]
config = load(endpoint=endpoint, credential=credential, selects=selects, **kwargs)
# [END tag_filters]

# [START geo_replication_disable_discovery]
from azure.appconfiguration.provider import load

# Disabling replica discovery
config = load(endpoint=endpoint, credential=credential, replica_discovery_enabled=False, **kwargs)
# [END geo_replication_disable_discovery]

# [START geo_replication_load_balancing]
from azure.appconfiguration.provider import load

# Enabling load balancing across replicas
config = load(endpoint=endpoint, credential=credential, load_balancing_enabled=True, **kwargs)
# [END geo_replication_load_balancing]

# [START feature_flag_loading]
from azure.appconfiguration.provider import load

config = load(endpoint=endpoint, credential=credential, feature_flag_enabled=True, **kwargs)
feature_flags = config["feature_management"]["feature_flags"]
alpha = next(flag for flag in feature_flags if flag["id"] == "Alpha")
print(alpha["enabled"])
# [END feature_flag_loading]

# [START feature_flag_selector]
from azure.appconfiguration.provider import load, SettingSelector

config = load(
endpoint=endpoint,
credential=credential,
feature_flag_enabled=True,
feature_flag_selectors=[SettingSelector(key_filter="*", label_filter="dev")],
**kwargs,
)
feature_flags = config["feature_management"]["feature_flags"]
alpha = next(flag for flag in feature_flags if flag["id"] == "Alpha")
print(alpha["enabled"])
# [END feature_flag_selector]

# [START json_content_type]
from azure.appconfiguration.provider import load

# Settings with JSON content type are automatically deserialized
config = load(endpoint=endpoint, credential=credential, **kwargs)
app_config = config["app/config"] # Returns a dict if the value is JSON
print(app_config["timeout"])
# [END json_content_type]

# [START configuration_mapper]
from azure.appconfiguration.provider import load


def my_mapper(setting):
# Transform the setting as needed
setting.value = setting.value.strip()


config = load(endpoint=endpoint, credential=credential, configuration_mapper=my_mapper, **kwargs)
# [END configuration_mapper]

# [START startup_timeout]
from azure.appconfiguration.provider import load

config = load(endpoint=endpoint, credential=credential, startup_timeout=200, **kwargs)
# [END startup_timeout]
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,19 @@
credential = get_credential(authority)
kwargs = get_client_modifications()

# Connection to Azure App Configuration using AAD with Provided Client
# [START key_vault_reference_customized_clients]
from azure.appconfiguration.provider import load, SettingSelector

# Connection to Azure App Configuration using Entra ID with Provided Client
client_configs = {key_vault_uri: {"credential": credential}}
selects = [SettingSelector(key_filter="*", label_filter="prod")]
config = load(
endpoint=endpoint, credential=credential, keyvault_client_configs=client_configs, selects=selects, **kwargs
endpoint=endpoint,
credential=credential,
keyvault_client_configs=client_configs,
selects=selects,
**kwargs,
)
# [END key_vault_reference_customized_clients]

print(config["secret"])
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,41 @@
credential = get_credential(authority)
kwargs = get_client_modifications()

# Connection to Azure App Configuration using AAD and Resolving Key Vault References
# [START key_vault_reference]
from azure.appconfiguration.provider import load, SettingSelector

# Connection to Azure App Configuration using Entra ID and Resolving Key Vault References
selects = [SettingSelector(key_filter="*", label_filter="prod")]

config = load(endpoint=endpoint, credential=credential, keyvault_credential=credential, selects=selects, **kwargs)
# [END key_vault_reference]

print(config["secret"])

# [START key_vault_reference_secret_resolver]
from azure.appconfiguration.provider import load


def secret_resolver(uri):
return "From Secret Resolver"


config = load(endpoint=endpoint, credential=credential, secret_resolver=secret_resolver, **kwargs)
# [END key_vault_reference_secret_resolver]

print(config["secret"])

# [START key_vault_reference_secret_refresh_interval]
from azure.appconfiguration.provider import load

# Refresh Key Vault secrets every 120 seconds
config = load(
endpoint=endpoint,
credential=credential,
keyvault_credential=credential,
secret_refresh_interval=120,
**kwargs,
)
# [END key_vault_reference_secret_refresh_interval]

print(config["secret"])
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,20 @@ def my_callback_on_fail(_):
rand = random.random()
watch_key = WatchKey("message" + str(rand))

# Connecting to Azure App Configuration using connection string, and refreshing when the configuration setting message
# changes
# [START refresh_provider]
import os
from azure.appconfiguration.provider import load, WatchKey

connection_string = os.environ["APPCONFIGURATION_CONNECTION_STRING"]

config = load(
connection_string=connection_string,
refresh_on=[WatchKey("Sentinel")],
refresh_interval=60,
)
# [END refresh_provider]

# Reload with test-specific configuration
config = load(
connection_string=connection_string,
refresh_on=[watch_key],
Expand All @@ -44,6 +56,10 @@ def my_callback_on_fail(_):
print(config["message"])
print(config["my_json"]["key"])

# [START refresh_call]
config.refresh()
# [END refresh_call]

# Updating the configuration setting
configuration_setting.value = "Hello World Updated!"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,23 @@ def my_callback_on_fail(_):
print("Refresh failed!")


# Connecting to Azure App Configuration using connection string, and refreshing when the configuration setting message
# changes
# [START refresh_feature_flags]
import os
from azure.appconfiguration.provider import load, WatchKey

connection_string = os.environ["APPCONFIGURATION_CONNECTION_STRING"]

config = load(
connection_string=connection_string,
refresh_on=[WatchKey("message")],
refresh_on_feature_flags=True,
refresh_interval=60,
feature_flag_enabled=True,
feature_flag_refresh_enabled=True,
)
# [END refresh_feature_flags]

# Reload with test-specific configuration
config = load(
connection_string=connection_string,
refresh_on=[WatchKey("message")],
Expand Down
Loading