summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorTrey Morris <trey.morris@rackspace.com>2010-12-29 18:30:01 -0600
committerTrey Morris <trey.morris@rackspace.com>2010-12-29 18:30:01 -0600
commit24e253a1feaa0a39e4095f447f62f7ea9b43c8bb (patch)
tree1852c703ed74a24eb9492c0cffc5e2d385ea5333 /nova/compute
parentbe6750a77e5121fe8f0d95016da4e96c9de3b5aa (diff)
moved check lock decorator to compute api level. altered openstack.test_servers according and wrote test for lock in tests.test_compute
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/api.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 361ab9914..d720a8f2c 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -23,6 +23,7 @@ Handles all API requests relating to instances (guest vms).
import datetime
import logging
import time
+import functools
from nova import db
from nova import exception
@@ -36,6 +37,40 @@ from nova.db import base
FLAGS = flags.FLAGS
+def checks_instance_lock(function):
+ """
+ decorator used for preventing action against locked instances
+ unless, of course, you happen to be admin
+
+ """
+
+ @functools.wraps(function)
+ def decorated_function(*args, **kwargs):
+
+ # grab args to function
+ try:
+ if 'context' in kwargs:
+ context = kwargs['context']
+ else:
+ context = args[1]
+ if 'instance_id' in kwargs:
+ instance_id = kwargs['instance_id']
+ else:
+ instance_id = args[2]
+ locked = ComputeAPI().get_lock(context, instance_id)
+ admin = context.is_admin
+ except:
+ logging.error(_("check_instance_lock: argument error: |%s|, |%s|"),
+ args,
+ kwargs)
+ # if admin or unlocked call function, otherwise 405
+ if admin or not locked:
+ return function(*args, **kwargs)
+ raise Exception(_("Instance is locked, cannot execute |%s|"), function)
+
+ return decorated_function
+
+
def generate_default_hostname(internal_id):
"""Default function to generate a hostname given an instance reference."""
return str(internal_id)
@@ -198,6 +233,7 @@ class ComputeAPI(base.Base):
'project_id': context.project_id}
db.security_group_create(context, values)
+ @checks_instance_lock
def update_instance(self, context, instance_id, **kwargs):
"""Updates the instance in the datastore.
@@ -212,6 +248,7 @@ class ComputeAPI(base.Base):
"""
return self.db.instance_update(context, instance_id, kwargs)
+ @checks_instance_lock
def delete_instance(self, context, instance_id):
logging.debug("Going to try and terminate %d" % instance_id)
try:
@@ -258,6 +295,7 @@ class ComputeAPI(base.Base):
def get_instance(self, context, instance_id):
return self.db.instance_get_by_internal_id(context, instance_id)
+ @checks_instance_lock
def reboot(self, context, instance_id):
"""Reboot the given instance."""
instance = self.db.instance_get_by_internal_id(context, instance_id)
@@ -267,6 +305,7 @@ class ComputeAPI(base.Base):
{"method": "reboot_instance",
"args": {"instance_id": instance['id']}})
+ @checks_instance_lock
def pause(self, context, instance_id):
"""Pause the given instance."""
instance = self.db.instance_get_by_internal_id(context, instance_id)
@@ -276,6 +315,7 @@ class ComputeAPI(base.Base):
{"method": "pause_instance",
"args": {"instance_id": instance['id']}})
+ @checks_instance_lock
def unpause(self, context, instance_id):
"""Unpause the given instance."""
instance = self.db.instance_get_by_internal_id(context, instance_id)
@@ -285,6 +325,7 @@ class ComputeAPI(base.Base):
{"method": "unpause_instance",
"args": {"instance_id": instance['id']}})
+ @checks_instance_lock
def suspend(self, context, instance_id):
"""suspend the instance with instance_id"""
instance = self.db.instance_get_by_internal_id(context, instance_id)
@@ -294,6 +335,7 @@ class ComputeAPI(base.Base):
{"method": "suspend_instance",
"args": {"instance_id": instance['id']}})
+ @checks_instance_lock
def resume(self, context, instance_id):
"""resume the instance with instance_id"""
instance = self.db.instance_get_by_internal_id(context, instance_id)
@@ -303,6 +345,7 @@ class ComputeAPI(base.Base):
{"method": "resume_instance",
"args": {"instance_id": instance['id']}})
+ @checks_instance_lock
def rescue(self, context, instance_id):
"""Rescue the given instance."""
instance = self.db.instance_get_by_internal_id(context, instance_id)
@@ -312,6 +355,7 @@ class ComputeAPI(base.Base):
{"method": "rescue_instance",
"args": {"instance_id": instance['id']}})
+ @checks_instance_lock
def unrescue(self, context, instance_id):
"""Unrescue the given instance."""
instance = self.db.instance_get_by_internal_id(context, instance_id)