natanweinberger commented on a change in pull request #15425:
URL: https://github.com/apache/airflow/pull/15425#discussion_r633819663
##########
File path: airflow/models/connection.py
##########
@@ -377,3 +378,50 @@ def get_connection_from_secrets(cls, conn_id: str) ->
'Connection':
if conn:
return conn
raise AirflowNotFoundException(f"The conn_id `{conn_id}` isn't
defined")
+
+ @classmethod
+ def get_connection_parameter_names(cls) -> Set[str]:
+ """Returns :class:`airflow.models.connection.Connection` constructor
parameters."""
+ return {k for k in signature(cls.__init__).parameters.keys() if k !=
"self"}
+
+ @classmethod
+ def from_dict(cls, conn_id: str, conn_dict: Dict) -> 'Connection':
+ """
+ Create a connection from a dictionary.
+
+ :param conn_dict: dictionary representing a connection's attributes
+ e.g., {'conn_id': '', 'conn_type': '', 'login': '', ...}
+ :return: connection
+ """
+ if not isinstance(conn_dict, dict):
+ raise AirflowException(
+ f"Unexpected conn_dict type: {type(conn_dict)}. "
Review comment:
Implemented 👍
##########
File path: airflow/models/connection.py
##########
@@ -377,3 +378,50 @@ def get_connection_from_secrets(cls, conn_id: str) ->
'Connection':
if conn:
return conn
raise AirflowNotFoundException(f"The conn_id `{conn_id}` isn't
defined")
+
+ @classmethod
+ def get_connection_parameter_names(cls) -> Set[str]:
+ """Returns :class:`airflow.models.connection.Connection` constructor
parameters."""
+ return {k for k in signature(cls.__init__).parameters.keys() if k !=
"self"}
+
+ @classmethod
+ def from_dict(cls, conn_id: str, conn_dict: Dict) -> 'Connection':
+ """
+ Create a connection from a dictionary.
+
+ :param conn_dict: dictionary representing a connection's attributes
+ e.g., {'conn_id': '', 'conn_type': '', 'login': '', ...}
+ :return: connection
+ """
+ if not isinstance(conn_dict, dict):
+ raise AirflowException(
+ f"Unexpected conn_dict type: {type(conn_dict)}. "
+ "The connection must be defined as a dictionary."
+ )
+
+ connection_parameter_names = cls.get_connection_parameter_names() |
{"extra_dejson"}
+ current_keys = set(conn_dict.keys())
+ if not current_keys.issubset(connection_parameter_names):
+ illegal_keys = current_keys - connection_parameter_names
+ illegal_keys_list = ", ".join(sorted(illegal_keys))
+ raise AirflowException(
+ f"The object have illegal keys: {illegal_keys_list}. "
Review comment:
Implemented 👍
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]