Skip to content
This repository was archived by the owner on Apr 3, 2024. It is now read-only.

Commit e7838d5

Browse files
potiukashb
authored andcommitted
Upgrades moto to newer version (~=2.0) (apache#15051)
According to getmoto/moto#3535 (comment) 1.3.17 version of moto with a fix to be compatible with mock> 4.0.3 is not going to be released because of breaking changes. Therefore we need to migrate to newer version of moto. At the same time we can get rid of the old botocore limitation, which was added apparently to handle some test errors. We are relying fully on what boto3 depends on. Upgrading dependencies also discovered that mysql tests need to be fixed because upgraded version of dependencies cause some test failure (those turned out to be badly written tests). (cherry picked from commit e8aa3de)
1 parent edbf49c commit e7838d5

File tree

10 files changed

+193
-124
lines changed

10 files changed

+193
-124
lines changed

setup.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,7 @@ def get_sphinx_theme_version() -> str:
194194
# If you change this mark you should also change ./scripts/ci/check_order_setup.py
195195
# Start dependencies group
196196
amazon = [
197-
'boto3>=1.15.0,<1.16.0',
198-
'botocore>=1.18.0,<1.19.0',
197+
'boto3>=1.15.0,<1.18.0',
199198
'watchtower~=0.7.3',
200199
]
201200
apache_beam = [
@@ -217,7 +216,7 @@ def get_sphinx_theme_version() -> str:
217216
'azure-keyvault>=4.1.0',
218217
'azure-kusto-data>=0.0.43,<0.1',
219218
'azure-mgmt-containerinstance>=1.5.0,<2.0',
220-
'azure-mgmt-datafactory>=0.13.0',
219+
'azure-mgmt-datafactory>=1.0.0,<2.0',
221220
'azure-mgmt-datalake-store>=0.5.0',
222221
'azure-mgmt-resource>=2.2.0',
223222
'azure-storage-blob>=12.7.0',
@@ -315,6 +314,7 @@ def get_sphinx_theme_version() -> str:
315314
'grpcio-gcp>=0.2.2',
316315
'json-merge-patch~=0.2',
317316
'pandas-gbq',
317+
'plyvel',
318318
]
319319
grpc = [
320320
'google-auth>=1.0.0, <2.0.0dev',
@@ -364,7 +364,7 @@ def get_sphinx_theme_version() -> str:
364364
]
365365
mysql = [
366366
'mysql-connector-python>=8.0.11, <=8.0.22',
367-
'mysqlclient>=1.3.6,<1.4',
367+
'mysqlclient>=1.3.6,<3',
368368
]
369369
neo4j = ['neo4j>=4.2.1']
370370
odbc = [
@@ -390,7 +390,7 @@ def get_sphinx_theme_version() -> str:
390390
'pinotdb>0.1.2,<1.0.0',
391391
]
392392
plexus = [
393-
'arrow>=0.16.0',
393+
'arrow>=0.16.0,<1.0.0',
394394
]
395395
postgres = [
396396
'psycopg2-binary>=2.7.4',
@@ -468,6 +468,7 @@ def get_sphinx_theme_version() -> str:
468468
# End dependencies group
469469

470470
devel = [
471+
'aws_xray_sdk',
471472
'beautifulsoup4~=4.7.1',
472473
'black',
473474
'blinker',
@@ -485,24 +486,23 @@ def get_sphinx_theme_version() -> str:
485486
'ipdb',
486487
'jira',
487488
'jsonpath-ng',
488-
# HACK: Moto is not compatible with newer versions
489-
# See: https://github.com/spulec/moto/issues/3535
490-
'mock<4.0.3',
489+
'jsondiff',
491490
'mongomock',
492-
'moto<2',
491+
'moto~=2.0',
493492
'mypy==0.770',
494493
'parameterized',
495494
'paramiko',
496495
'pipdeptree',
497496
'pre-commit',
498-
'pylint',
497+
'pylint>=2.7.0',
499498
'pysftp',
500499
'pytest~=6.0',
501500
'pytest-cov',
502501
'pytest-instafail',
503502
'pytest-rerunfailures~=9.1',
504503
'pytest-timeouts',
505504
'pytest-xdist',
505+
'python-jose',
506506
'pywinrm',
507507
'qds-sdk>=1.9.6',
508508
'requests_mock',

tests/operators/test_generic_transfer.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
# under the License.
1818

1919
import unittest
20+
from contextlib import closing
2021

2122
import pytest
2223
from parameterized import parameterized
@@ -43,9 +44,11 @@ def setUp(self):
4344

4445
def tearDown(self):
4546
drop_tables = {'test_mysql_to_mysql', 'test_airflow'}
46-
with MySqlHook().get_conn() as conn:
47+
with closing(MySqlHook().get_conn()) as conn:
4748
for table in drop_tables:
48-
conn.execute(f"DROP TABLE IF EXISTS {table}")
49+
# Previous version tried to run execute directly on dbapi call, which was accidentally working
50+
with closing(conn.cursor()) as cur:
51+
cur.execute(f"DROP TABLE IF EXISTS {table}")
4952

5053
@parameterized.expand(
5154
[
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
local

tests/providers/amazon/aws/hooks/test_s3.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@
3636
mock_s3 = None
3737

3838

39+
# This class needs to be separated out because if there are earlier mocks in the same class
40+
# the tests will fail on teardown.
41+
class TestAwsS3HookNoMock:
42+
def test_check_for_bucket_raises_error_with_invalid_conn_id(self, monkeypatch):
43+
monkeypatch.delenv('AWS_PROFILE', raising=False)
44+
monkeypatch.delenv('AWS_ACCESS_KEY_ID', raising=False)
45+
monkeypatch.delenv('AWS_SECRET_ACCESS_KEY', raising=False)
46+
hook = S3Hook(aws_conn_id="does_not_exist")
47+
with pytest.raises(NoCredentialsError):
48+
hook.check_for_bucket("test-non-existing-bucket")
49+
50+
3951
@pytest.mark.skipif(mock_s3 is None, reason='moto package not present')
4052
class TestAwsS3Hook:
4153
@mock_s3
@@ -52,14 +64,6 @@ def test_check_for_bucket(self, s3_bucket):
5264
assert hook.check_for_bucket(s3_bucket) is True
5365
assert hook.check_for_bucket('not-a-bucket') is False
5466

55-
def test_check_for_bucket_raises_error_with_invalid_conn_id(self, s3_bucket, monkeypatch):
56-
monkeypatch.delenv('AWS_PROFILE', raising=False)
57-
monkeypatch.delenv('AWS_ACCESS_KEY_ID', raising=False)
58-
monkeypatch.delenv('AWS_SECRET_ACCESS_KEY', raising=False)
59-
hook = S3Hook(aws_conn_id="does_not_exist")
60-
with pytest.raises(NoCredentialsError):
61-
hook.check_for_bucket(s3_bucket)
62-
6367
@mock_s3
6468
def test_get_bucket(self):
6569
hook = S3Hook()
@@ -156,14 +160,6 @@ def test_check_for_key(self, s3_bucket):
156160
assert hook.check_for_key('b', s3_bucket) is False
157161
assert hook.check_for_key(f's3://{s3_bucket}//b') is False
158162

159-
def test_check_for_key_raises_error_with_invalid_conn_id(self, monkeypatch, s3_bucket):
160-
monkeypatch.delenv('AWS_PROFILE', raising=False)
161-
monkeypatch.delenv('AWS_ACCESS_KEY_ID', raising=False)
162-
monkeypatch.delenv('AWS_SECRET_ACCESS_KEY', raising=False)
163-
hook = S3Hook(aws_conn_id="does_not_exist")
164-
with pytest.raises(NoCredentialsError):
165-
hook.check_for_key('a', s3_bucket)
166-
167163
def test_get_key(self, s3_bucket):
168164
hook = S3Hook()
169165
bucket = hook.get_bucket(s3_bucket)

tests/providers/amazon/aws/hooks/test_secrets_manager.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,17 @@ def test_get_secret_string(self):
4343
secret_value = '{"user": "test"}'
4444
hook = SecretsManagerHook(aws_conn_id='aws_default')
4545

46-
param = {
46+
create_param = {
47+
'Name': secret_name,
48+
}
49+
50+
put_param = {
4751
'SecretId': secret_name,
4852
'SecretString': secret_value,
4953
}
5054

51-
hook.get_conn().put_secret_value(**param)
55+
hook.get_conn().create_secret(**create_param)
56+
hook.get_conn().put_secret_value(**put_param)
5257

5358
secret = hook.get_secret(secret_name)
5459
assert secret == secret_value
@@ -60,12 +65,17 @@ def test_get_secret_dict(self):
6065
secret_value = '{"user": "test"}'
6166
hook = SecretsManagerHook(aws_conn_id='aws_default')
6267

63-
param = {
68+
create_param = {
69+
'Name': secret_name,
70+
}
71+
72+
put_param = {
6473
'SecretId': secret_name,
6574
'SecretString': secret_value,
6675
}
6776

68-
hook.get_conn().put_secret_value(**param)
77+
hook.get_conn().create_secret(**create_param)
78+
hook.get_conn().put_secret_value(**put_param)
6979

7080
secret = hook.get_secret_as_dict(secret_name)
7181
assert secret == json.loads(secret_value)
@@ -76,13 +86,17 @@ def test_get_secret_binary(self):
7686
secret_name = "arn:aws:secretsmanager:us-east-2:999999999999:secret:db_cluster-YYYYYYY"
7787
secret_value_binary = base64.b64encode(b'{"username": "test"}')
7888
hook = SecretsManagerHook(aws_conn_id='aws_default')
89+
create_param = {
90+
'Name': secret_name,
91+
}
7992

80-
param = {
93+
put_param = {
8194
'SecretId': secret_name,
8295
'SecretBinary': secret_value_binary,
8396
}
8497

85-
hook.get_conn().put_secret_value(**param)
98+
hook.get_conn().create_secret(**create_param)
99+
hook.get_conn().put_secret_value(**put_param)
86100

87101
secret = hook.get_secret(secret_name)
88102
assert secret == base64.b64decode(secret_value_binary)

tests/providers/amazon/aws/secrets/test_secrets_manager.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,19 @@ def test_aws_secrets_manager_get_connections(self, mock_get_uri):
3232

3333
@mock_secretsmanager
3434
def test_get_conn_uri(self):
35+
36+
secret_id = 'airflow/connections/test_postgres'
37+
create_param = {
38+
'Name': secret_id,
39+
}
40+
3541
param = {
36-
'SecretId': 'airflow/connections/test_postgres',
42+
'SecretId': secret_id,
3743
'SecretString': 'postgresql://airflow:airflow@host:5432/airflow',
3844
}
3945

4046
secrets_manager_backend = SecretsManagerBackend()
47+
secrets_manager_backend.client.create_secret(**create_param)
4148
secrets_manager_backend.client.put_secret_value(**param)
4249

4350
returned_uri = secrets_manager_backend.get_conn_uri(conn_id="test_postgres")
@@ -50,22 +57,36 @@ def test_get_conn_uri_non_existent_key(self):
5057
SecretsManagerBackend.get_connections should return None
5158
"""
5259
conn_id = "test_mysql"
60+
61+
secret_id = 'airflow/connections/test_postgres'
62+
create_param = {
63+
'Name': secret_id,
64+
}
65+
5366
param = {
54-
'SecretId': 'airflow/connections/test_postgres',
67+
'SecretId': secret_id,
5568
'SecretString': 'postgresql://airflow:airflow@host:5432/airflow',
5669
}
5770

5871
secrets_manager_backend = SecretsManagerBackend()
72+
secrets_manager_backend.client.create_secret(**create_param)
5973
secrets_manager_backend.client.put_secret_value(**param)
6074

6175
assert secrets_manager_backend.get_conn_uri(conn_id=conn_id) is None
6276
assert [] == secrets_manager_backend.get_connections(conn_id=conn_id)
6377

6478
@mock_secretsmanager
6579
def test_get_variable(self):
66-
param = {'SecretId': 'airflow/variables/hello', 'SecretString': 'world'}
80+
81+
secret_id = 'airflow/variables/hello'
82+
create_param = {
83+
'Name': secret_id,
84+
}
85+
86+
param = {'SecretId': secret_id, 'SecretString': 'world'}
6787

6888
secrets_manager_backend = SecretsManagerBackend()
89+
secrets_manager_backend.client.create_secret(**create_param)
6990
secrets_manager_backend.client.put_secret_value(**param)
7091

7192
returned_uri = secrets_manager_backend.get_variable('hello')
@@ -77,9 +98,14 @@ def test_get_variable_non_existent_key(self):
7798
Test that if Variable key is not present,
7899
SystemsManagerParameterStoreBackend.get_variables should return None
79100
"""
80-
param = {'SecretId': 'airflow/variables/hello', 'SecretString': 'world'}
101+
secret_id = 'airflow/variables/hello'
102+
create_param = {
103+
'Name': secret_id,
104+
}
105+
param = {'SecretId': secret_id, 'SecretString': 'world'}
81106

82107
secrets_manager_backend = SecretsManagerBackend()
108+
secrets_manager_backend.client.create_secret(**create_param)
83109
secrets_manager_backend.client.put_secret_value(**param)
84110

85111
assert secrets_manager_backend.get_variable("test_mysql") is None

0 commit comments

Comments
 (0)