diff --git a/changelogs/fragments/1558-ec2_vol-add-wait-for-modify-volume-complete.yml b/changelogs/fragments/1558-ec2_vol-add-wait-for-modify-volume-complete.yml new file mode 100644 index 00000000000..d0ea6c9cc0e --- /dev/null +++ b/changelogs/fragments/1558-ec2_vol-add-wait-for-modify-volume-complete.yml @@ -0,0 +1,2 @@ +minor_changes: +- ec2_vol - added ``wait`` and ``wait_timeout`` options (https://github.com/ansible-collections/amazon.aws/pull/1558). diff --git a/plugins/modules/ec2_vol.py b/plugins/modules/ec2_vol.py index 981510c8470..583078a47fa 100644 --- a/plugins/modules/ec2_vol.py +++ b/plugins/modules/ec2_vol.py @@ -104,6 +104,18 @@ - If set, allows to create volume in an Outpost. type: str version_added: 3.1.0 + wait: + description: + - Wait for volume modification to complete. + type: bool + default: false + version_added: 6.3.0 + wait_timeout: + description: + - How long before wait gives up, in seconds. + type: int + default: 900 + version_added: 6.3.0 author: - "Lester Wade (@lwade)" notes: @@ -439,6 +451,26 @@ def update_volume(module, ec2_conn, volume): volume["multi_attach_enabled"] = response.get("VolumeModification").get("TargetMultiAttachEnabled") volume["throughput"] = response.get("VolumeModification").get("TargetThroughput") + if module.params.get("wait"): + mod_state = "" + _wait_till = module.params.get("wait_timeout") + time.time() + while _wait_till > time.time(): + mod_response = ec2_conn.describe_volumes_modifications(VolumeIds=[volume["volume_id"]]) + mod_state = mod_response.get("VolumesModifications")[0].get("ModificationState") + + if mod_state == "completed": + break + + if mod_state == "failed": + module.fail_json(msg=f"Volume {volume['volume_id']} modification has failed.") + + time.sleep(30) + + else: + module.fail_json( + msg=f"Volume {volume['volume_id']} modification state has not reached 'completed' after {module.params.get('wait_timeout')} seconds." + ) + return volume, changed @@ -714,6 +746,8 @@ def main(): outpost_arn=dict(type="str"), purge_tags=dict(type="bool", default=True), multi_attach=dict(type="bool"), + wait=dict(default=False, type="bool"), + wait_timeout=dict(type="int", default=900), ) module = AnsibleAWSModule( @@ -738,6 +772,8 @@ def main(): volume_type = module.params.get("volume_type") throughput = module.params.get("throughput") multi_attach = module.params.get("multi_attach") + modify_volume = module.params.get("modify_volume") + wait = module.params.get("wait") # Ensure we have the zone or can get the zone if instance is None and zone is None and state == "present": @@ -769,6 +805,9 @@ def main(): if multi_attach is True and volume_type not in ("io1", "io2"): module.fail_json(msg="multi_attach is only supported for io1 and io2 volumes.") + if wait is True and modify_volume is False: + module.fail_json(msg="wait does nothing if modify_volume is False.") + # Set changed flag changed = False