Handle restart confirmation for VMs more nicely
For the "vm modify", revamp the way confirmations are presented. Do the edits/load, show changes, verify XML, then prompt to write and the restart. The previous order didn't make much sense. For any of these `--restart` triggered VM modifications, also alter how the confirmation works. If the user declines the restart, do not abort; instead, just set restart=False and continue with the modification.
This commit is contained in:
parent
66f1ac35ab
commit
62c84664fc
|
@ -731,12 +731,6 @@ def vm_modify(domain, cfgfile, editor, restart, confirm_flag):
|
||||||
if not retcode and not vm_information.get('name', None):
|
if not retcode and not vm_information.get('name', None):
|
||||||
cleanup(False, 'ERROR: Could not find VM "{}"!'.format(domain))
|
cleanup(False, 'ERROR: Could not find VM "{}"!'.format(domain))
|
||||||
|
|
||||||
if restart and not confirm_flag and not config['unsafe']:
|
|
||||||
try:
|
|
||||||
click.confirm('Restart VM {} after applying change'.format(domain), prompt_suffix='? ', abort=True)
|
|
||||||
except Exception:
|
|
||||||
exit(0)
|
|
||||||
|
|
||||||
dom_name = vm_information.get('name')
|
dom_name = vm_information.get('name')
|
||||||
|
|
||||||
if editor is True:
|
if editor is True:
|
||||||
|
@ -752,38 +746,28 @@ def vm_modify(domain, cfgfile, editor, restart, confirm_flag):
|
||||||
else:
|
else:
|
||||||
new_vm_cfgfile = new_vm_cfgfile.strip()
|
new_vm_cfgfile = new_vm_cfgfile.strip()
|
||||||
|
|
||||||
# Show a diff and confirm
|
|
||||||
click.echo('Pending modifications:')
|
|
||||||
click.echo('')
|
|
||||||
diff = list(difflib.unified_diff(current_vm_cfgfile.split('\n'), new_vm_cfgfile.split('\n'), fromfile='current', tofile='modified', fromfiledate='', tofiledate='', n=3, lineterm=''))
|
|
||||||
for line in diff:
|
|
||||||
if re.match(r'^\+', line) is not None:
|
|
||||||
click.echo(colorama.Fore.GREEN + line + colorama.Fore.RESET)
|
|
||||||
elif re.match(r'^\-', line) is not None:
|
|
||||||
click.echo(colorama.Fore.RED + line + colorama.Fore.RESET)
|
|
||||||
elif re.match(r'^\^', line) is not None:
|
|
||||||
click.echo(colorama.Fore.BLUE + line + colorama.Fore.RESET)
|
|
||||||
else:
|
|
||||||
click.echo(line)
|
|
||||||
click.echo('')
|
|
||||||
|
|
||||||
click.confirm('Write modifications to cluster?', abort=True)
|
|
||||||
|
|
||||||
if restart:
|
|
||||||
click.echo('Writing modified configuration of VM "{}" and restarting.'.format(dom_name))
|
|
||||||
else:
|
|
||||||
click.echo('Writing modified configuration of VM "{}".'.format(dom_name))
|
|
||||||
|
|
||||||
# We're operating in replace mode
|
# We're operating in replace mode
|
||||||
else:
|
else:
|
||||||
# Open the XML file
|
# Open the XML file
|
||||||
new_vm_cfgfile = cfgfile.read()
|
new_vm_cfgfile = cfgfile.read()
|
||||||
cfgfile.close()
|
cfgfile.close()
|
||||||
|
|
||||||
if restart:
|
click.echo('Replacing configuration of VM "{}" with file "{}".'.format(dom_name, cfgfile.name))
|
||||||
click.echo('Replacing configuration of VM "{}" with file "{}" and restarting.'.format(dom_name, cfgfile.name))
|
|
||||||
|
# Show a diff and confirm
|
||||||
|
click.echo('Pending modifications:')
|
||||||
|
click.echo('')
|
||||||
|
diff = list(difflib.unified_diff(current_vm_cfgfile.split('\n'), new_vm_cfgfile.split('\n'), fromfile='current', tofile='modified', fromfiledate='', tofiledate='', n=3, lineterm=''))
|
||||||
|
for line in diff:
|
||||||
|
if re.match(r'^\+', line) is not None:
|
||||||
|
click.echo(colorama.Fore.GREEN + line + colorama.Fore.RESET)
|
||||||
|
elif re.match(r'^\-', line) is not None:
|
||||||
|
click.echo(colorama.Fore.RED + line + colorama.Fore.RESET)
|
||||||
|
elif re.match(r'^\^', line) is not None:
|
||||||
|
click.echo(colorama.Fore.BLUE + line + colorama.Fore.RESET)
|
||||||
else:
|
else:
|
||||||
click.echo('Replacing configuration of VM "{}" with file "{}".'.format(dom_name, cfgfile.name))
|
click.echo(line)
|
||||||
|
click.echo('')
|
||||||
|
|
||||||
# Verify our XML is sensible
|
# Verify our XML is sensible
|
||||||
try:
|
try:
|
||||||
|
@ -792,6 +776,14 @@ def vm_modify(domain, cfgfile, editor, restart, confirm_flag):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
cleanup(False, 'Error: XML is malformed or invalid: {}'.format(e))
|
cleanup(False, 'Error: XML is malformed or invalid: {}'.format(e))
|
||||||
|
|
||||||
|
click.confirm('Write modifications to cluster?', abort=True)
|
||||||
|
|
||||||
|
if restart and not confirm_flag and not config['unsafe']:
|
||||||
|
try:
|
||||||
|
click.confirm('Restart VM {}'.format(domain), prompt_suffix='? ', abort=True)
|
||||||
|
except Exception:
|
||||||
|
restart = False
|
||||||
|
|
||||||
retcode, retmsg = pvc_vm.vm_modify(config, domain, new_cfg, restart)
|
retcode, retmsg = pvc_vm.vm_modify(config, domain, new_cfg, restart)
|
||||||
if retcode and not restart:
|
if retcode and not restart:
|
||||||
retmsg = retmsg + " Changes will be applied on next VM start/restart."
|
retmsg = retmsg + " Changes will be applied on next VM start/restart."
|
||||||
|
@ -1147,23 +1139,23 @@ def vm_vcpu_set(domain, vcpus, topology, restart, confirm_flag):
|
||||||
|
|
||||||
By default, the topology of the vCPus is 1 socket, VCPUS cores per socket, 1 thread per core.
|
By default, the topology of the vCPus is 1 socket, VCPUS cores per socket, 1 thread per core.
|
||||||
"""
|
"""
|
||||||
if restart and not confirm_flag and not config['unsafe']:
|
|
||||||
try:
|
|
||||||
click.confirm('Restart VM {} after applying change'.format(domain), prompt_suffix='? ', abort=True)
|
|
||||||
except Exception:
|
|
||||||
exit(0)
|
|
||||||
|
|
||||||
if topology is not None:
|
if topology is not None:
|
||||||
try:
|
try:
|
||||||
sockets, cores, threads = topology.split(',')
|
sockets, cores, threads = topology.split(',')
|
||||||
if sockets * cores * threads != vcpus:
|
if sockets * cores * threads != vcpus:
|
||||||
raise
|
raise
|
||||||
except Exception:
|
except Exception:
|
||||||
cleanup(False, "The topology specified is not valid.")
|
cleanup(False, "The specified topology is not valid.")
|
||||||
topology = (sockets, cores, threads)
|
topology = (sockets, cores, threads)
|
||||||
else:
|
else:
|
||||||
topology = (1, vcpus, 1)
|
topology = (1, vcpus, 1)
|
||||||
|
|
||||||
|
if restart and not confirm_flag and not config['unsafe']:
|
||||||
|
try:
|
||||||
|
click.confirm('Restart VM {}'.format(domain), prompt_suffix='? ', abort=True)
|
||||||
|
except Exception:
|
||||||
|
restart = False
|
||||||
|
|
||||||
retcode, retmsg = pvc_vm.vm_vcpus_set(config, domain, vcpus, topology, restart)
|
retcode, retmsg = pvc_vm.vm_vcpus_set(config, domain, vcpus, topology, restart)
|
||||||
if retcode and not restart:
|
if retcode and not restart:
|
||||||
retmsg = retmsg + " Changes will be applied on next VM start/restart."
|
retmsg = retmsg + " Changes will be applied on next VM start/restart."
|
||||||
|
@ -1230,9 +1222,9 @@ def vm_memory_set(domain, memory, restart, confirm_flag):
|
||||||
"""
|
"""
|
||||||
if restart and not confirm_flag and not config['unsafe']:
|
if restart and not confirm_flag and not config['unsafe']:
|
||||||
try:
|
try:
|
||||||
click.confirm('Restart VM {} after applying change'.format(domain), prompt_suffix='? ', abort=True)
|
click.confirm('Restart VM {}'.format(domain), prompt_suffix='? ', abort=True)
|
||||||
except Exception:
|
except Exception:
|
||||||
exit(0)
|
restart = False
|
||||||
|
|
||||||
retcode, retmsg = pvc_vm.vm_memory_set(config, domain, memory, restart)
|
retcode, retmsg = pvc_vm.vm_memory_set(config, domain, memory, restart)
|
||||||
if retcode and not restart:
|
if retcode and not restart:
|
||||||
|
@ -1315,9 +1307,9 @@ def vm_network_add(domain, vni, macaddr, model, restart, confirm_flag):
|
||||||
"""
|
"""
|
||||||
if restart and not confirm_flag and not config['unsafe']:
|
if restart and not confirm_flag and not config['unsafe']:
|
||||||
try:
|
try:
|
||||||
click.confirm('Restart VM {} after applying change'.format(domain), prompt_suffix='? ', abort=True)
|
click.confirm('Restart VM {}'.format(domain), prompt_suffix='? ', abort=True)
|
||||||
except Exception:
|
except Exception:
|
||||||
exit(0)
|
restart = False
|
||||||
|
|
||||||
retcode, retmsg = pvc_vm.vm_networks_add(config, domain, vni, macaddr, model, restart)
|
retcode, retmsg = pvc_vm.vm_networks_add(config, domain, vni, macaddr, model, restart)
|
||||||
if retcode and not restart:
|
if retcode and not restart:
|
||||||
|
@ -1351,9 +1343,9 @@ def vm_network_remove(domain, vni, restart, confirm_flag):
|
||||||
"""
|
"""
|
||||||
if restart and not confirm_flag and not config['unsafe']:
|
if restart and not confirm_flag and not config['unsafe']:
|
||||||
try:
|
try:
|
||||||
click.confirm('Restart VM {} after applying change'.format(domain), prompt_suffix='? ', abort=True)
|
click.confirm('Restart VM {}'.format(domain), prompt_suffix='? ', abort=True)
|
||||||
except Exception:
|
except Exception:
|
||||||
exit(0)
|
restart = False
|
||||||
|
|
||||||
retcode, retmsg = pvc_vm.vm_networks_remove(config, domain, vni, restart)
|
retcode, retmsg = pvc_vm.vm_networks_remove(config, domain, vni, restart)
|
||||||
if retcode and not restart:
|
if retcode and not restart:
|
||||||
|
@ -1444,9 +1436,9 @@ def vm_volume_add(domain, volume, disk_id, bus, disk_type, restart, confirm_flag
|
||||||
"""
|
"""
|
||||||
if restart and not confirm_flag and not config['unsafe']:
|
if restart and not confirm_flag and not config['unsafe']:
|
||||||
try:
|
try:
|
||||||
click.confirm('Restart VM {} after applying change'.format(domain), prompt_suffix='? ', abort=True)
|
click.confirm('Restart VM {}'.format(domain), prompt_suffix='? ', abort=True)
|
||||||
except Exception:
|
except Exception:
|
||||||
exit(0)
|
restart = False
|
||||||
|
|
||||||
retcode, retmsg = pvc_vm.vm_volumes_add(config, domain, volume, disk_id, bus, disk_type, restart)
|
retcode, retmsg = pvc_vm.vm_volumes_add(config, domain, volume, disk_id, bus, disk_type, restart)
|
||||||
if retcode and not restart:
|
if retcode and not restart:
|
||||||
|
@ -1480,9 +1472,9 @@ def vm_volume_remove(domain, vni, restart, confirm_flag):
|
||||||
"""
|
"""
|
||||||
if restart and not confirm_flag and not config['unsafe']:
|
if restart and not confirm_flag and not config['unsafe']:
|
||||||
try:
|
try:
|
||||||
click.confirm('Restart VM {} after applying change'.format(domain), prompt_suffix='? ', abort=True)
|
click.confirm('Restart VM {}'.format(domain), prompt_suffix='? ', abort=True)
|
||||||
except Exception:
|
except Exception:
|
||||||
exit(0)
|
restart = False
|
||||||
|
|
||||||
retcode, retmsg = pvc_vm.vm_volumes_remove(config, domain, vni, restart)
|
retcode, retmsg = pvc_vm.vm_volumes_remove(config, domain, vni, restart)
|
||||||
if retcode and not restart:
|
if retcode and not restart:
|
||||||
|
|
Loading…
Reference in New Issue