Added naive method to check if object already exists

Change-Id: Iefc1e3d2d6062fbe9375187472fd867db8d60c8c
This commit is contained in:
Jedrzej Nowak 2016-03-04 17:14:14 +01:00
parent e1795c1f63
commit ef683d7a6b
3 changed files with 49 additions and 1 deletions

View File

@ -852,7 +852,7 @@ class Model(object):
return cache.get(riak_obj.key)
@classmethod
def from_dict(cls, key, data=None):
def _pre_from_dict_check(cls, key, data=None):
if isinstance(key, dict) and data is None:
data = key
try:
@ -866,6 +866,11 @@ class Model(object):
if key in cls._c.obj_cache:
raise DBLayerException("Object already exists in cache"
" cannot create second")
return key, data
@classmethod
def from_dict(cls, key, data=None):
key, data = cls._pre_from_dict_check(key, data)
data['key'] = key
with cls._c.obj_cache._lock:

View File

@ -828,6 +828,18 @@ class Resource(Model):
updated = IndexedField(StrInt)
@classmethod
def _pre_from_dict_check(cls, key, data=None):
# NOTE(jnowak): it's a bit naive implementation, we will
# introduce something smarter instead based on conflict
# resolution.
ret = super(Resource, cls)._pre_from_dict_check(key, data)
robj = cls.bucket.get(key)
if robj.exists:
raise DBLayerException("Object already exists in "
"database cannot create second")
return ret
def _connect_single(self, other_inputs, other_name, my_name):
if isinstance(other_name, (list, tuple)):
# XXX: could be paralelized

View File

@ -15,6 +15,8 @@
import base
from solar.core import resource
from solar.core import signals
from solar.dblayer.model import clear_cache
from solar.dblayer.model import DBLayerException
class TestResource(base.BaseResourceTest):
@ -112,6 +114,35 @@ input:
sample1.delete()
self.assertEqual(sample2.args['value'], 0)
def test_double_create(self):
sample_meta_dir = self.make_resource_meta("""
id: sample
handler: ansible
version: 1.0.0
input:
value:
schema: int
value: 0
""")
self.create_resource('sample1', sample_meta_dir,
{'value': 1})
with self.assertRaisesRegexp(
DBLayerException,
"Object already exists in cache cannot create second"
):
self.create_resource('sample1', sample_meta_dir,
{'value': 1})
clear_cache()
with self.assertRaisesRegexp(
DBLayerException,
"Object already exists in database cannot create second"
):
self.create_resource('sample1', sample_meta_dir,
{'value': 1})
def test_computable_input(self):
"""Test that connection removed with resource."""
sample_meta_dir = self.make_resource_meta("""