diff options
Diffstat (limited to 'ick2/store.py')
-rw-r--r-- | ick2/store.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/ick2/store.py b/ick2/store.py index 5c01f89..83a008b 100644 --- a/ick2/store.py +++ b/ick2/store.py @@ -15,9 +15,13 @@ import copy +import json import uuid +import requests + + import ick2 @@ -75,3 +79,82 @@ class MemoryStore(StoreInterface): def delete(self, token, rid): del self._objs[rid] + + +class MuckStore(StoreInterface): # pragma: no cover + + def __init__(self, muck_url): + self._url = muck_url + ick2.log.log('info', msg_text='MuckStore created', muck_url=muck_url) + + def _request(self, func, path, token, headers=None, body=None): + url = '{}{}'.format(self._url, path) + if headers is None: + headers = {} + headers['Authorization'] = 'Bearer {}'.format(token) + r = func(url, headers=headers, data=body) + ick2.log.log( + 'trace', msg_text='Accessing Muck', + func=repr(func), url=url, path=path, headers=headers, data=body, + status=r.status_code, text=r.text) + if not r.ok: + raise ick2.StoreError(r.text) + return r + + def search(self, token, cond): + headers = { + 'Content-Type': 'application/json', + } + cond = { + 'cond': [ + { + 'where': 'meta', + 'field': 'id', + 'op': '>=', + 'pattern': '', + } + ], + } + body = json.dumps(cond) + r = self._request( + requests.get, '/search', token, headers=headers, body=body) + obj = r.json() + return obj['resources'] + + def create(self, token, obj): + headers = { + 'Content-Type': 'application/json', + } + body = json.dumps(obj) + r = self._request( + requests.post, '/res', token, headers=headers, body=body) + rid = r.headers['Muck-Id'] + rev = r.headers['Muck-Revision'] + return rid, rev + + def show(self, token, rid): + headers = { + 'Muck-Id': rid, + } + r = self._request(requests.get, '/res', token, headers=headers) + rev = r.headers['Muck-Revision'] + as_dict = r.json() + return as_dict, rev + + def update(self, token, rid, obj, revision): + headers = { + 'Content-Type': 'application/json', + 'Muck-Id': rid, + 'Muck-Revision': revision, + } + body = json.dumps(obj) + r = self._request( + requests.put, '/res', token, headers=headers, body=body) + rev = r.headers['Muck-Revision'] + return rev + + def delete(self, token, rid): + headers = { + 'Muck-Id': rid, + } + self._request(requests.delete, '/res', token, headers=headers) |