This is an automated email from the ASF dual-hosted git repository. pierrejeambrun pushed a commit to branch v2-5-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 31bffa87131906f50b8b433bcc3e909dc9ffdd90 Author: Andrey Anshin <[email protected]> AuthorDate: Sat Jan 14 01:41:11 2023 +0400 Allow URI without authority and host blocks in `airflow connections add` (#28922) (cherry picked from commit d8b84ce0e6d36850cd61b1ce37840c80aaec0116) --- airflow/cli/commands/connection_command.py | 5 +- tests/cli/commands/test_connection_command.py | 67 +++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/airflow/cli/commands/connection_command.py b/airflow/cli/commands/connection_command.py index 7737f4fa2c..c19490da93 100644 --- a/airflow/cli/commands/connection_command.py +++ b/airflow/cli/commands/connection_command.py @@ -132,9 +132,8 @@ def _is_stdout(fileio: io.TextIOWrapper) -> bool: def _valid_uri(uri: str) -> bool: - """Check if a URI is valid, by checking if both scheme and netloc are available.""" - uri_parts = urlsplit(uri) - return uri_parts.scheme != "" and uri_parts.netloc != "" + """Check if a URI is valid, by checking if scheme (conn_type) provided.""" + return urlsplit(uri).scheme != "" @cache diff --git a/tests/cli/commands/test_connection_command.py b/tests/cli/commands/test_connection_command.py index 05d8417c16..b5748e7a1d 100644 --- a/tests/cli/commands/test_connection_command.py +++ b/tests/cli/commands/test_connection_command.py @@ -19,6 +19,7 @@ from __future__ import annotations import io import json import re +import shlex import warnings from contextlib import redirect_stdout from unittest import mock @@ -353,7 +354,7 @@ class TestCliAddConnections: @pytest.mark.parametrize( "cmd, expected_output, expected_conn", [ - ( + pytest.param( [ "connections", "add", @@ -371,8 +372,9 @@ class TestCliAddConnections: "port": 5432, "schema": "airflow", }, + id="json-connection", ), - ( + pytest.param( [ "connections", "add", @@ -391,8 +393,9 @@ class TestCliAddConnections: "port": 5432, "schema": "airflow", }, + id="uri-connection-with-description", ), - ( + pytest.param( [ "connections", "add", @@ -411,8 +414,9 @@ class TestCliAddConnections: "port": 5432, "schema": "airflow", }, + id="uri-connection-with-description-2", ), - ( + pytest.param( [ "connections", "add", @@ -432,8 +436,9 @@ class TestCliAddConnections: "port": 5432, "schema": "airflow", }, + id="uri-connection-with-extra", ), - ( + pytest.param( [ "connections", "add", @@ -455,8 +460,9 @@ class TestCliAddConnections: "port": 5432, "schema": "airflow", }, + id="uri-connection-with-extra-and-description", ), - ( + pytest.param( [ "connections", "add", @@ -480,8 +486,9 @@ class TestCliAddConnections: "port": 9083, "schema": "airflow", }, + id="individual-parts", ), - ( + pytest.param( [ "connections", "add", @@ -504,6 +511,37 @@ class TestCliAddConnections: "port": None, "schema": None, }, + id="empty-uri-with-conn-type-and-extra", + ), + pytest.param( + ["connections", "add", "new6", "--conn-uri", "aws://?region_name=foo-bar-1"], + "Successfully added `conn_id`=new6 : aws://?region_name=foo-bar-1", + { + "conn_type": "aws", + "description": None, + "host": "", + "is_encrypted": False, + "is_extra_encrypted": True, + "login": None, + "port": None, + "schema": "", + }, + id="uri-without-authority-and-host-blocks", + ), + pytest.param( + ["connections", "add", "new7", "--conn-uri", "aws://@/?region_name=foo-bar-1"], + "Successfully added `conn_id`=new7 : aws://@/?region_name=foo-bar-1", + { + "conn_type": "aws", + "description": None, + "host": "", + "is_encrypted": False, + "is_extra_encrypted": True, + "login": "", + "port": None, + "schema": "", + }, + id="uri-with-@-instead-authority-and-host-blocks", ), ], ) @@ -572,11 +610,20 @@ class TestCliAddConnections: ) ) - def test_cli_connections_add_invalid_uri(self): + @pytest.mark.parametrize( + "invalid_uri", + [ + pytest.param("nonsense_uri", id="word"), + pytest.param("://password:type@host:42/schema", id="missing-conn-type"), + ], + ) + def test_cli_connections_add_invalid_uri(self, invalid_uri): # Attempt to add with invalid uri - with pytest.raises(SystemExit, match=r"The URI provided to --conn-uri is invalid: nonsense_uri"): + with pytest.raises(SystemExit, match=r"The URI provided to --conn-uri is invalid: .*"): connection_command.connections_add( - self.parser.parse_args(["connections", "add", "new1", f"--conn-uri={'nonsense_uri'}"]) + self.parser.parse_args( + ["connections", "add", "new1", f"--conn-uri={shlex.quote(invalid_uri)}"] + ) ) def test_cli_connections_add_invalid_type(self):
