Skip to content

Commit

Permalink
delete a non existent flavor extra spec returns 204
Browse files Browse the repository at this point in the history
Attempting to delete a non existent flavor extra spec returns
204 instead of 404, the fix was return 404 for such case.

Fix bug 1219445

Change-Id: I61db53486b5696fe74f16ac2d98971092137fadf
  • Loading branch information
jake-liu committed Sep 17, 2013
1 parent db6721b commit be2018c
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 5 deletions.
5 changes: 4 additions & 1 deletion nova/api/openstack/compute/contrib/flavorextraspecs.py
Expand Up @@ -112,7 +112,10 @@ def delete(self, req, flavor_id, id):
"""Deletes an existing extra spec."""
context = req.environ['nova.context']
authorize(context, action='delete')
db.flavor_extra_specs_delete(context, flavor_id, id)
try:
db.flavor_extra_specs_delete(context, flavor_id, id)
except exception.InstanceTypeExtraSpecsNotFound as e:
raise exc.HTTPNotFound(explanation=e.format_message())


class Flavorextraspecs(extensions.ExtensionDescriptor):
Expand Down
6 changes: 5 additions & 1 deletion nova/api/openstack/compute/plugins/v3/flavors_extraspecs.py
Expand Up @@ -112,11 +112,15 @@ def show(self, req, flavor_id, id):
raise webob.exc.HTTPNotFound(explanation=e.format_message())

@wsgi.response(204)
@extensions.expected_errors(404)
def delete(self, req, flavor_id, id):
"""Deletes an existing extra spec."""
context = req.environ['nova.context']
self.authorize(context, action='delete')
db.instance_type_extra_specs_delete(context, flavor_id, id)
try:
db.instance_type_extra_specs_delete(context, flavor_id, id)
except exception.InstanceTypeExtraSpecsNotFound as e:
raise webob.exc.HTTPNotFound(explanation=e.format_message())


class FlavorsExtraSpecs(extensions.V3APIExtensionBase):
Expand Down
10 changes: 7 additions & 3 deletions nova/db/sqlalchemy/api.py
Expand Up @@ -4382,9 +4382,13 @@ def flavor_extra_specs_get_item(context, flavor_id, key):

@require_context
def flavor_extra_specs_delete(context, flavor_id, key):
_instance_type_extra_specs_get_query(context, flavor_id).\
filter(models.InstanceTypeExtraSpecs.key == key).\
soft_delete(synchronize_session=False)
result = _instance_type_extra_specs_get_query(context, flavor_id).\
filter(models.InstanceTypeExtraSpecs.key == key).\
soft_delete(synchronize_session=False)
# did not find the extra spec
if result == 0:
raise exception.InstanceTypeExtraSpecsNotFound(
extra_specs_key=key, instance_type_id=flavor_id)


@require_context
Expand Down
Expand Up @@ -115,6 +115,12 @@ def test_delete_no_admin(self):
self.assertRaises(exception.NotAuthorized, self.controller.delete,
req, 1, 'key 5')

def test_delete_spec_not_found(self):
req = fakes.HTTPRequest.blank('/v2/fake/flavors/1/os-extra_specs' +
'/key6', use_admin_context=True)
self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete,
req, 1, 'key6')

def test_create(self):
self.stubs.Set(nova.db,
'flavor_extra_specs_update_or_create',
Expand Down
Expand Up @@ -112,6 +112,12 @@ def test_delete_no_admin(self):
self.assertRaises(exception.NotAuthorized, self.controller.delete,
req, 1, 'key 5')

def test_delete_spec_not_found(self):
req = fakes.HTTPRequest.blank('/v3/flavors/1/extra-specs/key6',
use_admin_context=True)
self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete,
req, 1, 'key6')

def test_create(self):
self.stubs.Set(nova.db,
'instance_type_extra_specs_update_or_create',
Expand Down
6 changes: 6 additions & 0 deletions nova/tests/db/test_db_api.py
Expand Up @@ -2728,6 +2728,12 @@ def test_instance_type_extra_specs_delete(self):
it['flavorid'])
self._assertEqualObjects(it['extra_specs'], real_specs)

def test_instance_type_extra_specs_delete_failed(self):
for it in self.inst_types:
self.assertRaises(exception.InstanceTypeExtraSpecsNotFound,
db.flavor_extra_specs_delete,
self.ctxt, it['flavorid'], 'dummy')

def test_instance_type_extra_specs_update_or_create(self):
for it in self.inst_types:
current_specs = it['extra_specs']
Expand Down

0 comments on commit be2018c

Please sign in to comment.