files/destroy-vm.py (54 lines of code) (raw):

#!/usr/bin/python3 """ Utility to quickly destroy a Qubes VM managed by the Workstation salt config, for use in repeated builds during development. """ import argparse import subprocess import sys import qubesadmin SDW_DEFAULT_TAG = "sd-workstation" def parse_args(): parser = argparse.ArgumentParser() parser.add_argument( "--all", default=False, required=False, action="store_true", help="Destroys all SDW VMs", ) parser.add_argument( "targets", help="List of SDW VMs to destroy", nargs=argparse.REMAINDER, ) args = parser.parse_args() if not args.all and len(args.targets) < 1: parser.print_help(sys.stderr) sys.exit(1) return args def destroy_vm(vm): """ Destroys a single VM instance. Requires arg to be QubesVM object. """ if SDW_DEFAULT_TAG not in vm.tags: raise Exception("VM does not have the 'sd-workstation' tag") if vm.is_running(): vm.kill() print(f"Destroying VM '{vm.name}'... ", end="") subprocess.check_call(["qvm-remove", "-f", vm.name]) print("OK") def destroy_all(): """ Destroys all VMs marked with the 'sd-workstation' tag, in the following order: DispVMs, AppVMs, then TemplateVMs. Excludes VMs for which installed_by_rpm=true. """ # Remove DispVMs first, then AppVMs, then TemplateVMs last. sdw_vms = [vm for vm in q.domains if SDW_DEFAULT_TAG in vm.tags] sdw_template_vms = [ vm for vm in sdw_vms if vm.klass == "TemplateVM" and not vm.installed_by_rpm ] sdw_disp_vms = [vm for vm in sdw_vms if vm.klass == "DispVM"] sdw_app_vms = [vm for vm in sdw_vms if vm.klass == "AppVM"] for vm in sdw_disp_vms: destroy_vm(vm) for vm in sdw_app_vms: destroy_vm(vm) for vm in sdw_template_vms: destroy_vm(vm) if __name__ == "__main__": args = parse_args() q = qubesadmin.Qubes() if args.all: destroy_all() else: for t in args.targets: vm = q.domains[t] destroy_vm(vm)