Description
Summary
Hello there! I hope you all are doing well
I'm working on the AppConfig provider for typescript powertools and I want to address some questions and concerns to the python team. I hope you'll help me to figure that out.
-
We have a conversation here about the return type of function
_get
inappconfig.py
. As I understand return value from AppConfig should be returned as is. The same I see in the docs example. That is why I think you missed it in PR fix(parameters): appconfig transform and return types #877 please clarify this for me if I'm wrong. -
I'm concerned about
_get
function logic. What if we need two different configuration profiles for the save application and environment?
appconf_provider = parameters.AppConfigProvider(environment="my_env", application="my_app", config=config)
def handler(event, context):
value1: bytes = appconf_provider.get("my_conf_A")
value2: bytes = appconf_provider.get("my_conf_B")
with the value1
we start_configuration_session
and get InitialConfigurationToken
which encapsulates
sdk_options["ConfigurationProfileIdentifier"] = name
sdk_options["ApplicationIdentifier"] = self.application
sdk_options["EnvironmentIdentifier"] = self.environment
We use that initial token in the subsequent API call (the request consists of the token only) to get my_conf_A
configuration and NextPollConfigurationToken
. After that, we save NextPollConfigurationToken
in this._next_token
.
Not we want to get "my_conf_B"
and store it in value2
.
_get
function check for self._next_token
existence and make an API call with the existent NextPollConfigurationToken
which encapsulates ConfigurationProfileIdentifier
with my_conf_A
in it and completely ignores name
argument.
I assume we get the same values in value1
and value2
. I'm not sure if is it a real-world situation, but as I understand, for the same application and environment, we can have several configuration profiles. Docs section.
There is also an unused self.current_version = ""
in the class.
- Other small things I noticed:
- I'm not too much into python, but when I looked at the
_get_multiple
function I noticed that you raise NotImplementedError() in derived class and the docs say thatIt should not be used to indicate that an operator or method is not meant to be supported at all – in that case either leave the operator / method undefined or, if a subclass, set it to None.
Maybe it's not an issue – let me know! - In the docs example, I think the comment was copy-pasted from the secrets section, maybe you should consider it to change to
# Retrieve the latest configuration
.
Why is this needed?
To provide consistency across implementations in different languages.
Which area does this relate to?
Parameters, Typing
Solution
A possible solution for the return type:
In the appconfig.py
Current return type: def _get(self, name: str, **sdk_options) -> str:
Suggested return type: def _get(self, name: str, **sdk_options) -> bytes:
A possible solution for the method logic:
Store name
from the previous call along with NextPollConfigurationToken
and flush self._next_token
and self.last_returned_value
if name
is different from the previous call.
Another option is to use dict
to store NextPollConfigurationToken
tokens with name
as the key. But it increases complexity, cause in this case you should also store last_returned_value
for each token. I think flush and starting a new session is the better option.
All best,
Sergei.
Acknowledgment
- This request meets Lambda Powertools Tenets
- Should this be considered in other Lambda Powertools languages? i.e. Java, TypeScript