Commit b69df995 by Őry Máté

vm: emit {pre,post}_state_changed signals

parent 1df0e6ed
...@@ -10,6 +10,7 @@ from django.core import signing ...@@ -10,6 +10,7 @@ from django.core import signing
from django.db.models import (Model, ForeignKey, ManyToManyField, IntegerField, from django.db.models import (Model, ForeignKey, ManyToManyField, IntegerField,
DateTimeField, BooleanField, TextField, DateTimeField, BooleanField, TextField,
CharField, permalink, Manager) CharField, permalink, Manager)
from django.dispatch import Signal
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
...@@ -33,6 +34,9 @@ ARCHITECTURES = (('x86_64', 'x86-64 (64 bit)'), ...@@ -33,6 +34,9 @@ ARCHITECTURES = (('x86_64', 'x86-64 (64 bit)'),
('i686', 'x86 (32 bit)')) ('i686', 'x86 (32 bit)'))
VNC_PORT_RANGE = (2000, 65536) # inclusive start, exclusive end VNC_PORT_RANGE = (2000, 65536) # inclusive start, exclusive end
pre_state_changed = Signal(providing_args=["new_state"])
post_state_changed = Signal(providing_args=["new_state"])
class InstanceActiveManager(Manager): class InstanceActiveManager(Manager):
def get_query_set(self): def get_query_set(self):
...@@ -858,8 +862,15 @@ class Instance(AclBase, VirtualMachineDescModel, TimeStampedModel): ...@@ -858,8 +862,15 @@ class Instance(AclBase, VirtualMachineDescModel, TimeStampedModel):
logger.debug('Instance %s state changed ' logger.debug('Instance %s state changed '
'(db: %s, new: %s)', '(db: %s, new: %s)',
self, self.state, new_state) self, self.state, new_state)
self.state = new_state try:
self.save() pre_state_changed.send(sender=self, new_state=new_state)
except Exception as e:
logger.info('Instance %s state change ignored: %s',
unicode(self), unicode(e))
else:
self.state = new_state
self.save()
post_state_changed.send(sender=self, new_state=new_state)
class InstanceActivity(ActivityModel): class InstanceActivity(ActivityModel):
......
from django.test import TestCase from django.test import TestCase
from ..models import InstanceTemplate
from mock import Mock
from ..models import (
InstanceTemplate, Instance, pre_state_changed, post_state_changed
)
class TemplateTestCase(TestCase): class TemplateTestCase(TestCase):
def test_template_creation(self): def test_template_creation(self):
template = InstanceTemplate(name='My first template', template = InstanceTemplate(name='My first template',
access_method='ssh', ) access_method='ssh', )
template.clean() template.clean()
# TODO add images & net # TODO add images & net
class InstanceTestCase(TestCase):
def test_pre_state_changed_w_exception(self):
"""Signal handler of pre_state_changed prevents save with Exception."""
def callback(sender, new_state, **kwargs):
if new_state == 'invalid value':
raise Exception()
pre_state_changed.connect(callback)
i = Instance(state='NOSTATE')
i.save = Mock()
i.state_changed('invalid value')
assert i.state == 'NOSTATE'
assert not i.save.called
def test_pre_state_changed_wo_exception(self):
"""Signal handler of pre_state_changed allows save."""
mock = Mock()
pre_state_changed.connect(mock)
i = Instance(state='NOSTATE')
i.save = Mock()
i.state_changed('RUNNING')
assert i.state == 'RUNNING'
assert mock.called
assert i.save.called
def test_post_state_changed(self):
"""Signal handler of post_state_changed runs."""
mock = Mock()
post_state_changed.connect(mock)
i = Instance(state='NOSTATE')
i.save = Mock()
i.state_changed('RUNNING')
assert mock.called
assert i.save.called
assert i.state == 'RUNNING'
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