Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
singlestore-labs
GitHub Repository: singlestore-labs/singlestoredb-python
Path: blob/main/singlestoredb/fusion/handlers/utils.py
469 views
1
#!/usr/bin/env python
2
import datetime
3
import os
4
from typing import Any
5
from typing import Dict
6
from typing import Optional
7
from typing import Union
8
9
from ...exceptions import ManagementError
10
from ...management import files as mgmt_files
11
from ...management import manage_workspaces
12
from ...management.files import FilesManager
13
from ...management.files import FileSpace
14
from ...management.files import manage_files
15
from ...management.workspace import StarterWorkspace
16
from ...management.workspace import Workspace
17
from ...management.workspace import WorkspaceGroup
18
from ...management.workspace import WorkspaceManager
19
20
21
def get_workspace_manager() -> WorkspaceManager:
22
"""Return a new workspace manager."""
23
return manage_workspaces()
24
25
26
def get_files_manager() -> FilesManager:
27
"""Return a new files manager."""
28
return manage_files()
29
30
31
def dt_isoformat(dt: Optional[datetime.datetime]) -> Optional[str]:
32
"""Convert datetime to string."""
33
if dt is None:
34
return None
35
return dt.isoformat()
36
37
38
def get_workspace_group(params: Dict[str, Any]) -> WorkspaceGroup:
39
"""
40
Find a workspace group matching group_id or group_name.
41
42
This function will get a workspace group or ID from the
43
following parameters:
44
45
* params['group_name']
46
* params['group_id']
47
* params['group']['group_name']
48
* params['group']['group_id']
49
* params['in_group']['group_name']
50
* params['in_group']['group_id']
51
52
Or, from the SINGLESTOREDB_WORKSPACE_GROUP environment variable.
53
54
"""
55
manager = get_workspace_manager()
56
57
group_name = params.get('group_name') or \
58
(params.get('in_group') or {}).get('group_name') or \
59
(params.get('group') or {}).get('group_name')
60
if group_name:
61
workspace_groups = [
62
x for x in manager.workspace_groups
63
if x.name == group_name
64
]
65
66
if not workspace_groups:
67
raise KeyError(
68
f'no workspace group found with name: {group_name}',
69
)
70
71
if len(workspace_groups) > 1:
72
ids = ', '.join(x.id for x in workspace_groups)
73
raise ValueError(
74
f'more than one workspace group with given name was found: {ids}',
75
)
76
77
return workspace_groups[0]
78
79
group_id = params.get('group_id') or \
80
(params.get('in_group') or {}).get('group_id') or \
81
(params.get('group') or {}).get('group_id')
82
if group_id:
83
try:
84
return manager.get_workspace_group(group_id)
85
except ManagementError as exc:
86
if exc.errno == 404:
87
raise KeyError(f'no workspace group found with ID: {group_id}')
88
raise
89
90
if os.environ.get('SINGLESTOREDB_WORKSPACE_GROUP'):
91
try:
92
return manager.get_workspace_group(
93
os.environ['SINGLESTOREDB_WORKSPACE_GROUP'],
94
)
95
except ManagementError as exc:
96
if exc.errno == 404:
97
raise KeyError(
98
'no workspace found with ID: '
99
f'{os.environ["SINGLESTOREDB_WORKSPACE_GROUP"]}',
100
)
101
raise
102
103
if os.environ.get('SINGLESTOREDB_CLUSTER'):
104
raise ValueError('clusters and shared workspaces are not currently supported')
105
106
raise KeyError('no workspace group was specified')
107
108
109
def get_workspace(params: Dict[str, Any]) -> Workspace:
110
"""
111
Retrieve the specified workspace.
112
113
This function will get a workspace group or ID from the
114
following parameters:
115
116
* params['workspace_name']
117
* params['workspace_id']
118
* params['workspace']['workspace_name']
119
* params['workspace']['workspace_id']
120
121
Or, from the SINGLESTOREDB_WORKSPACE environment variable.
122
123
"""
124
manager = get_workspace_manager()
125
workspace_name = params.get('workspace_name') or \
126
(params.get('workspace') or {}).get('workspace_name')
127
if workspace_name:
128
wg = get_workspace_group(params)
129
workspaces = [
130
x for x in wg.workspaces
131
if x.name == workspace_name
132
]
133
134
if not workspaces:
135
raise KeyError(
136
f'no workspace found with name: {workspace_name}',
137
)
138
139
if len(workspaces) > 1:
140
ids = ', '.join(x.id for x in workspaces)
141
raise ValueError(
142
f'more than one workspace with given name was found: {ids}',
143
)
144
145
return workspaces[0]
146
147
workspace_id = params.get('workspace_id') or \
148
(params.get('workspace') or {}).get('workspace_id')
149
if workspace_id:
150
try:
151
return manager.get_workspace(workspace_id)
152
except ManagementError as exc:
153
if exc.errno == 404:
154
raise KeyError(f'no workspace found with ID: {workspace_id}')
155
raise
156
157
if os.environ.get('SINGLESTOREDB_WORKSPACE'):
158
try:
159
return manager.get_workspace(
160
os.environ['SINGLESTOREDB_WORKSPACE'],
161
)
162
except ManagementError as exc:
163
if exc.errno == 404:
164
raise KeyError(
165
'no workspace found with ID: '
166
f'{os.environ["SINGLESTOREDB_WORKSPACE"]}',
167
)
168
raise
169
170
if os.environ.get('SINGLESTOREDB_CLUSTER'):
171
raise ValueError('clusters and shared workspaces are not currently supported')
172
173
raise KeyError('no workspace was specified')
174
175
176
def get_deployment(
177
params: Dict[str, Any],
178
) -> Union[WorkspaceGroup, StarterWorkspace]:
179
"""
180
Find a starter workspace matching deployment_id or deployment_name.
181
182
This function will get a starter workspace or ID from the
183
following parameters:
184
185
* params['deployment_name']
186
* params['deployment_id']
187
* params['group']['deployment_name']
188
* params['group']['deployment_id']
189
* params['in_deployment']['deployment_name']
190
* params['in_deployment']['deployment_id']
191
* params['in']['in_group']['deployment_name']
192
* params['in']['in_group']['deployment_id']
193
* params['in']['in_deployment']['deployment_name']
194
* params['in']['in_deployment']['deployment_id']
195
196
Or, from the SINGLESTOREDB_WORKSPACE_GROUP
197
or SINGLESTOREDB_CLUSTER environment variables.
198
199
"""
200
manager = get_workspace_manager()
201
202
#
203
# Search for deployment by name
204
#
205
deployment_name = params.get('deployment_name') or \
206
(params.get('in_deployment') or {}).get('deployment_name') or \
207
(params.get('group') or {}).get('deployment_name') or \
208
((params.get('in') or {}).get('in_group') or {}).get('deployment_name') or \
209
((params.get('in') or {}).get('in_deployment') or {}).get('deployment_name')
210
211
if deployment_name:
212
# Standard workspace group
213
workspace_groups = [
214
x for x in manager.workspace_groups
215
if x.name == deployment_name
216
]
217
218
if len(workspace_groups) == 1:
219
return workspace_groups[0]
220
221
elif len(workspace_groups) > 1:
222
ids = ', '.join(x.id for x in workspace_groups)
223
raise ValueError(
224
f'more than one workspace group with given name was found: {ids}',
225
)
226
227
# Starter workspace
228
starter_workspaces = [
229
x for x in manager.starter_workspaces
230
if x.name == deployment_name
231
]
232
233
if len(starter_workspaces) == 1:
234
return starter_workspaces[0]
235
236
elif len(starter_workspaces) > 1:
237
ids = ', '.join(x.id for x in starter_workspaces)
238
raise ValueError(
239
f'more than one starter workspace with given name was found: {ids}',
240
)
241
242
raise KeyError(f'no deployment found with name: {deployment_name}')
243
244
#
245
# Search for deployment by ID
246
#
247
deployment_id = params.get('deployment_id') or \
248
(params.get('in_deployment') or {}).get('deployment_id') or \
249
(params.get('group') or {}).get('deployment_id') or \
250
((params.get('in') or {}).get('in_group') or {}).get('deployment_id') or \
251
((params.get('in') or {}).get('in_deployment') or {}).get('deployment_id')
252
253
if deployment_id:
254
try:
255
# Standard workspace group
256
return manager.get_workspace_group(deployment_id)
257
except ManagementError as exc:
258
if exc.errno == 404:
259
try:
260
# Starter workspace
261
return manager.get_starter_workspace(deployment_id)
262
except ManagementError as exc:
263
if exc.errno == 404:
264
raise KeyError(f'no deployment found with ID: {deployment_id}')
265
raise
266
else:
267
raise
268
269
# Use workspace group from environment
270
if os.environ.get('SINGLESTOREDB_WORKSPACE_GROUP'):
271
try:
272
return manager.get_workspace_group(
273
os.environ['SINGLESTOREDB_WORKSPACE_GROUP'],
274
)
275
except ManagementError as exc:
276
if exc.errno == 404:
277
raise KeyError(
278
'no workspace found with ID: '
279
f'{os.environ["SINGLESTOREDB_WORKSPACE_GROUP"]}',
280
)
281
raise
282
283
# Use cluster from environment
284
if os.environ.get('SINGLESTOREDB_CLUSTER'):
285
try:
286
return manager.get_starter_workspace(
287
os.environ['SINGLESTOREDB_CLUSTER'],
288
)
289
except ManagementError as exc:
290
if exc.errno == 404:
291
raise KeyError(
292
'no starter workspace found with ID: '
293
f'{os.environ["SINGLESTOREDB_CLUSTER"]}',
294
)
295
raise
296
297
raise KeyError('no deployment was specified')
298
299
300
def get_file_space(params: Dict[str, Any]) -> FileSpace:
301
"""
302
Retrieve the specified file space.
303
304
This function will get a file space from the
305
following parameters:
306
307
* params['file_location']
308
"""
309
manager = get_files_manager()
310
311
file_location = params.get('file_location')
312
if file_location:
313
file_location_lower_case = file_location.lower()
314
315
if file_location_lower_case == mgmt_files.PERSONAL_SPACE:
316
return manager.personal_space
317
elif file_location_lower_case == mgmt_files.SHARED_SPACE:
318
return manager.shared_space
319
elif file_location_lower_case == mgmt_files.MODELS_SPACE:
320
return manager.models_space
321
else:
322
raise ValueError(f'invalid file location: {file_location}')
323
324
raise KeyError('no file space was specified')
325
326