summaryrefslogtreecommitdiff
path: root/ick2/store.py
diff options
context:
space:
mode:
Diffstat (limited to 'ick2/store.py')
-rw-r--r--ick2/store.py83
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)