summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-05-29 00:11:02 +0000
committerGerrit Code Review <review@openstack.org>2013-05-29 00:11:02 +0000
commit6d99004ab93df2e5afce82f313a2e9c9a3768ff1 (patch)
treee709a5d028af1eb1f2a3a31ea2d385f0e26cbc39 /nova
parentea4c411bca55dc885c466b0068fde02fb289323d (diff)
parent1ddb1bc515749c5033687b926049f67d66a4ffb1 (diff)
Merge "Add update method of security group name and description"
Diffstat (limited to 'nova')
-rw-r--r--nova/api/openstack/compute/contrib/security_groups.py26
-rw-r--r--nova/compute/api.py15
-rw-r--r--nova/db/api.py5
-rw-r--r--nova/db/sqlalchemy/api.py12
-rw-r--r--nova/network/security_group/quantum_driver.py18
-rw-r--r--nova/network/security_group/security_group_base.py4
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_quantum_security_groups.py4
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_security_groups.py48
-rw-r--r--nova/tests/test_db_api.py13
9 files changed, 144 insertions, 1 deletions
diff --git a/nova/api/openstack/compute/contrib/security_groups.py b/nova/api/openstack/compute/contrib/security_groups.py
index 87ef6d882..041eb0dc5 100644
--- a/nova/api/openstack/compute/contrib/security_groups.py
+++ b/nova/api/openstack/compute/contrib/security_groups.py
@@ -295,6 +295,30 @@ class SecurityGroupController(SecurityGroupControllerBase):
return {'security_group': self._format_security_group(context,
group_ref)}
+ @wsgi.serializers(xml=SecurityGroupTemplate)
+ def update(self, req, id, body):
+ """Update a security group."""
+ context = _authorize_context(req)
+
+ id = self.security_group_api.validate_id(id)
+
+ security_group = self.security_group_api.get(context, None, id,
+ map_exception=True)
+ security_group_data = self._from_body(body, 'security_group')
+
+ group_name = security_group_data.get('name', None)
+ group_description = security_group_data.get('description', None)
+
+ self.security_group_api.validate_property(group_name, 'name', None)
+ self.security_group_api.validate_property(group_description,
+ 'description', None)
+
+ group_ref = self.security_group_api.update_security_group(
+ context, security_group, group_name, group_description)
+
+ return {'security_group': self._format_security_group(context,
+ group_ref)}
+
class SecurityGroupRulesController(SecurityGroupControllerBase):
@@ -577,7 +601,7 @@ class Security_groups(extensions.ExtensionDescriptor):
name = "SecurityGroups"
alias = "os-security-groups"
namespace = "http://docs.openstack.org/compute/ext/securitygroups/api/v1.1"
- updated = "2011-07-21T00:00:00+00:00"
+ updated = "2013-05-28T00:00:00+00:00"
def get_controller_extensions(self):
controller = SecurityGroupActionController()
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 939b64778..32a68280d 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -2929,6 +2929,21 @@ class SecurityGroupAPI(base.Base, security_group_base.SecurityGroupBase):
return group_ref
+ def update_security_group(self, context, security_group,
+ name, description):
+ if security_group['name'] in RO_SECURITY_GROUPS:
+ msg = (_("Unable to update system group '%s'") %
+ security_group['name'])
+ self.raise_invalid_group(msg)
+
+ group = {'name': name,
+ 'description': description}
+
+ group_ref = self.db.security_group_update(context,
+ security_group['id'],
+ group)
+ return group_ref
+
def get(self, context, name=None, id=None, map_exception=False):
self.ensure_default(context)
try:
diff --git a/nova/db/api.py b/nova/db/api.py
index 677ed771b..d2f824d22 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -1097,6 +1097,11 @@ def security_group_create(context, values):
return IMPL.security_group_create(context, values)
+def security_group_update(context, security_group_id, values):
+ """Update a security group."""
+ return IMPL.security_group_update(context, security_group_id, values)
+
+
def security_group_ensure_default(context):
"""Ensure default security group exists for a project_id.
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 5b139d6d6..68eb25ebf 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -3314,6 +3314,18 @@ def security_group_create(context, values, session=None):
return security_group_ref
+@require_context
+def security_group_update(context, security_group_id, values, session=None):
+ security_group_ref = model_query(context, models.SecurityGroup,
+ session=session).filter_by(id=security_group_id).first()
+
+ if not security_group_ref:
+ raise exception.SecurityGroupNotFound(
+ security_group_id=security_group_id)
+ security_group_ref.update(values)
+ return security_group_ref
+
+
def security_group_ensure_default(context, session=None):
"""Ensure default security group exists for a project_id."""
try:
diff --git a/nova/network/security_group/quantum_driver.py b/nova/network/security_group/quantum_driver.py
index bd99f0a40..cb5f6551f 100644
--- a/nova/network/security_group/quantum_driver.py
+++ b/nova/network/security_group/quantum_driver.py
@@ -60,6 +60,24 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
raise e
return self._convert_to_nova_security_group_format(security_group)
+ def update_security_group(self, context, security_group,
+ name, description):
+ quantum = quantumv2.get_client(context)
+ body = self._make_quantum_security_group_dict(name, description)
+ try:
+ security_group = quantum.update_security_group(
+ security_group['id'], body).get('security_group')
+ except q_exc.QuantumClientException as e:
+ LOG.exception(_("Quantum Error updating security group %s"),
+ name)
+ if e.status_code == 401:
+ # TODO(arosen) Cannot raise generic response from quantum here
+ # as this error code could be related to bad input or over
+ # quota
+ raise exc.HTTPBadRequest()
+ raise e
+ return self._convert_to_nova_security_group_format(security_group)
+
def _convert_to_nova_security_group_format(self, security_group):
nova_group = {}
nova_group['id'] = security_group['id']
diff --git a/nova/network/security_group/security_group_base.py b/nova/network/security_group/security_group_base.py
index 3babf4b00..484927c84 100644
--- a/nova/network/security_group/security_group_base.py
+++ b/nova/network/security_group/security_group_base.py
@@ -185,6 +185,10 @@ class SecurityGroupBase(object):
def create_security_group(self, context, name, description):
raise NotImplementedError()
+ def update_security_group(self, context, security_group,
+ name, description):
+ raise NotImplementedError()
+
def get(self, context, name=None, id=None, map_exception=False):
raise NotImplementedError()
diff --git a/nova/tests/api/openstack/compute/contrib/test_quantum_security_groups.py b/nova/tests/api/openstack/compute/contrib/test_quantum_security_groups.py
index ee65f3707..7201ad954 100644
--- a/nova/tests/api/openstack/compute/contrib/test_quantum_security_groups.py
+++ b/nova/tests/api/openstack/compute/contrib/test_quantum_security_groups.py
@@ -116,6 +116,10 @@ class TestQuantumSecurityGroups(
# Enforced by Quantum server.
pass
+ def test_update_security_group(self):
+ # Enforced by Quantum server.
+ pass
+
def test_get_security_group_list(self):
self._create_sg_template().get('security_group')
req = fakes.HTTPRequest.blank('/v2/fake/os-security-groups')
diff --git a/nova/tests/api/openstack/compute/contrib/test_security_groups.py b/nova/tests/api/openstack/compute/contrib/test_security_groups.py
index b1a5b3fdf..1406ed97a 100644
--- a/nova/tests/api/openstack/compute/contrib/test_security_groups.py
+++ b/nova/tests/api/openstack/compute/contrib/test_security_groups.py
@@ -408,6 +408,54 @@ class TestSecurityGroups(test.TestCase):
self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete,
req, self.fake_id)
+ def test_update_security_group(self):
+ sg = security_group_template(id=2, rules=[])
+ sg_update = security_group_template(id=2, rules=[],
+ name='update_name', description='update_desc')
+
+ def return_security_group(context, group_id):
+ self.assertEquals(sg['id'], group_id)
+ return security_group_db(sg)
+
+ def return_update_security_group(context, group_id, values):
+ self.assertEquals(sg_update['id'], group_id)
+ self.assertEquals(sg_update['name'], values['name'])
+ self.assertEquals(sg_update['description'], values['description'])
+ return security_group_db(sg_update)
+
+ self.stubs.Set(nova.db, 'security_group_update',
+ return_update_security_group)
+ self.stubs.Set(nova.db, 'security_group_get',
+ return_security_group)
+
+ req = fakes.HTTPRequest.blank('/v2/fake/os-security-groups/2')
+ res_dict = self.controller.update(req, '2',
+ {'security_group': sg_update})
+
+ expected = {'security_group': sg_update}
+ self.assertEquals(res_dict, expected)
+
+ def test_update_security_group_name_to_default(self):
+ sg = security_group_template(id=2, rules=[], name='default')
+
+ def return_security_group(context, group_id):
+ self.assertEquals(sg['id'], group_id)
+ return security_group_db(sg)
+
+ self.stubs.Set(nova.db, 'security_group_get',
+ return_security_group)
+
+ req = fakes.HTTPRequest.blank('/v2/fake/os-security-groups/2')
+ self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update,
+ req, '2', {'security_group': sg})
+
+ def test_update_default_security_group_fail(self):
+ sg = security_group_template()
+
+ req = fakes.HTTPRequest.blank('/v2/fake/os-security-groups/1')
+ self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update,
+ req, '1', {'security_group': sg})
+
def test_delete_security_group_by_id(self):
sg = security_group_template(id=1, rules=[])
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index 86c97553b..c6a8e7794 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -1112,6 +1112,19 @@ class DbApiTestCase(DbTestCase):
ec2_id = db.get_ec2_snapshot_id_by_uuid(self.context, 'fake-uuid')
self.assertEqual(ref['id'], ec2_id)
+ def test_security_group_update(self):
+ ctxt = context.get_admin_context()
+ values = {'security_group': {'tenant_id': '123',
+ 'name': 'test', 'description': 'test-description'}}
+ sg = db.security_group_create(ctxt, values)
+
+ values['security_group']['name'] = 'test_name'
+ values['security_group']['description'] = 'test_desc'
+ sg = db.security_group_update(ctxt, sg['id'], values)
+ self.assertNotEqual(None, sg)
+ self.assertEqual(sg['security_group']['name'], 'test_name')
+ self.assertEqual(sg['security_group']['description'], 'test_desc')
+
def test_bw_usage_calls(self):
ctxt = context.get_admin_context()
now = timeutils.utcnow()