Commit 0c2709fa by Őry Máté

Merge branch 'issue-295' into 'master'

Issue 295
parents 91843cc1 80512ca6
......@@ -447,21 +447,22 @@ class Instance(AclBase, VirtualMachineDescModel, StatusModel, OperatedMixin,
self.time_of_suspend, self.time_of_delete = self.get_renew_times()
super(Instance, self).clean(*args, **kwargs)
def vm_state_changed(self, new_state):
def vm_state_changed(self, new_state, new_node=False):
if new_node is False: # None would be a valid value
new_node = self.node
# log state change
try:
act = InstanceActivity.create(
code_suffix='vm_state_changed',
readable_name=create_readable(
ugettext_noop("vm state changed to %(state)s"),
state=new_state),
ugettext_noop("vm state changed to %(state)s on %(node)s"),
state=new_state, node=new_node),
instance=self)
except ActivityInProgressError:
pass # discard state change if another activity is in progress.
else:
if new_state == 'STOPPED':
self.vnc_port = None
self.node = None
if self.node != new_node:
self.node = new_node
self.save()
act.finished = act.started
act.resultant_state = new_state
......
......@@ -354,7 +354,8 @@ class Node(OperatedMixin, TimeStampedModel):
logger.info('Node %s update: instance %s missing from '
'libvirt', self, i['id'])
# Set state to STOPPED when instance is missing
self.instance_set.get(id=i['id']).vm_state_changed('STOPPED')
self.instance_set.get(id=i['id']).vm_state_changed(
'STOPPED', None)
else:
if d != i['state']:
logger.info('Node %s update: instance %s state changed '
......@@ -363,9 +364,11 @@ class Node(OperatedMixin, TimeStampedModel):
self.instance_set.get(id=i['id']).vm_state_changed(d)
del domains[i['id']]
for i in domains.keys():
logger.info('Node %s update: domain %s in libvirt but not in db.',
self, i)
for id, state in domains.iteritems():
from .instance import Instance
logger.error('Node %s update: domain %s in libvirt but not in db.',
self, id)
Instance.objects.get(id=id).vm_state_changed(state, self)
@classmethod
def get_state_count(cls, online, enabled):
......
......@@ -629,7 +629,6 @@ class ShutdownOperation(InstanceOperation):
def _operation(self, task=None):
self.instance.shutdown_vm(task=task)
self.instance.yield_node()
self.instance.yield_vnc_port()
def on_abort(self, activity, error):
if isinstance(error, TimeLimitExceeded):
......@@ -670,9 +669,7 @@ class ShutOffOperation(InstanceOperation):
with activity.sub_activity('delete_vm'):
self.instance.delete_vm()
# Clear node and VNC port association
self.instance.yield_node()
self.instance.yield_vnc_port()
register_operation(ShutOffOperation)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment