Skip to content

Commit

Permalink
Add session_parameters option to snowflake_hook (#12071)
Browse files Browse the repository at this point in the history
  • Loading branch information
koszti committed Nov 12, 2020
1 parent 4f5e0ed commit 9276607
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 1 deletion.
3 changes: 3 additions & 0 deletions airflow/providers/snowflake/hooks/snowflake.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ def __init__(self, *args, **kwargs) -> None:
self.role = kwargs.pop("role", None)
self.schema = kwargs.pop("schema", None)
self.authenticator = kwargs.pop("authenticator", None)
self.session_parameters = kwargs.pop("session_parameters", None)

def _get_conn_params(self) -> Dict[str, Optional[str]]:
"""
Expand All @@ -62,6 +63,7 @@ def _get_conn_params(self) -> Dict[str, Optional[str]]:
role = conn.extra_dejson.get('role', '')
schema = conn.schema or ''
authenticator = conn.extra_dejson.get('authenticator', 'snowflake')
session_parameters = conn.extra_dejson.get('session_parameters')

conn_config = {
"user": conn.login,
Expand All @@ -73,6 +75,7 @@ def _get_conn_params(self) -> Dict[str, Optional[str]]:
"region": self.region or region,
"role": self.role or role,
"authenticator": self.authenticator or authenticator,
"session_parameters": self.session_parameters or session_parameters,
}

# If private_key_file is specified in the extra json, load the contents of the file as a private
Expand Down
6 changes: 6 additions & 0 deletions airflow/providers/snowflake/operators/snowflake.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ class SnowflakeOperator(BaseOperator):
'https://<your_okta_account_name>.okta.com' to authenticate
through native Okta.
:type authenticator: str
:param session_parameters: You can set session-level parameters at
the time you connect to Snowflake
:type session_parameters: dict
"""

template_fields = ('sql',)
Expand All @@ -76,6 +79,7 @@ def __init__(
role: Optional[str] = None,
schema: Optional[str] = None,
authenticator: Optional[str] = None,
session_parameters: Optional[dict] = None,
**kwargs,
) -> None:
super().__init__(**kwargs)
Expand All @@ -88,6 +92,7 @@ def __init__(
self.role = role
self.schema = schema
self.authenticator = authenticator
self.session_parameters = session_parameters

def get_hook(self) -> SnowflakeHook:
"""
Expand All @@ -102,6 +107,7 @@ def get_hook(self) -> SnowflakeHook:
role=self.role,
schema=self.schema,
authenticator=self.authenticator,
session_parameters=self.session_parameters,
)

def execute(self, context: Any) -> None:
Expand Down
3 changes: 2 additions & 1 deletion tests/providers/snowflake/hooks/test_snowflake.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def get_conn(self):
def get_connection(self, _):
return conn

self.db_hook = UnitTestSnowflakeHook()
self.db_hook = UnitTestSnowflakeHook(session_parameters={"QUERY_TAG": "This is a test hook"})

self.non_encrypted_private_key = "/tmp/test_key.pem"
self.encrypted_private_key = "/tmp/test_key.p8"
Expand Down Expand Up @@ -100,6 +100,7 @@ def test_get_conn_params(self):
'region': 'af_region',
'role': 'af_role',
'authenticator': 'snowflake',
'session_parameters': {"QUERY_TAG": "This is a test hook"},
}
self.assertEqual(self.db_hook.snowflake_conn_id, 'snowflake_default') # pylint: disable=no-member
self.assertEqual(conn_params_shouldbe, self.db_hook._get_conn_params())
Expand Down

0 comments on commit 9276607

Please sign in to comment.