Repository: ansible-collections/amazon.aws

Issue:
rds_param_group doesn't check DBParameterGroupFamily
### Summary

When managing an RDS DB Parameter Group with the rds_param_group module, the module will happily create a parameter group with the specified engine, but it will not fail / error when you pass it an engine that would require modification.

For instance... This will create a parameter group:

```
      rds_param_group:
        name: "test_parameter_group"
        state: present
        engine: "aurora-postgresql13"
        params: "{{ db_instance_parameters }}"
```

But running this afterwards and changing the `engine` to `aurora-postgresql14` will pass "ok", leading you to believe that the engine type is already `aurora-postgresql14`. In reality though, this should probably fail, because I don't think you can modify the db parameter group family after creating a parameter group.

### Issue Type

Bug Report

### Component Name

rds_param_group

### Ansible Version

```console (paste below)
$ ansible --version
ansible [core 2.13.4]
  config file = None
  configured module search path = ['/var/lib/buildkite-agent/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /var/lib/buildkite-agent/.local/lib/python3.10/site-packages/ansible
  ansible collection location = /var/lib/buildkite-agent/.ansible/collections:/usr/share/ansible/collections
  executable location = /var/lib/buildkite-agent/.local/bin/ansible
  python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0]
  jinja version = 3.0.3
  libyaml = True

```


### Collection Versions

```console (paste below)
$ ansible-galaxy collection list

# /var/lib/buildkite-agent/.local/lib/python3.10/site-packages/ansible_collections
Collection                    Version
----------------------------- -------
amazon.aws                    3.4.0  
ansible.netcommon             3.1.0  
ansible.posix                 1.4.0  
ansible.utils                 2.6.1  
ansible.windows               1.11.0 
arista.eos                    5.0.1  
awx.awx                       21.4.0 
azure.azcollection            1.13.0 
check_point.mgmt              2.3.0  
chocolatey.chocolatey         1.3.0  
cisco.aci                     2.2.0  
cisco.asa                     3.1.0  
cisco.dnac                    6.5.3  
cisco.intersight              1.0.19 
cisco.ios                     3.3.0  
cisco.iosxr                   3.3.0  
cisco.ise                     2.5.0  
cisco.meraki                  2.10.1 
cisco.mso                     2.0.0  
cisco.nso                     1.0.3  
cisco.nxos                    3.1.0  
cisco.ucs                     1.8.0  
cloud.common                  2.1.2  
cloudscale_ch.cloud           2.2.2  
community.aws                 3.5.0  
community.azure               1.1.0  
community.ciscosmb            1.0.5  
community.crypto              2.5.0  
community.digitalocean        1.21.0 
community.dns                 2.3.1  
community.docker              2.7.1  
community.fortios             1.0.0  
community.general             5.5.0  
community.google              1.0.0  
community.grafana             1.5.2  
community.hashi_vault         3.2.0  
community.hrobot              1.5.2  
community.libvirt             1.2.0  
community.mongodb             1.4.2  
community.mysql               3.4.0  
community.network             4.0.1  
community.okd                 2.2.0  
community.postgresql          2.2.0  
community.proxysql            1.4.0  
community.rabbitmq            1.2.2  
community.routeros            2.2.1  
community.sap                 1.0.0  
community.sap_libs            1.2.0  
community.skydive             1.0.0  
community.sops                1.3.0  
community.vmware              2.8.0  
community.windows             1.11.0 
community.zabbix              1.8.0  
containers.podman             1.9.4  
cyberark.conjur               1.1.0  
cyberark.pas                  1.0.14 
dellemc.enterprise_sonic      1.1.1  
dellemc.openmanage            5.5.0  
dellemc.os10                  1.1.1  
dellemc.os6                   1.0.7  
dellemc.os9                   1.0.4  
f5networks.f5_modules         1.19.0 
fortinet.fortimanager         2.1.5  
fortinet.fortios              2.1.7  
frr.frr                       2.0.0  
gluster.gluster               1.0.2  
google.cloud                  1.0.2  
hetzner.hcloud                1.8.1  
hpe.nimble                    1.1.4  
ibm.qradar                    2.0.0  
ibm.spectrum_virtualize       1.9.0  
infinidat.infinibox           1.3.3  
infoblox.nios_modules         1.3.0  
inspur.sm                     2.0.0  
junipernetworks.junos         3.1.0  
kubernetes.core               2.3.2  
mellanox.onyx                 1.0.0  
netapp.aws                    21.7.0 
netapp.azure                  21.10.0
netapp.cloudmanager           21.19.0
netapp.elementsw              21.7.0 
netapp.ontap                  21.22.0
netapp.storagegrid            21.10.0
netapp.um_info                21.8.0 
netapp_eseries.santricity     1.3.1  
netbox.netbox                 3.7.1  
ngine_io.cloudstack           2.2.4  
ngine_io.exoscale             1.0.0  
ngine_io.vultr                1.1.2  
openstack.cloud               1.8.0  
openvswitch.openvswitch       2.1.0  
ovirt.ovirt                   2.2.3  
purestorage.flasharray        1.13.0 
purestorage.flashblade        1.9.0  
purestorage.fusion            1.0.2  
sensu.sensu_go                1.13.1 
servicenow.servicenow         1.0.6  
splunk.es                     2.0.0  
t_systems_mms.icinga_director 1.31.0 
theforeman.foreman            3.4.0  
vmware.vmware_rest            2.2.0  
vyos.vyos                     3.0.1  
wti.remote                    1.0.4  

```


### AWS SDK versions

```console (paste below)
$ pip show boto boto3 botocore
Name: boto
Version: 2.49.0
Summary: Amazon Web Services Library
Home-page: https://github.com/boto/boto/
Author: Mitch Garnaat
Author-email: mitch@garnaat.com
License: MIT
Location: /var/lib/buildkite-agent/.local/lib/python3.10/site-packages
Requires: 
Required-by: 
---
Name: boto3
Version: 1.20.51
Summary: The AWS SDK for Python
Home-page: https://github.com/boto/boto3
Author: Amazon Web Services
Author-email: 
License: Apache License 2.0
Location: /var/lib/buildkite-agent/.local/lib/python3.10/site-packages
Requires: botocore, jmespath, s3transfer
Required-by: 
---
Name: botocore
Version: 1.23.54
Summary: Low-level, data-driven core of boto 3.
Home-page: https://github.com/boto/botocore
Author: Amazon Web Services
Author-email: 
License: Apache License 2.0
Location: /var/lib/buildkite-agent/.local/lib/python3.10/site-packages
Requires: jmespath, python-dateutil, urllib3
Required-by: boto3, s3transfer

```


### Configuration

```console (paste below)
$ ansible-config dump --only-changed

```


### OS / Environment

5.15.0-1004-aws

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)

```


### Expected Results

I expected the step to fail.

### Actual Results

```console (paste below)
"Seems good!"
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct


Discussion:
Files identified in the description:
* [`plugins/modules/rds_param_group.py`](https://github.com/['ansible-collections/amazon.aws', 'ansible-collections/community.aws', 'ansible-collections/community.vmware']/blob/main/plugins/modules/rds_param_group.py)

If these files are inaccurate, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @jillr @s-hertel @tastychutney @tremble @willthames
[click here for bot help](https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md)
<!--- boilerplate: notify --->

Resolving patch:
diff --git a/plugins/modules/rds_param_group.py b/plugins/modules/rds_param_group.py
--- a/plugins/modules/rds_param_group.py
+++ b/plugins/modules/rds_param_group.py
@@ -35,6 +35,8 @@
       - The type of database for this group.
       - Please use following command to get list of all supported db engines and their respective versions.
       - '# aws rds describe-db-engine-versions --query "DBEngineVersions[].DBParameterGroupFamily"'
+      - The DB parameter group family is immutable and can't be changed when updating a DB parameter group.
+        See U(https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbparametergroup.html)
       - Required for I(state=present).
     type: str
   immediate:
@@ -266,6 +268,11 @@ def ensure_present(module, connection):
                 module.fail_json_aws(e, msg="Couldn't create parameter group")
     else:
         group = response['DBParameterGroups'][0]
+        db_parameter_group_family = group['DBParameterGroupFamily']
+
+        if module.params.get('engine') != db_parameter_group_family:
+            module.warn("The DB parameter group family (engine) can't be changed when updating a DB parameter group.")
+
         if tags:
             changed = update_tags(module, connection, group, tags)
 


Test patch:
diff --git a/tests/integration/targets/rds_param_group/defaults/main.yml b/tests/integration/targets/rds_param_group/defaults/main.yml
--- a/tests/integration/targets/rds_param_group/defaults/main.yml
+++ b/tests/integration/targets/rds_param_group/defaults/main.yml
@@ -2,6 +2,7 @@ rds_param_group:
   name: '{{ resource_prefix}}rds-param-group'
   description: Test group for rds_param_group Ansible module
   engine: postgres9.6
+  engine_to_modify_to: postgres10
 
 rds_long_param_list:
   application_name: Test
diff --git a/tests/integration/targets/rds_param_group/tasks/main.yml b/tests/integration/targets/rds_param_group/tasks/main.yml
--- a/tests/integration/targets/rds_param_group/tasks/main.yml
+++ b/tests/integration/targets/rds_param_group/tasks/main.yml
@@ -123,6 +123,27 @@
       - result.tags["Test"] == '123'
 
     # ============================================================
+
+  - name: test modifying rds parameter group engine/family (warning displayed)
+    rds_param_group:
+      name: '{{ rds_param_group.name }}'
+      engine: '{{ rds_param_group.engine_to_modify_to }}'
+      description: '{{ rds_param_group.description }}'
+      state: present
+      tags:
+        Environment: test
+        Test: 123
+    register: result
+
+  - name: verify that modifying rds param group engine/family displays warning
+    assert:
+      that:
+      - not result.changed
+      - not result.failed
+      - result.warnings is defined
+      - result.warnings | length > 0
+
+    # ============================================================
   - name: test tagging existing group - CHECK_MODE
     rds_param_group:
       name: '{{ rds_param_group.name }}'