forked from AllenInstitute/render-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstack.py
More file actions
279 lines (240 loc) · 10.6 KB
/
stack.py
File metadata and controls
279 lines (240 loc) · 10.6 KB
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#!/usr/bin/env python
import logging
from time import strftime
import requests
from .errors import RenderError
from .utils import jbool, NullHandler
from .render import (format_baseurl, format_preamble,
renderaccess, post_json)
logger = logging.getLogger(__name__)
logger.addHandler(NullHandler())
class StackVersion:
def __init__(self, cycleNumber=None, cycleStepNumber=None,
stackResolutionX=None, stackResolutionY=None,
stackResolutionZ=None,
materializedBoxRootPath=None, mipmapPathBuilder=None,
versionNotes=None,
createTimestamp=None, **kwargs):
self.cycleNumber = cycleNumber
self.cycleStepNumber = cycleStepNumber
self.stackResolutionX = stackResolutionX
self.stackResolutionY = stackResolutionY
self.stackResolutionZ = stackResolutionZ
self.mipmapPathBuilder = mipmapPathBuilder
self.materializedBoxRootPath = materializedBoxRootPath
self.createTimestamp = (strftime('%Y-%M-%dT%H:%M:%S.00Z') if
createTimestamp is None else createTimestamp)
self.versionNotes = versionNotes
def to_dict(self):
d = {}
d.update(({'cycleNumber': self.cycleNumber}
if self.cycleNumber is not None else {}))
d.update(({'cycleStepNumber': self.cycleStepNumber}
if self.cycleStepNumber is not None else {}))
d.update(({'stackResolutionX': self.stackResolutionX}
if self.stackResolutionX is not None else {}))
d.update(({'stackResolutionY': self.stackResolutionY}
if self.stackResolutionY is not None else {}))
d.update(({'stackResolutionZ': self.stackResolutionZ}
if self.stackResolutionZ is not None else {}))
d.update(({'createTimestamp': self.createTimestamp}
if self.createTimestamp is not None else {}))
d.update(({'mipmapPathBuilder': self.mipmapPathBuilder}
if self.mipmapPathBuilder is not None else {}))
d.update(({'versionNotes': self.versionNotes}
if self.versionNotes is not None else {}))
d.update(({'materializedBoxRootPath': self.materializedBoxRootPath}
if self.materializedBoxRootPath is not None else {}))
return d
def from_dict(self, d):
self.__dict__.update({k: v for k, v in d.items()})
@renderaccess
def set_stack_metadata(stack, sv, host=None, port=None, owner=None,
project=None, session=requests.session(),
render=None, **kwargs):
request_url = format_preamble(host, port, owner, project, stack)
logger.debug(request_url)
return post_json(session, request_url, sv.to_dict())
@renderaccess
def get_stack_metadata(stack, host=None, port=None, owner=None, project=None,
session=requests.session(), render=None, **kwargs):
request_url = format_preamble(host, port, owner, project, stack)
logger.debug(request_url)
r = session.get(request_url)
try:
sv = StackVersion()
sv.from_dict(r.json()['currentVersion'])
return sv
except Exception as e:
logger.error(e)
logger.error(r.text)
raise RenderError(r.text)
@renderaccess
def set_stack_state(stack, state='LOADING', host=None, port=None,
owner=None, project=None,
session=requests.session(), render=None, **kwargs):
'''
set state of selected stack. Acceptable states are listed below:
LOADING: stack is accepting additional information.
COMPLETE: stack is finished loading.
OFFLINE: stack is not in use.
READ_ONLY: stack cannot be changed.
TODO there is a limited direction in which these stack changes can go
'''
if state not in ['LOADING', 'COMPLETE', 'OFFLINE', 'READ_ONLY']:
raise RenderError('state {} not in known states {}'.format(
state, ['LOADING', 'COMPLETE', 'OFFLINE', 'READ_ONLY']))
request_url = format_preamble(
host, port, owner, project, stack) + "/state/%s" % state
logger.debug(request_url)
r = session.put(request_url, data=None,
headers={"content-type": "application/json"})
if (r.status_code != 201):
logger.error(r.text)
raise RenderError(r.text)
return r
@renderaccess
def likelyUniqueId(host=None, port=None,
session=requests.session(), render=None, **kwargs):
'''return hex-code nearly-unique id from render server'''
request_url = '{}/likelyUniqueId'.format(format_baseurl(host, port))
r = session.get(request_url, data=None,
headers={"content-type": "text/plain"})
return r.text
def make_stack_params(host, port, owner, project, stack):
'''utility function to turn host,port,owner,project,stack combinations
to java CLI based argument list for subprocess calling
returns [--baseDataUrl,self.format_baseurl(host,port),--owner
'''
baseurl = format_baseurl(host, port)
project_params = ['--baseDataUrl', baseurl,
'--owner', owner, '--project', project]
stack_params = project_params + ['--stack', stack]
return stack_params
@renderaccess
def delete_stack(stack, host=None, port=None, owner=None,
project=None, session=requests.session(),
render=None, **kwargs):
request_url = format_preamble(host, port, owner, project, stack)
r = session.delete(request_url)
logger.debug(r.text)
return r
@renderaccess
def create_stack(stack, cycleNumber=None, cycleStepNumber=None,
stackResolutionX=None, stackResolutionY=None,
stackResolutionZ=None, force_resolution=True,
host=None, port=None, owner=None, project=None,
session=requests.session(), render=None, **kwargs):
if force_resolution:
stackResolutionX, stackResolutionY, stackResolutionZ = [
(1.0 if res is None else res)
for res in [stackResolutionX, stackResolutionY, stackResolutionZ]]
logger.debug('forcing resolution x:{}, y:{}, z:{}'.format(
stackResolutionX, stackResolutionY, stackResolutionZ))
sv = StackVersion(
cycleNumber=cycleNumber, cycleStepNumber=cycleStepNumber,
stackResolutionX=stackResolutionX, stackResolutionY=stackResolutionY,
stackResolutionZ=stackResolutionZ)
request_url = format_preamble(host, port, owner, project, stack)
logger.debug("stack version {} {}".format(request_url, sv.to_dict()))
r = post_json(session, request_url, sv.to_dict())
try:
return r
except Exception as e:
logger.error(e)
logger.error(r.text)
# FIXME multiple z indices require multiple params?
@renderaccess
def clone_stack(inputstack, outputstack, host=None, port=None,
owner=None, project=None, skipTransforms=False, toProject=None,
z=None, session=None, render=None, **kwargs):
'''
result:
cloned stack in LOADING state with tiles in layers specified by z'
'''
if z is not None:
zs = [float(i) for i in z] # TODO test me
session = requests.session() if session is None else session
sv = StackVersion(**kwargs)
request_url = '{}/{}'.format(format_preamble(
host, port, owner, project, inputstack), outputstack)
logger.debug(request_url)
r = post_json(session, request_url, sv.to_dict(), params={
'z': zs, 'toProject': toProject,
'skipTransforms': jbool(skipTransforms)})
return r
@renderaccess
def get_z_values_for_stack(stack, project=None, host=None, port=None,
owner=None, session=requests.session(),
render=None, **kwargs):
request_url = format_preamble(
host, port, owner, project, stack) + "/zValues/"
logger.debug(request_url)
r = session.get(request_url)
try:
return r.json()
except Exception as e:
logger.error(e)
logger.error(r.text)
raise RenderError(r.text)
def get_z_value_for_section(stack, sectionId, **kwargs):
return get_section_z_value(stack, sectionId, **kwargs)
@renderaccess
def put_resolved_tilespecs(stack, json_dict, host=None, port=None,
owner=None, project=None,
session=requests.session(), render=None, **kwargs):
request_url = format_preamble(
host, port, owner, project, stack) + "/resolvedTiles"
r = post_json(session, request_url, json_dict)
return r
@renderaccess
def get_bounds_from_z(stack, z, host=None, port=None, owner=None,
project=None, session=requests.session(),
render=None, **kwargs):
request_url = format_preamble(
host, port, owner, project, stack) + '/z/%f/bounds' % (z)
r = session.get(request_url)
try:
return r.json()
except Exception as e:
logger.error(e)
logger.error(r.text)
raise RenderError(r.text)
@renderaccess
def get_stack_bounds(stack, host=None, port=None, owner=None, project=None,
session=requests.session(), render=None, **kwargs):
request_url = format_preamble(
host, port, owner, project, stack) + '/bounds'
r = session.get(request_url)
try:
return r.json()
except Exception as e:
logger.error(e)
logger.error(r.text)
raise RenderError(r.text)
@renderaccess
def get_stack_sectionData(stack, host=None, port=None, owner=None,
project=None, session=requests.session(),
render=None, **kwargs):
request_url = format_preamble(
host, port, owner, project, stack) + '/sectionData'
r = session.get(request_url)
try:
return r.json()
except Exception as e:
logger.error(e)
logger.error(r.text)
raise RenderError(r.text)
@renderaccess
def get_section_z_value(stack, sectionId, host=None, port=None,
owner=None, project=None, session=requests.session(),
render=None, **kwargs):
request_url = format_preamble(
host, port, owner, project, stack) + "/section/%s/z" % sectionId
r = session.get(request_url)
try:
return float(r.json())
except Exception as e:
logger.error(e)
logger.error(r.text)
raise RenderError(r.text)