Add ability to restart VM

This commit is contained in:
Joshua Boniface 2018-06-13 12:47:30 -04:00
parent f8e1039a07
commit bc52c80aec
1 changed files with 41 additions and 4 deletions

View File

@ -35,10 +35,11 @@ class VMInstance:
self.hypervisor = None self.hypervisor = None
self.state = None self.state = None
self.instart = False self.instart = False
self.instop = False self.inrestart = False
self.inshutdown = False
self.inmigrate = False self.inmigrate = False
self.inreceive = False self.inreceive = False
self.inshutdown = False
self.instop = False
self.dom = self.lookupByUUID(self.domuuid) self.dom = self.lookupByUUID(self.domuuid)
@ -86,7 +87,31 @@ class VMInstance:
conn.close() conn.close()
self.instart = False self.instart = False
# Restart the VM
def restart_vm(self):
ansiiprint.echo('Restarting VM', '{}:'.format(self.domuuid), 'i')
self.inrestart = True
# Start up a new Libvirt connection
libvirt_name = "qemu:///system"
conn = libvirt.open(libvirt_name)
if conn == None:
ansiiprint.echo('Failed to open local libvirt connection', '{}:'.format(self.domuuid), 'e')
self.inrestart = False
return
try:
self.shutdown_vm()
self.start_vm()
ansiiprint.echo('Successfully restarted VM', '{}:'.format(self.domuuid), 'o')
except libvirt.libvirtError as e:
ansiiprint.echo('Failed to restart VM', '{}:'.format(self.domuuid), 'e')
self.zk.set('/domains/{}/state'.format(self.domuuid), 'start'.encode('ascii'))
conn.close()
self.inrestart = False
# Stop the VM forcibly without updating state # Stop the VM forcibly without updating state
def terminate_vm(self): def terminate_vm(self):
ansiiprint.echo('Terminating VM', '{}:'.format(self.domuuid), 'i') ansiiprint.echo('Terminating VM', '{}:'.format(self.domuuid), 'i')
@ -255,11 +280,17 @@ class VMInstance:
# Valid states are: # Valid states are:
# start # start
# migrate # migrate
# restart
# shutdown # shutdown
# stop # stop
# Conditional pass one - Are we already performing an action # Conditional pass one - Are we already performing an action
if self.instart == False and self.instop == False and self.inshutdown == False and self.inmigrate == False and self.inreceive == False: if self.instart == False \
and self.inrestart == False \
and self.inmigrate == False \
and self.inreceive == False \
and self.inshutdown == False \
and self.instop == False:
# Conditional pass two - Is this VM configured to run on this hypervisor # Conditional pass two - Is this VM configured to run on this hypervisor
if self.hypervisor == self.thishypervisor.name: if self.hypervisor == self.thishypervisor.name:
# Conditional pass three - Is this VM currently running on this hypervisor # Conditional pass three - Is this VM currently running on this hypervisor
@ -273,6 +304,9 @@ class VMInstance:
self.zk.set('/domains/{}/state'.format(self.domuuid), 'start'.encode('ascii')) self.zk.set('/domains/{}/state'.format(self.domuuid), 'start'.encode('ascii'))
if not self.domuuid in self.thishypervisor.domain_list: if not self.domuuid in self.thishypervisor.domain_list:
self.thishypervisor.domain_list.append(self.domuuid) self.thishypervisor.domain_list.append(self.domuuid)
# VM should be restarted
elif self.state == "restart":
self.restart_vm()
# VM should be shut down # VM should be shut down
elif self.state == "shutdown": elif self.state == "shutdown":
self.shutdown_vm() self.shutdown_vm()
@ -286,6 +320,9 @@ class VMInstance:
# VM should be migrated to this hypervisor # VM should be migrated to this hypervisor
elif self.state == "migrate": elif self.state == "migrate":
self.receive_migrate() self.receive_migrate()
# VM should be restarted (i.e. started since it isn't running)
if self.state == "restart":
self.zk.set('/domains/{}/state'.format(self.domuuid), 'start'.encode('ascii'))
# VM should be shut down; ensure it's gone from this node's domain_list # VM should be shut down; ensure it's gone from this node's domain_list
elif self.state == "shutdown": elif self.state == "shutdown":
if self.domuuid in self.thishypervisor.domain_list: if self.domuuid in self.thishypervisor.domain_list: