Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
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
Prev Previous commit
Next Next commit
Updating Schema 2.0.0
  • Loading branch information
mrm9084 committed Feb 1, 2024
commit 6be10c806a3b2893fbed63daaade9e370971e3af
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
from ._models import AzureAppConfigurationKeyVaultOptions, SettingSelector
from ._constants import (
FEATURE_MANAGEMENT_KEY,
FEATURE_FLAG_KEY,
FEATURE_FLAG_PREFIX,
REQUEST_TRACING_DISABLED_ENVIRONMENT_VARIABLE,
ServiceFabricEnvironmentVariable,
Expand Down Expand Up @@ -548,7 +549,7 @@ def _load_all(self, **kwargs):
feature_flags, feature_flag_sentinel_keys = self._load_feature_flags(**kwargs)
if self._feature_flag_enabled:
configuration_settings[FEATURE_MANAGEMENT_KEY] = {}
configuration_settings[FEATURE_MANAGEMENT_KEY]["FeatureFlags"] = feature_flags
configuration_settings[FEATURE_MANAGEMENT_KEY][FEATURE_FLAG_KEY] = feature_flags
self._refresh_on_feature_flags = feature_flag_sentinel_keys
with self._update_lock:
self._refresh_on = sentinel_keys
Expand Down Expand Up @@ -579,17 +580,15 @@ def _load_configuration_settings(self, **kwargs):

def _load_feature_flags(self, **kwargs):
feature_flag_sentinel_keys = {}
loaded_feature_flags = {}
loaded_feature_flags = []
kwargs.pop("sentinel_keys", None)
if self._feature_flag_enabled:
for select in self._feature_flag_selectors:
feature_flags = self._client.list_configuration_settings(
key_filter=FEATURE_FLAG_PREFIX + select.key_filter, label_filter=select.label_filter, **kwargs
)
for feature_flag in feature_flags:
key = self._process_key_name(feature_flag)
value = json.loads(feature_flag.value)
loaded_feature_flags[key] = value
loaded_feature_flags.append(json.loads(feature_flag.value))

if self._feature_flag_refresh_enabled:
feature_flag_sentinel_keys[(feature_flag.key, feature_flag.label)] = feature_flag.etag
Expand All @@ -598,17 +597,6 @@ def _load_feature_flags(self, **kwargs):
def _process_key_name(self, config):
trimmed_key = config.key
# Trim the key if it starts with one of the prefixes provided

# Feature Flags have there own prefix, so we need to trim that first
if isinstance(config, FeatureFlagConfigurationSetting):
if trimmed_key.startswith(FEATURE_FLAG_PREFIX):
trimmed_key = trimmed_key[len(FEATURE_FLAG_PREFIX) :]
for trim in self._feature_flag_trim_prefixes:
if trimmed_key.startswith(trim):
trimmed_key = trimmed_key[len(trim) :]
break
return trimmed_key

for trim in self._trim_prefixes:
if config.key.startswith(trim):
trimmed_key = config.key[len(trim) :]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
# -------------------------------------------------------------------------

FEATURE_MANAGEMENT_KEY = "FeatureManagement"
FEATURE_FLAG_KEY = "FeatureFlags"
FEATURE_FLAG_PREFIX = ".appconfig.featureflag/"

EMPTY_LABEL = "\0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from .._models import AzureAppConfigurationKeyVaultOptions, SettingSelector
from .._constants import (
FEATURE_MANAGEMENT_KEY,
FEATURE_FLAG_KEY,
FEATURE_FLAG_PREFIX,
EMPTY_LABEL,
)
Expand Down Expand Up @@ -483,7 +484,8 @@ async def _load_all(self, **kwargs):
configuration_settings, sentinel_keys = await self._load_configuration_settings(**kwargs)
feature_flags, feature_flag_sentinel_keys = await self._load_feature_flags(**kwargs)
if self._feature_flag_enabled:
configuration_settings[FEATURE_MANAGEMENT_KEY] = feature_flags
configuration_settings[FEATURE_MANAGEMENT_KEY] = {}
configuration_settings[FEATURE_MANAGEMENT_KEY][FEATURE_FLAG_KEY] = feature_flags
self._refresh_on_feature_flags = feature_flag_sentinel_keys
with self._update_lock:
self._refresh_on = sentinel_keys
Expand Down Expand Up @@ -514,7 +516,7 @@ async def _load_configuration_settings(self, **kwargs):

async def _load_feature_flags(self, **kwargs):
feature_flag_sentinel_keys = {}
loaded_feature_flags = {}
loaded_feature_flags = []
# Needs to be removed unknown keyword argument for list_configuration_settings
kwargs.pop("sentinel_keys", self._refresh_on)
if self._feature_flag_enabled:
Expand All @@ -523,26 +525,14 @@ async def _load_feature_flags(self, **kwargs):
key_filter=FEATURE_FLAG_PREFIX + select.key_filter, label_filter=select.label_filter, **kwargs
)
async for feature_flag in feature_flags:
key = self._process_key_name(feature_flag)
loaded_feature_flags[key] = feature_flag.value
loaded_feature_flags.append(json.loads(feature_flag.value))
if self._feature_flag_refresh_enabled:
feature_flag_sentinel_keys[(feature_flag.key, feature_flag.label)] = feature_flag.etag
return loaded_feature_flags, feature_flag_sentinel_keys

def _process_key_name(self, config):
trimmed_key = config.key
# Trim the key if it starts with one of the prefixes provided

# Feature Flags have there own prefix, so we need to trim that first
if isinstance(config, FeatureFlagConfigurationSetting):
if trimmed_key.startswith(FEATURE_FLAG_PREFIX):
trimmed_key = trimmed_key[len(FEATURE_FLAG_PREFIX) :]
for trim in self._feature_flag_trim_prefixes:
if trimmed_key.startswith(trim):
trimmed_key = trimmed_key[len(trim) :]
break
return trimmed_key

for trim in self._trim_prefixes:
if config.key.startswith(trim):
trimmed_key = config.key[len(trim) :]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,9 @@ async def setup_configs(client, keyvault_secret_url):
async with client:
for config in get_configs(keyvault_secret_url):
await client.set_configuration_setting(config)

def has_feature_flag(client, feature_id):
for feature_flag in client["FeatureManagement"]["FeatureFlags"]:
if feature_flag["id"] == feature_id:
return True
return False
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@
from azure.appconfiguration.provider import SettingSelector, AzureAppConfigurationKeyVaultOptions
from devtools_testutils.aio import recorded_by_proxy_async
from async_preparers import app_config_decorator_async
from asynctestcase import AppConfigTestCase
from asynctestcase import AppConfigTestCase, has_feature_flag


class TestAppConfigurationProvider(AppConfigTestCase):
# method: provider_creation
@app_config_decorator_async
@recorded_by_proxy_async
async def test_provider_creation(self, appconfiguration_connection_string, appconfiguration_keyvault_secret_url):
breakpoint()
async with await self.create_client(
appconfiguration_connection_string,
keyvault_secret_url=appconfiguration_keyvault_secret_url,
Expand All @@ -22,7 +23,7 @@ async def test_provider_creation(self, appconfiguration_connection_string, appco
assert client["message"] == "hi"
assert client["my_json"]["key"] == "value"
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]
assert has_feature_flag(client, "Alpha")

# method: provider_trim_prefixes
@app_config_decorator_async
Expand All @@ -42,7 +43,7 @@ async def test_provider_trim_prefixes(
assert client["trimmed"] == "key"
assert "test.trimmed" not in client
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]
assert has_feature_flag(client, "Alpha")

# method: provider_selectors
@app_config_decorator_async
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from devtools_testutils.aio import recorded_by_proxy_async
from azure.appconfiguration.aio import AzureAppConfigurationClient
from async_preparers import app_config_decorator_async
from asynctestcase import AppConfigTestCase
from asynctestcase import AppConfigTestCase, has_feature_flag


class TestAppConfigurationProvider(AppConfigTestCase):
Expand All @@ -24,7 +24,7 @@ async def test_provider_creation_aad(self, appconfiguration_endpoint_string, app
assert client.get("message") == "hi"
assert client["my_json"]["key"] == "value"
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]
assert has_feature_flag(client, "Alpha")

# method: provider_trim_prefixes
@app_config_decorator_async
Expand All @@ -41,7 +41,7 @@ async def test_provider_trim_prefixes(self, appconfiguration_endpoint_string, ap
assert client["my_json"]["key"] == "value"
assert client["trimmed"] == "key"
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]
assert has_feature_flag(client, "Alpha")

# method: provider_selectors
@app_config_decorator_async
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from azure.appconfiguration.aio import AzureAppConfigurationClient
from devtools_testutils.aio import recorded_by_proxy_async
from async_preparers import app_config_decorator_async
from asynctestcase import AppConfigTestCase, setup_configs
from asynctestcase import AppConfigTestCase, setup_configs, has_feature_flag


from azure.appconfiguration.provider._azureappconfigurationprovider import _delay_failure
Expand All @@ -26,7 +26,7 @@ async def test_load_only_feature_flags(self, appconfiguration_connection_string)
) as client:
assert len(client.keys()) == 1
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]
assert has_feature_flag(client, "Alpha")

# method: load
@app_config_decorator_async
Expand All @@ -44,23 +44,4 @@ async def test_select_feature_flags(self, appconfiguration_connection_string):
) as client:
assert len(client.keys()) == 1
assert "FeatureManagement" in client
assert "Alpha" not in client["FeatureManagement"]

# method: load
@app_config_decorator_async
@recorded_by_proxy_async
async def test_trim_feature_flags(self, appconfiguration_connection_string):
client = AzureAppConfigurationClient.from_connection_string(appconfiguration_connection_string)
await setup_configs(client, None)

async with await load(
connection_string=appconfiguration_connection_string,
selects=[],
feature_flag_enabled=True,
feature_flag_trim_prefixes=["Al"],
user_agent="SDK/Integration",
) as client:
assert len(client.keys()) == 1
assert "FeatureManagement" in client
assert "Alpha" not in client["FeatureManagement"]
assert "pha" in client["FeatureManagement"]
assert not has_feature_flag(client, "Alpha")
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from azure.appconfiguration.provider import WatchKey
from devtools_testutils.aio import recorded_by_proxy_async
from async_preparers import app_config_decorator_async
from asynctestcase import AppConfigTestCase
from asynctestcase import AppConfigTestCase, has_feature_flag


try:
Expand All @@ -37,7 +37,7 @@ async def test_refresh(self, appconfiguration_endpoint_string, appconfiguration_
assert client["refresh_message"] == "original value"
assert client["my_json"]["key"] == "value"
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]
assert has_feature_flag(client, "Alpha")
setting = await client._client.get_configuration_setting(key="refresh_message")
setting.value = "updated value"
await client._client.set_configuration_setting(setting)
Expand Down Expand Up @@ -91,7 +91,7 @@ async def test_empty_refresh(self, appconfiguration_endpoint_string, appconfigur
assert client["non_refreshed_message"] == "Static"
assert client["my_json"]["key"] == "value"
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]
assert has_feature_flag(client, "Alpha")
setting = await client._client.get_configuration_setting(key="refresh_message")
setting.value = "updated value"
await client._client.set_configuration_setting(setting)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from azure.appconfiguration.provider import SettingSelector, AzureAppConfigurationKeyVaultOptions
from devtools_testutils import recorded_by_proxy
from preparers import app_config_decorator
from testcase import AppConfigTestCase
from testcase import AppConfigTestCase, has_feature_flag
import datetime
from unittest.mock import patch

Expand All @@ -30,7 +30,7 @@ def test_provider_creation(self, appconfiguration_connection_string, appconfigur
assert client["message"] == "hi"
assert client["my_json"]["key"] == "value"
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]["FeatureFlags"]
assert has_feature_flag(client, "Alpha")

# method: provider_trim_prefixes
@recorded_by_proxy
Expand All @@ -48,7 +48,7 @@ def test_provider_trim_prefixes(self, appconfiguration_connection_string, appcon
assert client["trimmed"] == "key"
assert "test.trimmed" not in client
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]["FeatureFlags"]
assert has_feature_flag(client, "Alpha")

# method: provider_selectors
@recorded_by_proxy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from azure.appconfiguration.provider import SettingSelector, AzureAppConfigurationKeyVaultOptions
from devtools_testutils import recorded_by_proxy
from preparers import app_config_decorator_aad
from testcase import AppConfigTestCase
from testcase import AppConfigTestCase, has_feature_flag


class TestAppConfigurationProvider(AppConfigTestCase):
Expand All @@ -22,7 +22,7 @@ def test_provider_creation_aad(self, appconfiguration_endpoint_string, appconfig
assert client["message"] == "hi"
assert client["my_json"]["key"] == "value"
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]["FeatureFlags"]
assert has_feature_flag(client, "Alpha")

# method: provider_trim_prefixes
@recorded_by_proxy
Expand All @@ -40,7 +40,7 @@ def test_provider_trim_prefixes(self, appconfiguration_endpoint_string, appconfi
assert client["trimmed"] == "key"
assert "test.trimmed" not in client
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]["FeatureFlags"]
assert has_feature_flag(client, "Alpha")

# method: provider_selectors
@recorded_by_proxy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from azure.appconfiguration import AzureAppConfigurationClient
from devtools_testutils import recorded_by_proxy
from preparers import app_config_decorator
from testcase import AppConfigTestCase, setup_configs
from testcase import AppConfigTestCase, setup_configs, has_feature_flag
from unittest.mock import patch

from azure.appconfiguration.provider._azureappconfigurationprovider import _delay_failure
Expand All @@ -25,7 +25,7 @@ def test_load_only_feature_flags(self, appconfiguration_connection_string):
)
assert len(client.keys()) == 1
assert "FeatureManagement" in client
assert "Alpha" in client["FeatureManagement"]["FeatureFlags"]
assert has_feature_flag(client, "Alpha")

# method: load
@recorded_by_proxy
Expand All @@ -43,23 +43,4 @@ def test_select_feature_flags(self, appconfiguration_connection_string):
)
assert len(client.keys()) == 1
assert "FeatureManagement" in client
assert "Alpha" not in client["FeatureManagement"]["FeatureFlags"]

# method: load
@recorded_by_proxy
@app_config_decorator
def test_trim_feature_flags(self, appconfiguration_connection_string):
client = AzureAppConfigurationClient.from_connection_string(appconfiguration_connection_string)
setup_configs(client, None)

client = load(
connection_string=appconfiguration_connection_string,
selects=[],
feature_flag_enabled=True,
feature_flag_trim_prefixes=["Al"],
user_agent="SDK/Integration",
)
assert len(client.keys()) == 1
assert "FeatureManagement" in client
assert "Alpha" not in client["FeatureManagement"]["FeatureFlags"]
assert "pha" in client["FeatureManagement"]["FeatureFlags"]
assert not has_feature_flag(client, "Alpha")
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,9 @@ def create_feature_flag_config_setting(key, label, enabled):
label=label,
enabled=enabled,
)

def has_feature_flag(client, feature_id):
for feature_flag in client["FeatureManagement"]["FeatureFlags"]:
if feature_flag["id"] == feature_id:
return True
return False