From c2b20fae90643e57d4c25714b6c5234258743d44 Mon Sep 17 00:00:00 2001 From: root at virt55 Date: Sat, 10 Sep 2022 06:50:50 +0300 Subject: [PATCH 1/2] Added disk selection and exclusion of deactivated disks --- backup.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++ config.py | 12 ++++++++++++ config_example.cfg | 9 +++++++++ 3 files changed, 68 insertions(+) diff --git a/backup.py b/backup.py index c72cf2b..715bfdc 100644 --- a/backup.py +++ b/backup.py @@ -107,6 +107,26 @@ def create_argparser(): default=None, ) + dsk = p.add_argument_group("VM's disks arguments") + dsk.add_argument( + "--bootable_only", + help="Backup Bootable Disk Only", + dest="bootable_only", + default=None, + ) + dsk.add_argument( + "--with_disks_deactivated", + help="Backup deactivated disks", + dest="with_disks_deactivated", + default=None, + ) + dsk.add_argument( + "--disks_id_exclude", + help="an array of exclude disks id", + dest="disks_id_exclude", + default=None, + ) + dcg = p.add_argument_group("Data Centre's related options") dcg.add_argument( "--export-domain", @@ -333,6 +353,32 @@ def main(argv): vm = vm[0] + # Get the Attachments Disk + disk_attachments = vms_service.vm_service(vm.id).disk_attachments_service().list() + disksBackup = [] + BootableOnly = config.get_bootable_only() + for disk_attachment in disk_attachments: + if BootableOnly: + if disk_attachment.bootable == True: + disksBackup.append(disk_attachment) + break + elif config.get_with_disks_deactivated() or disk_attachment.active: + disksBackup.append(disk_attachment) + + if not BootableOnly: + disks_id_exclude=config.get_disks_id_exclude() + if disks_id_exclude: + disksBackup = [disk for disk in disksBackup if disk.id not in disks_id_exclude] + + for disk_attachment in disksBackup: + if disk_attachment.bootable == True: + logger.info("Finding bootable disk: %s", disk_attachment.id) + else: + logger.info("Finding disk: %s", disk_attachment.id) +# print disk_attachment.id +# break +# print disks_id[0].__dict__ + # Delete old backup snapshots VMTools.delete_snapshots(api, vm, config, vm_from_list) @@ -349,6 +395,7 @@ def main(argv): types.Snapshot( description=config.get_snapshot_description(), persist_memorystate=config.get_persist_memorystate(), + disk_attachments=disksBackup, ), ) VMTools.wait_for_snapshot_operation(api, vm, config, "creation") diff --git a/config.py b/config.py index 5fb32c2..c98fdc1 100644 --- a/config.py +++ b/config.py @@ -50,6 +50,9 @@ def __init__(self, fd, debug, arguments): self.__backup_keep_count = config_parser.get(section, "backup_keep_count") self.__backup_keep_count_by_number = config_parser.get(section, "backup_keep_count_by_number") self.__dry_run = config_parser.getboolean(section, "dry_run") + self.__bootable_only = config_parser.getboolean(section, "bootable_only", fallback=False) + self.__with_disks_deactivated = config_parser.getboolean(section, "with_disks_deactivated", fallback=False) + self.__disks_id_exclude = json.loads(config_parser.get(section, "disks_id_exclude", fallback="[]")) self.__debug = debug self.__vm_name_max_length = config_parser.getint(section, "vm_name_max_length") self.__use_short_suffix = config_parser.getboolean(section, "use_short_suffix") @@ -126,6 +129,15 @@ def get_backup_keep_count_by_number(self): def get_dry_run(self): return self.__dry_run + def get_bootable_only(self): + return self.__bootable_only + + def get_with_disks_deactivated(self): + return self.__with_disks_deactivated + + def get_disks_id_exclude(self): + return self.__disks_id_exclude + def get_debug(self): return self.__debug diff --git a/config_example.cfg b/config_example.cfg index 35ed830..64331f8 100644 --- a/config_example.cfg +++ b/config_example.cfg @@ -86,3 +86,12 @@ logger_file_path= # If this value is True, the VM is being paused during snapshot creation. persist_memorystate=False + +# Backup Bootable Disk Only +bootable_only=False + +# Backup deactivated disks, set to False to skip deactivated disks backup (Recommend). +# This True - causes an error deleting a snapshot of the VM when the state is on. +with_disks_deactivated=False +# an array of exclude disks id,exampel ["6d811aa25-52a1-45c3-9f40-1c7c868182c9","6e78d7c2-5786-4dz2-a966-fd308c23f08e"] +disks_id_exclude: [] From cbf44172de174ee1e28632c1ee8630f3028dfd1e Mon Sep 17 00:00:00 2001 From: GMasta2000 Date: Tue, 13 Sep 2022 01:50:10 +0300 Subject: [PATCH 2/2] Changed the variable names --- backup.py | 25 +++++++++++-------------- config_example.cfg | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/backup.py b/backup.py index 715bfdc..870b74f 100644 --- a/backup.py +++ b/backup.py @@ -355,29 +355,26 @@ def main(argv): # Get the Attachments Disk disk_attachments = vms_service.vm_service(vm.id).disk_attachments_service().list() - disksBackup = [] - BootableOnly = config.get_bootable_only() + disks_backup = [] + bootable_only = config.get_bootable_only() for disk_attachment in disk_attachments: - if BootableOnly: + if bootable_only: if disk_attachment.bootable == True: - disksBackup.append(disk_attachment) + disks_backup.append(disk_attachment) break elif config.get_with_disks_deactivated() or disk_attachment.active: - disksBackup.append(disk_attachment) + disks_backup.append(disk_attachment) - if not BootableOnly: + if not bootable_only: disks_id_exclude=config.get_disks_id_exclude() if disks_id_exclude: - disksBackup = [disk for disk in disksBackup if disk.id not in disks_id_exclude] + disks_backup = [disk for disk in disks_backup if disk.id not in disks_id_exclude] - for disk_attachment in disksBackup: + for disk_attachment in disks_backup: if disk_attachment.bootable == True: - logger.info("Finding bootable disk: %s", disk_attachment.id) + logger.info(f"Finding bootable disk: {disk_attachment.id}") else: - logger.info("Finding disk: %s", disk_attachment.id) -# print disk_attachment.id -# break -# print disks_id[0].__dict__ + logger.info(f"Finding disk: {disk_attachment.id}") # Delete old backup snapshots VMTools.delete_snapshots(api, vm, config, vm_from_list) @@ -395,7 +392,7 @@ def main(argv): types.Snapshot( description=config.get_snapshot_description(), persist_memorystate=config.get_persist_memorystate(), - disk_attachments=disksBackup, + disk_attachments=disks_backup, ), ) VMTools.wait_for_snapshot_operation(api, vm, config, "creation") diff --git a/config_example.cfg b/config_example.cfg index 64331f8..50d6b2d 100644 --- a/config_example.cfg +++ b/config_example.cfg @@ -93,5 +93,5 @@ bootable_only=False # Backup deactivated disks, set to False to skip deactivated disks backup (Recommend). # This True - causes an error deleting a snapshot of the VM when the state is on. with_disks_deactivated=False -# an array of exclude disks id,exampel ["6d811aa25-52a1-45c3-9f40-1c7c868182c9","6e78d7c2-5786-4dz2-a966-fd308c23f08e"] +# an array of exclude disks id, example ["6d811aa25-52a1-45c3-9f40-1c7c868182c9","6e78d7c2-5786-4dz2-a966-fd308c23f08e"] disks_id_exclude: []