Skip to content

add convert_env_vars_from_list_of_dicts on backwards_compat_converters#47050

Open
s21lee wants to merge 16 commits intoapache:mainfrom
s21lee:add-convert_env_vars_from_list_of_dicts
Open

add convert_env_vars_from_list_of_dicts on backwards_compat_converters#47050
s21lee wants to merge 16 commits intoapache:mainfrom
s21lee:add-convert_env_vars_from_list_of_dicts

Conversation

@s21lee
Copy link
Copy Markdown

@s21lee s21lee commented Feb 25, 2025

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.rst or {issue_number}.significant.rst, in newsfragments.

Signed-off-by: s21.lee <s21.lee@samsung.com>
@boring-cyborg boring-cyborg bot added the provider:cncf-kubernetes Kubernetes (k8s) provider related issues label Feb 25, 2025
@boring-cyborg
Copy link
Copy Markdown

boring-cyborg bot commented Feb 25, 2025

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)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our pre-commits will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiuk
Copy link
Copy Markdown
Member

potiuk commented Feb 25, 2025

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

@s21lee
Copy link
Copy Markdown
Author

s21lee commented Feb 26, 2025

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.
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 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.

@s21lee
Copy link
Copy Markdown
Author

s21lee commented Mar 10, 2025

Hi, @jedcunningham @hussein-awala
If you have a time, would you like to review it?
Thank you.

@s21lee
Copy link
Copy Markdown
Author

s21lee commented Apr 1, 2025

Hi, @jedcunningham @hussein-awala
I'm still waiting :)

@s21lee s21lee marked this pull request as draft May 23, 2025 00:13
@s21lee s21lee marked this pull request as ready for review May 23, 2025 00:13
@github-actions
Copy link
Copy Markdown

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.

@github-actions github-actions bot added the stale Stale PRs per the .github/workflows/stale.yml policy file label Jul 29, 2025
@github-actions github-actions bot removed the stale Stale PRs per the .github/workflows/stale.yml policy file label Aug 1, 2025
Comment on lines +77 to +80
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
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And also I suggest adding tests for this

@s21lee s21lee requested a review from jscheffl as a code owner April 2, 2026 11:26
@jscheffl
Copy link
Copy Markdown
Contributor

jscheffl commented Apr 3, 2026

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(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for your code review. I will update it.

Comment on lines +131 to +135
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:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both variables are declared only for a single use. I'd assume it can be evaluated inline directly

Suggested change
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):

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for comments. I will add

Signed-off-by: s21.lee <s21.lee@samsung.com>
@s21lee
Copy link
Copy Markdown
Author

s21lee commented Apr 3, 2026

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.

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(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

provider:cncf-kubernetes Kubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants