add convert_env_vars_from_list_of_dicts on backwards_compat_converters#47050
add convert_env_vars_from_list_of_dicts on backwards_compat_converters#47050s21lee wants to merge 16 commits intoapache:mainfrom
Conversation
Signed-off-by: s21.lee <s21.lee@samsung.com>
|
Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
|
|
I don't think we ever look at PRs that do not explain what they are for in the description. I think it's quite an important thing to explain your intent if you want reviewers to take a look at it @s21lee |
Sorry for the lack of explanation—I had to create the PR in a hurry. This modification was made with backward compatibility in mind. To avoid this, I added the necessary code to convert the string dictionary list format into the V1EnvVar type. |
Signed-off-by: s21.lee <s21.lee@samsung.com>
...rs/cncf/kubernetes/tests/unit/cncf/kubernetes/backcompat/test_backwards_compat_converters.py
Outdated
Show resolved
Hide resolved
…t/test_backwards_compat_converters.py
|
Hi, @jedcunningham @hussein-awala |
|
Hi, @jedcunningham @hussein-awala |
|
This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 5 days if no further activity occurs. Thank you for your contributions. |
| if isinstance(env_vars, list) and \ | ||
| all(isinstance(item, dict) and "name" in item and "value" in item for item in env_vars): | ||
| return [k8s.V1EnvVar(name=env_var.get("name"), value=env_var.get("value")) for env_var in env_vars] | ||
| return env_vars |
There was a problem hiding this comment.
So if it is a list of dicts, yet one does not have the name / value key (or there is a none value) this will just return the env_vars which will raise an error, I think this needs to be addressed as well, also what about just allowing to pass a dict where the key is the env name, and the value is the value?
There was a problem hiding this comment.
And also I suggest adding tests for this
|
Backwards-compatibility is a bummer. Can you point me to the docs or specs of an old version where this list[dict[str, str]] is being defined? I could not find any. And if it a very old version I'd propose to add a deprecation marker and plan to clean such behavior up for one next release. |
Signed-off-by: s21.lee <s21.lee@samsung.com>
| stacklevel=2, | ||
| ) | ||
| return [_env_var_dict_to_v1(d, i) for i, d in enumerate(env_vars)] | ||
| raise AirflowException( |
There was a problem hiding this comment.
We defined as a community that that generic AirflowException is only existing for historic reasons. Codebase is in cleaning. Can you please use either a standard Python Exception (ValueErrormight be fitting here) or define a specific execption for this problem?
There was a problem hiding this comment.
Thank you for your code review. I will update it.
| all_v1 = all(isinstance(x, k8s.V1EnvVar) for x in env_vars) | ||
| all_dict = all(isinstance(x, dict) for x in env_vars) | ||
| if all_v1: | ||
| return env_vars | ||
| if all_dict: |
There was a problem hiding this comment.
Both variables are declared only for a single use. I'd assume it can be evaluated inline directly
| all_v1 = all(isinstance(x, k8s.V1EnvVar) for x in env_vars) | |
| all_dict = all(isinstance(x, dict) for x in env_vars) | |
| if all_v1: | |
| return env_vars | |
| if all_dict: | |
| if all(isinstance(x, k8s.V1EnvVar) for x in env_vars): | |
| return env_vars | |
| if all(isinstance(x, dict) for x in env_vars): |
There was a problem hiding this comment.
Thank you for comments. I will add
Signed-off-by: s21.lee <s21.lee@samsung.com>
I couldn’t find an official Airflow doc or type spec that defines env_vars as list[{"name": ..., "value": ...}] either. In practice it shows up from templated YAML/JSON and older community examples, not from a first-class API description. I’ve added a note in the convert_env_vars docstring stating that this list-of-dicts shape was not documented as a stable public API and that the supported styles are dict[str, str] (name → value) and list[k8s.V1EnvVar]. |
| if isinstance(name, str) and name and "value" in item: | ||
| return k8s.V1EnvVar(name=name, value=item["value"]) | ||
| if "name" in item and not isinstance(item["name"], str): | ||
| raise AirflowException( |
There was a problem hiding this comment.
There are some more AirflowExceptionto be replaced with ValueError.
|
|
||
|
|
||
| def convert_env_vars_or_raise_error(env_vars: list[k8s.V1EnvVar] | dict[str, str]) -> list[k8s.V1EnvVar]: | ||
| if not isinstance(env_vars, list): |
There was a problem hiding this comment.
What would be the type that is "working" and not breaking functionality that is not a list? (And that is passed w/o warning as accepted)
This modification was made with backward compatibility.
In the previous version, env_vars was passed as a list of dictionaries. However, in the current version, if it is not passed as a V1EnvVar type, it causes issues in other hooks and other components that use these variables.
To avoid this, I added the necessary code to convert the string dictionary list format into the V1EnvVar type.
^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named
{pr_number}.significant.rstor{issue_number}.significant.rst, in newsfragments.