From 0c8f2475dd756778849b38ccc114f0d931a4d598 Mon Sep 17 00:00:00 2001 From: Dmytro Kazanzhy Date: Mon, 31 Jan 2022 14:16:35 +0200 Subject: [PATCH] Added Hook for Amazon RDS. Added `boto3_stub` library for autocomplete. --- airflow/providers/amazon/aws/hooks/rds.py | 59 ++++++++++++++++++ airflow/providers/amazon/provider.yaml | 7 +++ .../apache-airflow-providers-amazon/index.rst | 1 + .../aws/Amazon-RDS_light-bg@4x.png | Bin 0 -> 53014 bytes setup.py | 1 + tests/providers/amazon/aws/hooks/test_rds.py | 27 ++++++++ 6 files changed, 95 insertions(+) create mode 100644 airflow/providers/amazon/aws/hooks/rds.py create mode 100644 docs/integration-logos/aws/Amazon-RDS_light-bg@4x.png create mode 100644 tests/providers/amazon/aws/hooks/test_rds.py diff --git a/airflow/providers/amazon/aws/hooks/rds.py b/airflow/providers/amazon/aws/hooks/rds.py new file mode 100644 index 0000000000000..3539e951cade6 --- /dev/null +++ b/airflow/providers/amazon/aws/hooks/rds.py @@ -0,0 +1,59 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Interact with AWS RDS.""" + +from typing import TYPE_CHECKING + +from airflow.providers.amazon.aws.hooks.base_aws import AwsBaseHook + +if TYPE_CHECKING: + from mypy_boto3_rds import RDSClient + + +class RdsHook(AwsBaseHook): + """ + Interact with AWS RDS using proper client from the boto3 library. + + Hook attribute `conn` has all methods that listed in documentation + + .. seealso:: + - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html + - https://docs.aws.amazon.com/rds/index.html + + Additional arguments (such as ``aws_conn_id`` or ``region_name``) may be specified and + are passed down to the underlying AwsBaseHook. + + .. seealso:: + :class:`~airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook` + + :param aws_conn_id: The Airflow connection used for AWS credentials. + """ + + def __init__(self, *args, **kwargs) -> None: + kwargs["client_type"] = "rds" + super().__init__(*args, **kwargs) + + @property + def conn(self) -> 'RDSClient': + """ + Get the underlying boto3 RDS client (cached) + + :return: boto3 RDS client + :rtype: botocore.client.RDS + """ + return super().conn diff --git a/airflow/providers/amazon/provider.yaml b/airflow/providers/amazon/provider.yaml index 962e48b10541c..e74a383f2b64c 100644 --- a/airflow/providers/amazon/provider.yaml +++ b/airflow/providers/amazon/provider.yaml @@ -103,6 +103,10 @@ integrations: external-doc-url: https://aws.amazon.com/kinesis/data-firehose/ logo: /integration-logos/aws/Amazon-Kinesis-Data-Firehose_light-bg@4x.png tags: [aws] + - integration-name: Amazon RDS + external-doc-url: https://aws.amazon.com/rds/ + logo: /integration-logos/aws/Amazon-RDS_light-bg@4x.png + tags: [aws] - integration-name: Amazon Redshift external-doc-url: https://aws.amazon.com/redshift/ logo: /integration-logos/aws/Amazon-Redshift_light-bg@4x.png @@ -382,6 +386,9 @@ hooks: - integration-name: Amazon CloudWatch Logs python-modules: - airflow.providers.amazon.aws.hooks.logs + - integration-name: Amazon RDS + python-modules: + - airflow.providers.amazon.aws.hooks.rds - integration-name: Amazon Redshift python-modules: - airflow.providers.amazon.aws.hooks.redshift diff --git a/docs/apache-airflow-providers-amazon/index.rst b/docs/apache-airflow-providers-amazon/index.rst index 7145eab6c9094..93dac67ebe52b 100644 --- a/docs/apache-airflow-providers-amazon/index.rst +++ b/docs/apache-airflow-providers-amazon/index.rst @@ -87,6 +87,7 @@ PIP package Version required ``redshift_connector`` ``~=2.0.888`` ``sqlalchemy_redshift`` ``~=0.8.6`` ``watchtower`` ``~=2.0.1`` +``mypy-boto3-rds`` ``>=1.21.0`` ======================= =================== Cross provider package dependencies diff --git a/docs/integration-logos/aws/Amazon-RDS_light-bg@4x.png b/docs/integration-logos/aws/Amazon-RDS_light-bg@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc40d95a159481a18dbb0baddac8a01c5c478bef GIT binary patch literal 53014 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 literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py index bcdca1e131148..02d475ad877fa 100644 --- a/setup.py +++ b/setup.py @@ -202,6 +202,7 @@ def write_version(filename: str = os.path.join(*[my_dir, "airflow", "git_version 'redshift_connector>=2.0.888', 'sqlalchemy_redshift>=0.8.6', pandas_requirement, + 'mypy-boto3-rds>=1.21.0', ] apache_beam = [ 'apache-beam>=2.33.0', diff --git a/tests/providers/amazon/aws/hooks/test_rds.py b/tests/providers/amazon/aws/hooks/test_rds.py new file mode 100644 index 0000000000000..89ec78246dcb8 --- /dev/null +++ b/tests/providers/amazon/aws/hooks/test_rds.py @@ -0,0 +1,27 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from airflow.providers.amazon.aws.hooks.rds import RdsHook + + +class TestRdsHook: + def test_conn_attribute(self): + hook = RdsHook(aws_conn_id='aws_default', region_name='us-east-1') + assert hasattr(hook, 'conn') + assert hook.conn.__class__.__name__ == 'RDS'