-
Notifications
You must be signed in to change notification settings - Fork 0
/
pantry_service.py
164 lines (133 loc) · 4.96 KB
/
pantry_service.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import argparse
import os
from wsgiref.simple_server import make_server
from wsgiservice import *
tier_memmory_mapping = {}
class KeyValueStore(object):
"""Simplistic key-value store that uses main memory as the storage
backend."""
def __init__(self):
self._store = {}
def unset(self, key):
"""Store the provided `value` for the provided `key`."""
del self._store[key]
def set(self, key, value):
"""Store the provided `value` for the provided `key`."""
self._store[key] = value
def get(self, key):
"""Return the stored value for the provided `key` or `None` if no
such key is present."""
ret = self._store.get(key)
return ret
def __str__(self):
return 'MemmoryStore'
class KeyFileStore(object):
"""Simplistic key-value store that uses a disk in the system as the storage
backend."""
def __init__(self, root_dir):
self._store = {}
self.root_dir = root_dir
def set(self, key, value):
"""Store the provided `value` for the provided `key`."""
with open(os.path.join(self.root_dir, key), 'w') as store:
store.write(value)
def get(self, key):
"""Return the stored value for the provided `key` or `None` if no
such key is present."""
with open(os.path.join(self.root_dir, key), 'r') as store:
ret = store.read()
return ret
def unset(self, key):
"""Return the stored value for the provided `key` or `None` if no
such key is present."""
os.remove(os.path.join(self.root_dir, key))
def __str__(self):
return 'DiskStore pointing at -> %s' % self.root_dir
@mount('/store_mapping')
class StorageMappingView(Resource):
"""Api call that inform about the current tier mapping storage of the node."""
def GET(self):
out = ''
for k, v in tier_memmory_mapping.items():
out += "level:%s -> %s\n" % (k, v)
return out
@mount('/store_config/{level}/{route}')
class StorageConfig(Resource):
"""Api calls used to set up the tier mapping storage of the node.
Diferente storage devices can be mapped to diferent logical address."""
def PUT(self, level, route):
"""Insert a new route/device into the node mapping"""
global tier_memmory_mapping
if not level in tier_memmory_mapping:
if level == '0':
store_method = KeyValueStore()
else:
store_method = KeyFileStore(route)
tier_memmory_mapping[level] = store_method
msg = "new route %s , level %s added to storgare mapping" % (level, route)
raise_201(self, msg)
else:
msg = "route already exists in the mapping"
raise_500(self, msg)
def DELETE(self, level):
"""Remove device from the node mapping"""
global tier_memmory_mapping
if level in tier_memmory_mapping:
del tier_memmory_mapping[level]
return 'route %s deleted'
else:
raise_500(self, 'no route found')
@mount('/store/{key}/{level}')
class StorageService(Resource):
"""Document storage api, it is an interface for storing docuements send by
the counter service.
"""
def GET(self, key, level):
"""
Retrieves the document content indetify by `key` stored in device `level`
"""
try:
return tier_memmory_mapping[level].get(key)
except Exception as ex:
raise_500(self, 'No document found')
def DELETE(self, key, level):
"""
Removes the document indetify by `key` stored in device `level`
"""
try:
tier_memmory_mapping[level].unset(key)
return 'document %s deleted' % key
except Exception as ex:
print ex
raise_500(self, 'No document found')
def PUT(self, key, level):
"""
Saves in device `level` the document contnet indetify by `key`
"""
try:
value = self.request.body
msg = tier_memmory_mapping[level].set(key, value)
raise_201(self, msg)
except Exception as ex:
print ex
raise_500(self, 'Document not saved')
def main():
parser = argparse.ArgumentParser(description='Storage service - Pantry')
parser.add_argument("--verbose",
help="increase output verbosity",
action="store_true"
)
parser.add_argument("--port",
help="connection port",
type=int
)
parser.add_argument("--host",
default='',
help="host ip of the arithmetic server",
)
args = parser.parse_args()
app = get_app(globals())
print "Running on port 8001"
make_server(args.host, args.port, app).serve_forever()
if __name__ == '__main__':
main()