diff --git a/airflow-core/src/airflow/configuration.py b/airflow-core/src/airflow/configuration.py index 4c66ba6792004..ac9eea5273331 100644 --- a/airflow-core/src/airflow/configuration.py +++ b/airflow-core/src/airflow/configuration.py @@ -777,6 +777,7 @@ def validate(self): ) self._upgrade_postgres_metastore_conn() + self._strip_trailing_slash_from_base_url() self.is_validated = True def _upgrade_postgres_metastore_conn(self): @@ -808,6 +809,19 @@ def _upgrade_postgres_metastore_conn(self): old_env_var = self._env_var_name("core", key) os.environ.pop(old_env_var, None) + def _strip_trailing_slash_from_base_url(self): + """Validate that api base_url config does not end with `/`.""" + key = "base_url" + base_url = self.get("api", key, fallback="") + if base_url and base_url.endswith("/"): + self.upgraded_values[("api", key)] = base_url + new_base_url = base_url.rstrip("/") + self._update_env_var(section="api", name=key, new_value=new_base_url) + # if the old value is set via env var, we need to wipe it + # otherwise, it'll "win" over our adjusted value + old_env_var = self._env_var_name("core", key) + os.environ.pop(old_env_var, None) + def _validate_enums(self): """Validate that enum type config has an accepted value.""" for (section_key, option_key), enum_options in self.enums_options.items(): diff --git a/airflow-core/src/airflow/models/taskinstance.py b/airflow-core/src/airflow/models/taskinstance.py index 8b690b417e1ef..eeb2321ec1e4c 100644 --- a/airflow-core/src/airflow/models/taskinstance.py +++ b/airflow-core/src/airflow/models/taskinstance.py @@ -616,10 +616,10 @@ def to_runtime_ti(self, context_from_server) -> RuntimeTaskInstanceProtocol: def log_url(self) -> str: """Log URL for TaskInstance.""" run_id = quote(self.run_id) - base_url = conf.get("api", "base_url", fallback="http://localhost:8080/") + base_url = conf.get("api", "base_url", fallback="http://localhost:8080") map_index = f"/mapped/{self.map_index}" if self.map_index >= 0 else "" try_number = f"?try_number={self.try_number}" if self.try_number > 0 else "" - _log_uri = f"{base_url}dags/{self.dag_id}/runs/{run_id}/tasks/{self.task_id}{map_index}{try_number}" + _log_uri = f"{base_url}/dags/{self.dag_id}/runs/{run_id}/tasks/{self.task_id}{map_index}{try_number}" return _log_uri