Skip to content

Commit cbe2a4b

Browse files
committed
add test
1 parent c377d22 commit cbe2a4b

File tree

4 files changed

+155
-1
lines changed

4 files changed

+155
-1
lines changed

pkg/resource/db_cluster_parameter_group/hooks.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ func sdkTagsFromResourceTags(
215215
// call. Instead, you need to call ResetDBClusterParameterGroup with a list of
216216
// DB Cluster Parameters that you want RDS to reset to a default value.
217217
//
218-
// Note: This function uses fallback parameter validation to work around an AWS API
218+
// Note(rushmash91): This function uses fallback parameter validation to work around an AWS API
219219
// limitation where DescribeEngineDefaultClusterParameters may not return all valid
220220
// cluster parameters (e.g., MySQL logging parameters like slow_query_log). See
221221
// getParameterMeta() for details on the fallback mechanism.

test/e2e/db_parameter_group.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,42 @@ def get_parameters(db_parameter_group_name):
8888
return None
8989

9090

91+
def get_engine_default_parameters(db_parameter_group_family):
92+
"""Returns a dict containing the engine default parameters for a given parameter group family
93+
94+
This function calls DescribeEngineDefaultParameters to get the default parameter metadata
95+
that's used as fallback validation in cluster parameter groups.
96+
"""
97+
c = boto3.client('rds')
98+
try:
99+
all_parameters = []
100+
marker = None
101+
102+
while True:
103+
if marker:
104+
resp = c.describe_engine_default_parameters(
105+
DBParameterGroupFamily=db_parameter_group_family,
106+
Marker=marker
107+
)
108+
else:
109+
resp = c.describe_engine_default_parameters(
110+
DBParameterGroupFamily=db_parameter_group_family,
111+
)
112+
113+
parameters = resp['EngineDefaults']['Parameters']
114+
all_parameters.extend(parameters)
115+
116+
# Check if there are more results
117+
if 'Marker' in resp['EngineDefaults']:
118+
marker = resp['EngineDefaults']['Marker']
119+
else:
120+
break
121+
122+
return all_parameters
123+
except Exception as e:
124+
return None
125+
126+
91127
def get_tags(db_parameter_group_arn):
92128
"""Returns a dict containing the DB parameter group's tag records from the
93129
RDS API.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: rds.services.k8s.aws/v1alpha1
2+
kind: DBClusterParameterGroup
3+
metadata:
4+
name: $DB_CLUSTER_PARAMETER_GROUP_NAME
5+
spec:
6+
name: $DB_CLUSTER_PARAMETER_GROUP_NAME
7+
description: $DB_CLUSTER_PARAMETER_GROUP_DESC
8+
family: $DB_CLUSTER_PARAMETER_GROUP_FAMILY
9+
parameterOverrides:
10+
slow_query_log: "$PARAM_SLOW_QUERY_LOG_VALUE"
11+
long_query_time: "$PARAM_LONG_QUERY_TIME_VALUE"
12+
log_queries_not_using_indexes: "$PARAM_LOG_QUERIES_NOT_USING_INDEXES_VALUE"

test/e2e/tests/test_db_cluster_parameter_group.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from e2e import service_marker, CRD_GROUP, CRD_VERSION, load_rds_resource
2525
from e2e.replacement_values import REPLACEMENT_VALUES
2626
from e2e import db_cluster_parameter_group
27+
from e2e import db_parameter_group
2728
from e2e import tag
2829
from e2e import condition
2930

@@ -77,6 +78,49 @@ def aurora_mysql57_cluster_param_group():
7778
db_cluster_parameter_group.wait_until_deleted(resource_name)
7879

7980

81+
@pytest.fixture
82+
def aurora_mysql80_logging_cluster_param_group():
83+
resource_name = random_suffix_name("aurora-mysql8-logging", 32)
84+
85+
replacements = REPLACEMENT_VALUES.copy()
86+
replacements["DB_CLUSTER_PARAMETER_GROUP_NAME"] = resource_name
87+
replacements["DB_CLUSTER_PARAMETER_GROUP_DESC"] = "Test MySQL logging parameters for Aurora MySQL 8.0"
88+
replacements["DB_CLUSTER_PARAMETER_GROUP_FAMILY"] = "aurora-mysql8.0"
89+
replacements["PARAM_SLOW_QUERY_LOG_VALUE"] = "1"
90+
replacements["PARAM_LONG_QUERY_TIME_VALUE"] = "10"
91+
replacements["PARAM_LOG_QUERIES_NOT_USING_INDEXES_VALUE"] = "1"
92+
93+
resource_data = load_rds_resource(
94+
"db_cluster_parameter_group_aurora_mysql8.0_logging",
95+
additional_replacements=replacements,
96+
)
97+
logging.debug(resource_data)
98+
99+
# Create the k8s resource
100+
ref = k8s.CustomResourceReference(
101+
CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL,
102+
resource_name, namespace="default",
103+
)
104+
k8s.create_custom_resource(ref, resource_data)
105+
cr = k8s.wait_resource_consumed_by_controller(ref)
106+
time.sleep(CREATE_WAIT_AFTER_SECONDS)
107+
108+
assert cr is not None
109+
assert k8s.get_resource_exists(ref)
110+
111+
yield ref, cr, resource_name
112+
113+
# Try to delete, if doesn't already exist
114+
try:
115+
_, deleted = k8s.delete_custom_resource(ref, 3, 10)
116+
assert deleted
117+
time.sleep(DELETE_WAIT_AFTER_SECONDS)
118+
except:
119+
pass
120+
121+
db_cluster_parameter_group.wait_until_deleted(resource_name)
122+
123+
80124
@service_marker
81125
@pytest.mark.canary
82126
class TestDBClusterParameterGroup:
@@ -161,3 +205,65 @@ def test_crud_aurora_mysql5_7(self, aurora_mysql57_cluster_param_group):
161205
assert "ParameterValue" in tp, f"No ParameterValue in parameter of name 'aurora_read_replica_read_committed': {tp}"
162206
assert tp["ParameterValue"] == "ON", f"Wrong value for parameter of name 'aurora_read_replica_read_committed': {tp}"
163207
assert found == 2, f"Did not find parameters with names 'aurora_binlog_read_buffer_size' and 'aurora_read_replica_read_committed': {test_params}"
208+
209+
def test_mysql_logging_parameters(self, aurora_mysql80_logging_cluster_param_group):
210+
ref, cr, resource_name = aurora_mysql80_logging_cluster_param_group
211+
212+
latest = db_cluster_parameter_group.get(resource_name)
213+
assert latest is not None
214+
215+
instance_defaults = db_parameter_group.get_engine_default_parameters("mysql8.0")
216+
assert instance_defaults is not None, "Failed to get instance-level engine defaults"
217+
218+
fallback_params = list(filter(lambda x: x["ParameterName"] in [
219+
"slow_query_log",
220+
"long_query_time",
221+
"log_queries_not_using_indexes",
222+
], instance_defaults))
223+
224+
# Log debug info about found parameters
225+
found_param_names = [p['ParameterName'] for p in fallback_params]
226+
logging.debug(f"Found fallback parameters: {found_param_names}")
227+
228+
assert len(fallback_params) == 3, f"Expected 3 MySQL logging parameters in instance defaults, found {len(fallback_params)}: {found_param_names}"
229+
230+
for param in fallback_params:
231+
assert "ParameterName" in param, f"Missing ParameterName in fallback parameter: {param}"
232+
assert "IsModifiable" in param, f"Missing IsModifiable in fallback parameter: {param}"
233+
assert "ApplyType" in param, f"Missing ApplyType in fallback parameter: {param}"
234+
235+
assert 'status' in cr
236+
assert 'parameterOverrideStatuses' in cr['status']
237+
238+
# Verify the parameter statuses show our MySQL logging parameters
239+
status_params = cr['status']['parameterOverrideStatuses']
240+
param_names = [p['parameterName'] for p in status_params]
241+
242+
assert "slow_query_log" in param_names, f"slow_query_log parameter missing from status: {param_names}"
243+
assert "long_query_time" in param_names, f"long_query_time parameter missing from status: {param_names}"
244+
assert "log_queries_not_using_indexes" in param_names, f"log_queries_not_using_indexes parameter missing from status: {param_names}"
245+
246+
time.sleep(MODIFY_WAIT_AFTER_SECONDS)
247+
248+
latest_params = db_cluster_parameter_group.get_parameters(resource_name)
249+
test_params = list(filter(lambda x: x["ParameterName"] in [
250+
"slow_query_log",
251+
"long_query_time",
252+
"log_queries_not_using_indexes",
253+
], latest_params))
254+
255+
# Check initial parameter values
256+
expected_initial_values = {
257+
"slow_query_log": "1",
258+
"long_query_time": "10",
259+
"log_queries_not_using_indexes": "1"
260+
}
261+
262+
for tp in test_params:
263+
param_name = tp["ParameterName"]
264+
assert param_name in expected_initial_values, f"Unexpected parameter: {param_name}"
265+
assert tp["ParameterValue"] == expected_initial_values[param_name], \
266+
f"Wrong value for {param_name}: expected {expected_initial_values[param_name]}, got {tp['ParameterValue']}"
267+
268+
assert len(test_params) == len(expected_initial_values), \
269+
f"Expected {len(expected_initial_values)} parameters, found {len(test_params)}: {test_params}"

0 commit comments

Comments
 (0)