diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-05-29 00:11:02 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-05-29 00:11:02 +0000 |
| commit | 6d99004ab93df2e5afce82f313a2e9c9a3768ff1 (patch) | |
| tree | e709a5d028af1eb1f2a3a31ea2d385f0e26cbc39 /nova | |
| parent | ea4c411bca55dc885c466b0068fde02fb289323d (diff) | |
| parent | 1ddb1bc515749c5033687b926049f67d66a4ffb1 (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.py | 26 | ||||
| -rw-r--r-- | nova/compute/api.py | 15 | ||||
| -rw-r--r-- | nova/db/api.py | 5 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 12 | ||||
| -rw-r--r-- | nova/network/security_group/quantum_driver.py | 18 | ||||
| -rw-r--r-- | nova/network/security_group/security_group_base.py | 4 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_quantum_security_groups.py | 4 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_security_groups.py | 48 | ||||
| -rw-r--r-- | nova/tests/test_db_api.py | 13 |
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() |
