This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 6362ba5ab4 Move writing configuration for webserver to main (webserver 
limited) (#32766)
6362ba5ab4 is described below

commit 6362ba5ab45a38008814616df4e17717cc3726c3
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sun Jul 23 08:26:54 2023 +0200

    Move writing configuration for webserver to main (webserver limited) 
(#32766)
    
    So far configuration was automatically written no matter what command
    has been invoked. This means tha webserver configuration is stored
    for all components, where it was only really needed for webserver.
    
    This small change moves the place where configuration writing is
    invoked  - webserver configuration will only be automatically
    checked for and written when webserver command has been invoked
    via __main__ entrypoint.
    
    This has also the nice side-effect that it is not written during
    tests, or when airflow is just imported.
---
 airflow/__main__.py           |  7 ++++++-
 airflow/configuration.py      | 12 +++++++++---
 tests/www/views/test_views.py |  5 +++--
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/airflow/__main__.py b/airflow/__main__.py
index c15f75b4b9..c88f655bee 100644
--- a/airflow/__main__.py
+++ b/airflow/__main__.py
@@ -34,6 +34,7 @@ import argcomplete
 # any possible import cycles with settings downstream.
 from airflow import configuration
 from airflow.cli import cli_parser
+from airflow.configuration import write_webserver_configuration_if_needed
 
 
 def main():
@@ -52,7 +53,11 @@ def main():
         # in main ensures that it is not done during tests and other ways 
airflow imports are used
         from airflow.configuration import 
write_default_airflow_configuration_if_needed
 
-        write_default_airflow_configuration_if_needed()
+        conf = write_default_airflow_configuration_if_needed()
+
+        if args.subcommand == "webserver":
+            write_webserver_configuration_if_needed(conf)
+
     args.func(args)
 
 
diff --git a/airflow/configuration.py b/airflow/configuration.py
index 317c10c013..cca5588e54 100644
--- a/airflow/configuration.py
+++ b/airflow/configuration.py
@@ -47,6 +47,7 @@ from airflow.exceptions import AirflowConfigException
 from airflow.secrets import DEFAULT_SECRETS_SEARCH_PATH, BaseSecretsBackend
 from airflow.utils import yaml
 from airflow.utils.module_loading import import_string
+from airflow.utils.providers_configuration_loader import 
providers_configuration_loaded
 from airflow.utils.weight_rule import WeightRule
 
 log = logging.getLogger(__name__)
@@ -1928,7 +1929,7 @@ def 
create_default_config_parser(configuration_description: dict[str, dict[str,
     return parser
 
 
-def write_default_airflow_configuration_if_needed():
+def write_default_airflow_configuration_if_needed() -> AirflowConfigParser:
     if not os.path.isfile(AIRFLOW_CONFIG):
         log.debug("Creating new Airflow config file in: %s", AIRFLOW_CONFIG)
         pathlib.Path(AIRFLOW_HOME).mkdir(parents=True, exist_ok=True)
@@ -1949,6 +1950,7 @@ def write_default_airflow_configuration_if_needed():
                 only_defaults=True,
             )
         make_group_other_inaccessible(AIRFLOW_CONFIG)
+    return conf
 
 
 def load_standard_airflow_configuration(airflow_config_parser: 
AirflowConfigParser):
@@ -1992,7 +1994,6 @@ def initialize_config() -> AirflowConfigParser:
 
     Called for you automatically as part of the Airflow boot process.
     """
-    global WEBSERVER_CONFIG
     airflow_config_parser = AirflowConfigParser()
     if airflow_config_parser.getboolean("core", "unit_test_mode"):
         airflow_config_parser.load_test_config()
@@ -2004,6 +2005,12 @@ def initialize_config() -> AirflowConfigParser:
         if airflow_config_parser.getboolean("core", "unit_test_mode"):
             airflow_config_parser.load_test_config()
 
+    return airflow_config_parser
+
+
+@providers_configuration_loaded
+def write_webserver_configuration_if_needed(airflow_config_parser: 
AirflowConfigParser):
+    global WEBSERVER_CONFIG
     WEBSERVER_CONFIG = airflow_config_parser.get("webserver", "config_file")
     if not os.path.isfile(WEBSERVER_CONFIG):
         import shutil
@@ -2011,7 +2018,6 @@ def initialize_config() -> AirflowConfigParser:
         pathlib.Path(WEBSERVER_CONFIG).parent.mkdir(parents=True, 
exist_ok=True)
         log.info("Creating new FAB webserver config file in: %s", 
WEBSERVER_CONFIG)
         shutil.copy(_default_config_file_path("default_webserver_config.py"), 
WEBSERVER_CONFIG)
-    return airflow_config_parser
 
 
 def make_group_other_inaccessible(file_path: str):
diff --git a/tests/www/views/test_views.py b/tests/www/views/test_views.py
index 755df3b7aa..5dbb70edbd 100644
--- a/tests/www/views/test_views.py
+++ b/tests/www/views/test_views.py
@@ -24,7 +24,7 @@ from unittest import mock
 
 import pytest
 
-from airflow.configuration import initialize_config
+from airflow.configuration import initialize_config, 
write_webserver_configuration_if_needed
 from airflow.plugins_manager import AirflowPlugin, EntryPointSource
 from airflow.utils.task_group import TaskGroup
 from airflow.www import views
@@ -68,7 +68,8 @@ def 
test_webserver_configuration_config_file(mock_webserver_config_global, admin
 
     config_file = str(tmp_path / "my_custom_webserver_config.py")
     with mock.patch.dict(os.environ, {"AIRFLOW__WEBSERVER__CONFIG_FILE": 
config_file}):
-        initialize_config()
+        conf = initialize_config()
+        write_webserver_configuration_if_needed(conf)
         assert airflow.configuration.WEBSERVER_CONFIG == config_file
 
     assert os.path.isfile(config_file)

Reply via email to