From 66b1c838c7f293f9c723fa992b0c5d15d973ec66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ne=C4=8Das?= Date: Fri, 5 Oct 2018 12:38:25 +0200 Subject: [PATCH] Ovirt delete snapshots after x days (#45551) * ovirt add snapshot delete after x days * update logic of deleting snapshot and rename it * update docs and names of vars * update docs syntax * Update ovirt_snapshot.py * put remove logic to function * use default removing function for snapshot --- .../modules/cloud/ovirt/ovirt_snapshot.py | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/ansible/modules/cloud/ovirt/ovirt_snapshot.py b/lib/ansible/modules/cloud/ovirt/ovirt_snapshot.py index 812e9f7265..63f5d6c85a 100644 --- a/lib/ansible/modules/cloud/ovirt/ovirt_snapshot.py +++ b/lib/ansible/modules/cloud/ovirt/ovirt_snapshot.py @@ -59,6 +59,11 @@ options: - "restore_memory" - "save_memory" type: bool + keep_days_old: + description: + - "Number of days after which should snapshot be deleted." + - "It will check all snapshots of virtual machine and delete them, if they are older." + version_added: "2.8" notes: - "Note that without a guest agent the data on the created snapshot may be inconsistent." @@ -98,6 +103,11 @@ EXAMPLES = ''' state: absent vm_name: rhel7 snapshot_id: "{{ snapshot.id }}" + +# Delete all snapshots older than 2 days +- ovirt_snapshot: + vm_name: test + keep_days_old: 2 ''' @@ -112,6 +122,10 @@ snapshot: at following url: http://ovirt.github.io/ovirt-engine-api-model/master/#types/snapshot." returned: On success if snapshot is found. type: dict +snapshots: + description: List of deleted snapshots when keep_days_old is defined and snapshot is older than the input days + returned: On success returns deleted snapshots + type: list ''' @@ -122,6 +136,7 @@ try: except ImportError: pass +from datetime import datetime from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.ovirt import ( check_sdk, @@ -161,10 +176,12 @@ def create_snapshot(module, vm_service, snapshots_service): } -def remove_snapshot(module, vm_service, snapshots_service): +def remove_snapshot(module, vm_service, snapshots_service, snapshot_id=None): changed = False + if not snapshot_id: + snapshot_id = module.params['snapshot_id'] snapshot = get_entity( - snapshots_service.snapshot_service(module.params['snapshot_id']) + snapshots_service.snapshot_service(snapshot_id) ) if snapshot: @@ -222,6 +239,20 @@ def restore_snapshot(module, vm_service, snapshots_service): } +def remove_old_snapshosts(module, vm_service, snapshots_service): + deleted_snapshots = [] + changed = False + date_now = datetime.now() + for snapshot in snapshots_service.list(): + if snapshot.vm is not None and snapshot.vm.name == module.params.get('vm_name'): + diff = date_now - snapshot.date.replace(tzinfo=None) + if diff.days >= module.params.get('keep_days_old'): + snapshot = remove_snapshot(module, vm_service, snapshots_service, snapshot.id).get('snapshot') + deleted_snapshots.append(snapshot) + changed = True + return dict(snapshots=deleted_snapshots, changed=changed) + + def main(): argument_spec = ovirt_full_argument_spec( state=dict( @@ -231,6 +262,7 @@ def main(): vm_name=dict(required=True), snapshot_id=dict(default=None), description=dict(default=None), + keep_days_old=dict(default=None, type='int'), use_memory=dict( default=None, type='bool', @@ -263,7 +295,10 @@ def main(): try: state = module.params['state'] if state == 'present': - ret = create_snapshot(module, vm_service, snapshots_service) + if module.params.get('keep_days_old') is not None: + ret = remove_old_snapshosts(module, vm_service, snapshots_service) + else: + ret = create_snapshot(module, vm_service, snapshots_service) elif state == 'restore': ret = restore_snapshot(module, vm_service, snapshots_service) elif state == 'absent':