Merge "Prevent updating os_id of db items"
This commit is contained in:
commit
3a371c2f7a
@ -29,6 +29,7 @@ from sqlalchemy.sql import bindparam
|
|||||||
|
|
||||||
import ec2api.context
|
import ec2api.context
|
||||||
from ec2api.db.sqlalchemy import models
|
from ec2api.db.sqlalchemy import models
|
||||||
|
from ec2api import exception
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
|
||||||
@ -142,8 +143,12 @@ def add_item_id(context, kind, os_id, project_id=None):
|
|||||||
def update_item(context, item):
|
def update_item(context, item):
|
||||||
item_ref = (model_query(context, models.Item).
|
item_ref = (model_query(context, models.Item).
|
||||||
filter_by(project_id=context.project_id,
|
filter_by(project_id=context.project_id,
|
||||||
id=item["id"]).
|
id=item['id']).
|
||||||
one())
|
one())
|
||||||
|
if item_ref.os_id and item_ref.os_id != item['os_id']:
|
||||||
|
raise exception.EC2DBInvalidOsIdUpdate(item_id=item['id'],
|
||||||
|
old_os_id=item_ref.os_id,
|
||||||
|
new_os_id=item['os_id'])
|
||||||
item_ref.update(_pack_item_data(item))
|
item_ref.update(_pack_item_data(item))
|
||||||
item_ref.save()
|
item_ref.save()
|
||||||
return _unpack_item_data(item_ref)
|
return _unpack_item_data(item_ref)
|
||||||
|
@ -100,6 +100,11 @@ class EC2KeystoneDiscoverFailure(EC2APIException):
|
|||||||
msg_fmt = _("Could not discover keystone versions.")
|
msg_fmt = _("Could not discover keystone versions.")
|
||||||
|
|
||||||
|
|
||||||
|
class EC2DBInvalidOsIdUpdate(EC2APIException):
|
||||||
|
msg_fmt = _('Invalid update of os_id of %(item_id)s item '
|
||||||
|
'from %(old_os_id)s to %(new_os_id)s')
|
||||||
|
|
||||||
|
|
||||||
# Internal ec2api metadata exceptions
|
# Internal ec2api metadata exceptions
|
||||||
|
|
||||||
class EC2MetadataException(EC2APIException):
|
class EC2MetadataException(EC2APIException):
|
||||||
|
@ -17,6 +17,7 @@ from sqlalchemy.orm import exc as orm_exception
|
|||||||
|
|
||||||
from ec2api.api import validator
|
from ec2api.api import validator
|
||||||
from ec2api.db import api as db_api
|
from ec2api.db import api as db_api
|
||||||
|
from ec2api import exception
|
||||||
from ec2api.tests.unit import base
|
from ec2api.tests.unit import base
|
||||||
from ec2api.tests.unit import fakes
|
from ec2api.tests.unit import fakes
|
||||||
from ec2api.tests.unit import matchers
|
from ec2api.tests.unit import matchers
|
||||||
@ -142,6 +143,22 @@ class DbApiTestCase(base.DbTestCase):
|
|||||||
{'id': fakes.random_ec2_id('fake'),
|
{'id': fakes.random_ec2_id('fake'),
|
||||||
'key': 'val'})
|
'key': 'val'})
|
||||||
|
|
||||||
|
def test_update_item_os_id(self):
|
||||||
|
item = db_api.add_item(self.context, 'fake', {})
|
||||||
|
item['os_id'] = 'fake_os_id'
|
||||||
|
db_api.update_item(self.context, item)
|
||||||
|
item = db_api.get_item_by_id(self.context, item['id'])
|
||||||
|
self.assertThat({'os_id': 'fake_os_id'},
|
||||||
|
matchers.IsSubDictOf(item))
|
||||||
|
item['os_id'] = 'other_fake_os_id'
|
||||||
|
self.assertRaises(exception.EC2DBInvalidOsIdUpdate,
|
||||||
|
db_api.update_item,
|
||||||
|
self.context, item)
|
||||||
|
item['os_id'] = None
|
||||||
|
self.assertRaises(exception.EC2DBInvalidOsIdUpdate,
|
||||||
|
db_api.update_item,
|
||||||
|
self.context, item)
|
||||||
|
|
||||||
def test_delete_item(self):
|
def test_delete_item(self):
|
||||||
item = db_api.add_item(self.context, 'fake', {})
|
item = db_api.add_item(self.context, 'fake', {})
|
||||||
db_api.delete_item(self.context, item['id'])
|
db_api.delete_item(self.context, item['id'])
|
||||||
|
Loading…
Reference in New Issue
Block a user