Source code for ecs_composex.rds.rds_parameter_groups_helper

# SPDX-License-Identifier: MPL-2.0
# Copyright 2020-2022 John Mille <john@compose-x.io>

"""
Helper to generate default parameter group settings from engine name and version

Strip rds internal params to try and fit within 20 param limit
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbparametergroup.html#cfn-rds-dbparametergroup-parameters

"""

from __future__ import annotations

from typing import TYPE_CHECKING, Union

if TYPE_CHECKING:
    from boto3.session import Session

import boto3
from botocore.exceptions import ClientError
from compose_x_common.aws import get_session
from compose_x_common.compose_x_common import keyisset

from ecs_composex.common.logging import LOG


[docs]def get_db_cluster_engine_parameter_group_defaults( engine_family, for_aurora_cluster: bool = True, session: Session = None ): """ Returns a dict of all the parameter group parameters and default values :parm str engine_family: Engine family we are getting the cluster settings for, i.e. aurora-mysql5.7 """ session = get_session(session) client = session.client("rds") try: if for_aurora_cluster: req = client.describe_engine_default_cluster_parameters( DBParameterGroupFamily=engine_family ) else: req = client.describe_engine_default_parameters( DBParameterGroupFamily=engine_family ) except ClientError as error: LOG.exception(error) return None params_return = {} if "EngineDefaults" in req.keys(): params = req["EngineDefaults"]["Parameters"] for param in params: if ( keyisset("ParameterValue", param) and r"{" not in param["ParameterValue"] and keyisset("IsModifiable", param) and not param["ParameterName"].startswith("rds.") ): params_return[param["ParameterName"]] = param["ParameterValue"] if param["ParameterName"] == "binlog_format": params_return[param["ParameterName"]] = "MIXED" return params_return
[docs]def get_family_from_engine_version( engine_name: str, engine_version: str, session: Session = None ) -> str | None: """ Get the engine family from engine name and version """ session = get_session(session) client = session.client("rds") try: req = client.describe_db_engine_versions( Engine=engine_name, EngineVersion=engine_version ) except ClientError as error: LOG.error( f"Failed to describe DB Engine Versions for {engine_name}@{engine_version}" ) LOG.exception(error) return None if not keyisset("DBEngineVersions", req): raise LookupError( "x-rds - Failed to get DB Engine version details for", engine_name, engine_version, ) db_family = req["DBEngineVersions"][0]["DBParameterGroupFamily"] return db_family
[docs]def get_family_settings(db_family: str, session: Session = None) -> dict: """ Function to get the DB family settings """ session = get_session(session) if ( db_family is not None and isinstance(db_family, str) and db_family.startswith("aurora") ): LOG.debug("Aurora based instance") LOG.debug(f"Looking for parameters for {db_family}") return get_db_cluster_engine_parameter_group_defaults(db_family, True, session) else: return get_db_cluster_engine_parameter_group_defaults(db_family, False, session)