Skip to content

Commit 17265f0

Browse files
authored
Use pytest fixtures in e2e tests (#140)
Updates e2e test cases for the RDS controller to use pytest fixtures. Issue aws-controllers-k8s/community#1726 By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent c6d4889 commit 17265f0

File tree

6 files changed

+243
-131
lines changed

6 files changed

+243
-131
lines changed

test/e2e/db_cluster_parameter_group.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,46 @@
1313

1414
"""Utilities for working with DB cluster parameter group resources"""
1515

16+
import datetime
17+
import time
18+
1619
import boto3
20+
import pytest
21+
22+
DEFAULT_WAIT_UNTIL_DELETED_TIMEOUT_SECONDS = 60*10
23+
DEFAULT_WAIT_UNTIL_DELETED_INTERVAL_SECONDS = 15
24+
25+
26+
def wait_until_deleted(
27+
cpg_name: str,
28+
timeout_seconds: int = DEFAULT_WAIT_UNTIL_DELETED_TIMEOUT_SECONDS,
29+
interval_seconds: int = DEFAULT_WAIT_UNTIL_DELETED_INTERVAL_SECONDS,
30+
) -> None:
31+
"""Waits until a DB cluster param group with a supplied ID is no longer
32+
returned from the RDS API.
33+
34+
Usage:
35+
from e2e.db_cluster_parameter_group import wait_until_deleted
36+
37+
wait_until_deleted(cpg_name)
38+
39+
Raises:
40+
pytest.fail upon timeout
41+
"""
42+
now = datetime.datetime.now()
43+
timeout = now + datetime.timedelta(seconds=timeout_seconds)
44+
45+
while True:
46+
if datetime.datetime.now() >= timeout:
47+
pytest.fail(
48+
"Timed out waiting for DB cluster param group to be "
49+
"deleted in RDS API"
50+
)
51+
time.sleep(interval_seconds)
52+
53+
latest = get(cpg_name)
54+
if latest is None:
55+
break
1756

1857

1958
def get(db_cluster_parameter_group_name):

test/e2e/db_parameter_group.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,47 @@
1313

1414
"""Utilities for working with DB parameter group resources"""
1515

16+
import datetime
17+
import time
18+
1619
import boto3
20+
import pytest
21+
22+
DEFAULT_WAIT_UNTIL_DELETED_TIMEOUT_SECONDS = 60*10
23+
DEFAULT_WAIT_UNTIL_DELETED_INTERVAL_SECONDS = 15
24+
25+
26+
def wait_until_deleted(
27+
pg_name: str,
28+
timeout_seconds: int = DEFAULT_WAIT_UNTIL_DELETED_TIMEOUT_SECONDS,
29+
interval_seconds: int = DEFAULT_WAIT_UNTIL_DELETED_INTERVAL_SECONDS,
30+
) -> None:
31+
"""Waits until a DB param group with a supplied ID is no longer returned
32+
from the RDS API.
33+
34+
Usage:
35+
from e2e.db_parameter_group import wait_until_deleted
36+
37+
wait_until_deleted(pg_name)
38+
39+
Raises:
40+
pytest.fail upon timeout or if the DB param group goes to any other
41+
status other than 'deleting'
42+
"""
43+
now = datetime.datetime.now()
44+
timeout = now + datetime.timedelta(seconds=timeout_seconds)
45+
46+
while True:
47+
if datetime.datetime.now() >= timeout:
48+
pytest.fail(
49+
"Timed out waiting for DB param group to be "
50+
"deleted in RDS API"
51+
)
52+
time.sleep(interval_seconds)
53+
54+
latest = get(pg_name)
55+
if latest is None:
56+
break
1757

1858

1959
def get(db_parameter_group_name):
@@ -32,6 +72,7 @@ def get(db_parameter_group_name):
3272
except c.exceptions.DBParameterGroupNotFoundFault:
3373
return None
3474

75+
3576
def get_parameters(db_parameter_group_name):
3677
"""Returns a dict containing the paramters of a given parameter group
3778
@@ -46,6 +87,7 @@ def get_parameters(db_parameter_group_name):
4687
except c.exceptions.DBParameterGroupNotFoundFault:
4788
return None
4889

90+
4991
def get_tags(db_parameter_group_arn):
5092
"""Returns a dict containing the DB parameter group's tag records from the
5193
RDS API.

test/e2e/tests/test_db_cluster.py

Lines changed: 58 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import pytest
2020

2121
from acktest.k8s import resource as k8s
22+
from acktest.resources import random_suffix_name
2223
from e2e import service_marker, CRD_GROUP, CRD_VERSION, load_rds_resource
2324
from e2e.replacement_values import REPLACEMENT_VALUES
2425
from e2e import condition
@@ -51,55 +52,69 @@
5152

5253
MODIFY_WAIT_AFTER_SECONDS = 20
5354

55+
# MUP == Master user password...
56+
MUP_NS = "default"
57+
MUP_SEC_NAME = "dbclustersecrets"
58+
MUP_SEC_KEY = "master_user_password"
59+
MUP_SEC_VAL = "secretpass123456"
60+
61+
62+
@pytest.fixture
63+
def aurora_mysql_cluster(k8s_secret):
64+
db_cluster_id = random_suffix_name("my-aurora-mysql", 20)
65+
db_name = "mydb"
66+
secret = k8s_secret(
67+
MUP_NS,
68+
MUP_SEC_NAME,
69+
MUP_SEC_KEY,
70+
MUP_SEC_VAL,
71+
)
72+
73+
replacements = REPLACEMENT_VALUES.copy()
74+
replacements['COPY_TAGS_TO_SNAPSHOT'] = "False"
75+
replacements["DB_CLUSTER_ID"] = db_cluster_id
76+
replacements["DB_NAME"] = db_name
77+
replacements["MASTER_USER_PASS_SECRET_NAMESPACE"] = secret.ns
78+
replacements["MASTER_USER_PASS_SECRET_NAME"] = secret.name
79+
replacements["MASTER_USER_PASS_SECRET_KEY"] = secret.key
80+
81+
resource_data = load_rds_resource(
82+
"db_cluster_mysql_serverless",
83+
additional_replacements=replacements,
84+
)
85+
86+
ref = k8s.CustomResourceReference(
87+
CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL,
88+
db_cluster_id, namespace="default",
89+
)
90+
k8s.create_custom_resource(ref, resource_data)
91+
cr = k8s.wait_resource_consumed_by_controller(ref)
92+
93+
assert cr is not None
94+
assert 'status' in cr
95+
assert 'status' in cr['status']
96+
assert cr['status']['status'] == 'creating'
97+
condition.assert_not_synced(ref)
98+
99+
yield (ref, cr, db_cluster_id)
100+
101+
# Try to delete, if doesn't already exist
102+
try:
103+
_, deleted = k8s.delete_custom_resource(ref, 3, 10)
104+
assert deleted
105+
time.sleep(DELETE_WAIT_AFTER_SECONDS)
106+
except:
107+
pass
108+
109+
db_cluster.wait_until_deleted(db_cluster_id)
54110

55111
@service_marker
56112
@pytest.mark.canary
57113
class TestDBCluster:
58-
59-
# MUP == Master user password...
60-
MUP_NS = "default"
61-
MUP_SEC_NAME = "dbclustersecrets"
62-
MUP_SEC_KEY = "master_user_password"
63-
MUP_SEC_VAL = "secretpass123456"
64-
65114
def test_crud_mysql_serverless(
66-
self,
67-
k8s_secret,
115+
self, aurora_mysql_cluster,
68116
):
69-
db_cluster_id = "my-aurora-mysql"
70-
db_name = "mydb"
71-
secret = k8s_secret(
72-
self.MUP_NS,
73-
self.MUP_SEC_NAME,
74-
self.MUP_SEC_KEY,
75-
self.MUP_SEC_VAL,
76-
)
77-
78-
replacements = REPLACEMENT_VALUES.copy()
79-
replacements['COPY_TAGS_TO_SNAPSHOT'] = "False"
80-
replacements["DB_CLUSTER_ID"] = db_cluster_id
81-
replacements["DB_NAME"] = db_name
82-
replacements["MASTER_USER_PASS_SECRET_NAMESPACE"] = secret.ns
83-
replacements["MASTER_USER_PASS_SECRET_NAME"] = secret.name
84-
replacements["MASTER_USER_PASS_SECRET_KEY"] = secret.key
85-
86-
resource_data = load_rds_resource(
87-
"db_cluster_mysql_serverless",
88-
additional_replacements=replacements,
89-
)
90-
91-
ref = k8s.CustomResourceReference(
92-
CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL,
93-
db_cluster_id, namespace="default",
94-
)
95-
k8s.create_custom_resource(ref, resource_data)
96-
cr = k8s.wait_resource_consumed_by_controller(ref)
97-
98-
assert cr is not None
99-
assert 'status' in cr
100-
assert 'status' in cr['status']
101-
assert cr['status']['status'] == 'creating'
102-
condition.assert_not_synced(ref)
117+
ref, cr, db_cluster_id = aurora_mysql_cluster
103118

104119
db_cluster.wait_until(
105120
db_cluster_id,
@@ -168,9 +183,3 @@ def test_crud_mysql_serverless(
168183
}
169184
]
170185
assert latest_tags == after_update_expected_tags
171-
172-
k8s.delete_custom_resource(ref)
173-
174-
time.sleep(DELETE_WAIT_AFTER_SECONDS)
175-
176-
db_cluster.wait_until_deleted(db_cluster_id)

test/e2e/tests/test_db_cluster_parameter_group.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,16 @@
3434
# take several minutes before the new tag values are available due to caching.
3535
MODIFY_WAIT_AFTER_SECONDS = 180
3636

37+
RESOURCE_DESC_AURORA_MYSQL57 = "Parameters for Aurora MySQL 5.7-compatible"
38+
3739

3840
@pytest.fixture
39-
def aurora_mysql57_cluster_parameter_group():
40-
resource_name = random_suffix_name("aurora-mysql-5-7", 32)
41-
resource_desc = "Parameters for Aurora MySQL 5.7-compatible"
41+
def aurora_mysql57_cluster_param_group():
42+
resource_name = random_suffix_name("aurora-mysql-5-7", 24)
4243

4344
replacements = REPLACEMENT_VALUES.copy()
4445
replacements["DB_CLUSTER_PARAMETER_GROUP_NAME"] = resource_name
45-
replacements["DB_CLUSTER_PARAMETER_GROUP_DESC"] = resource_desc
46+
replacements["DB_CLUSTER_PARAMETER_GROUP_DESC"] = RESOURCE_DESC_AURORA_MYSQL57
4647

4748
resource_data = load_rds_resource(
4849
"db_cluster_parameter_group_aurora_mysql5.7",
@@ -61,29 +62,29 @@ def aurora_mysql57_cluster_parameter_group():
6162
assert cr is not None
6263
assert k8s.get_resource_exists(ref)
6364

64-
yield (ref, cr)
65+
yield ref, cr, resource_name
6566

6667
# Try to delete, if doesn't already exist
6768
try:
6869
_, deleted = k8s.delete_custom_resource(ref, 3, 10)
6970
assert deleted
70-
db_instance.wait_until_deleted(db_instance_id)
71+
time.sleep(DELETE_WAIT_AFTER_SECONDS)
7172
except:
7273
pass
7374

75+
db_cluster_parameter_group.wait_until_deleted(resource_name)
76+
77+
7478
@service_marker
7579
@pytest.mark.canary
7680
class TestDBClusterParameterGroup:
77-
def test_create_delete_aurora_mysql5_7(
78-
self,
79-
aurora_mysql57_cluster_parameter_group,
80-
):
81-
(ref, cr) = aurora_mysql57_cluster_parameter_group
82-
resource_name = cr["spec"]["name"]
81+
def test_crud_aurora_mysql5_7(self, aurora_mysql57_cluster_param_group):
82+
ref, cr, resource_name = aurora_mysql57_cluster_param_group
8383

8484
# Let's check that the DB cluster parameter group appears in RDS
8585
latest = db_cluster_parameter_group.get(resource_name)
8686
assert latest is not None
87+
assert latest['Description'] == RESOURCE_DESC_AURORA_MYSQL57
8788

8889
arn = latest['DBClusterParameterGroupArn']
8990
expect_tags = [
@@ -157,4 +158,4 @@ def test_create_delete_aurora_mysql5_7(
157158
found += 1
158159
assert "ParameterValue" in tp, f"No ParameterValue in parameter of name 'aurora_read_replica_read_committed': {tp}"
159160
assert tp["ParameterValue"] == "ON", f"Wrong value for parameter of name 'aurora_read_replica_read_committed': {tp}"
160-
assert found == 2, f"Did not find parameters with names 'aurora_binlog_read_buffer_size' and 'aurora_read_replica_read_committed': {test_params}"
161+
assert found == 2, f"Did not find parameters with names 'aurora_binlog_read_buffer_size' and 'aurora_read_replica_read_committed': {test_params}"

0 commit comments

Comments
 (0)