From e7deacdc5ed9ca4faef3375e5b962d7b000ba9b5 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 18 Oct 2019 10:49:26 +0300 Subject: Revert "Drop: TransactionalState.has_resource (bad, racy)" This reverts commit 2cdb28a8350478a5d92607be8c95d5e5d43f4dfc. --- ick2/apibase.py | 6 ++++++ ick2/trans.py | 7 +++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ick2/apibase.py b/ick2/apibase.py index 19f70e4..b950c11 100644 --- a/ick2/apibase.py +++ b/ick2/apibase.py @@ -182,6 +182,8 @@ class ResourceApiBase(APIbase): as_dict = self.mangle_new_resource(body) name = self.get_resource_name(as_dict) + if self._trans.has_resource(token, self._type_name, name): + raise ick2.ExistsAlready(name) with self._trans.new(token, self._type_name, name) as resource: resource.from_dict(as_dict) @@ -196,6 +198,8 @@ class ResourceApiBase(APIbase): def update(self, body, name, token=None, **kwargs): name = self.get_resource_name(body) + if not self._trans.has_resource(token, self._type_name, name): + raise ick2.NotFound(kind=self._type_name, name=name) with self._trans.modify(token, self._type_name, name) as resource: as_dict = self.mangle_updated_resource(resource.as_dict(), body) @@ -207,4 +211,6 @@ class ResourceApiBase(APIbase): return new def delete(self, name, token=None, **kwargs): + if not self._trans.has_resource(token, self._type_name, name): + raise ick2.NotFound(kind=self._type_name, name=name) self._trans.remove_resource(token, self._type_name, name) diff --git a/ick2/trans.py b/ick2/trans.py index 119f277..b35cf50 100644 --- a/ick2/trans.py +++ b/ick2/trans.py @@ -60,8 +60,6 @@ class TransactionalState: self.state = state def new(self, token, kind, name): - if self.state.has_resource(token, kind, name): - raise ick2.ExistsAlaready(name) return TransactionalResource(token, self.state, kind, name) def modify(self, token, kind, name): @@ -69,6 +67,9 @@ class TransactionalState: raise ick2.NotFound(kind=kind, name=name) return TransactionalResource(token, self.state, kind, name) + def has_resource(self, token, kind, name): + return self.state.has_resource(token, kind, name) + def get_resource(self, token, kind, name): return self.state.get_resource(token, kind, name) @@ -76,6 +77,4 @@ class TransactionalState: return self.state.get_resources(token, kind) def remove_resource(self, token, kind, name): - if not self.state.has_resource(token, kind, name): - raise ick2.NotFound(kind=kind, name=name) self.state.remove_resource(token, kind, name) -- cgit v1.2.1