Skip to content

Commit 69c5caa

Browse files
committed
ENH: implementation for 'restore_node' and 'restore_items' API
1 parent 553ea74 commit 69c5caa

File tree

4 files changed

+69
-17
lines changed

4 files changed

+69
-17
lines changed

src/save_and_restore_api/_api_async.py

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ async def send_request(
4040

4141
return response
4242

43+
# =============================================================================================
44+
# AUTHENTICATION-CONTROLLER API METHODS
45+
# =============================================================================================
46+
4347
async def login(self, *, username=None, password=None):
4448
method, url, params = self._prepare_login(username=username, password=password)
4549
return await self.send_request(method, url, params=params)
@@ -153,36 +157,36 @@ async def snapshot_get(self, uniqueId):
153157
return await self.send_request(method, url)
154158

155159
async def snapshot_add(self, parentNodeId, *, snapshotNode, snapshotData, auth=None):
156-
"""
157-
Upload data for the new snapshot and save it to the database. The new node is created
158-
under the existing configuration node specified by ``parentNodeId``.
159-
160-
API: PUT /snapshot?parentNodeId={parentNodeId}
161-
"""
160+
# Reusing docstrings from the threaded version
162161
method, url, params = self._prepare_snapshot_add(
163162
parentNodeId=parentNodeId, snapshotNode=snapshotNode, snapshotData=snapshotData
164163
)
165164
return await self.send_request(method, url, params=params, auth=auth)
166165

167166
async def snapshot_update(self, *, snapshotNode, snapshotData, auth=None):
168-
"""
169-
Upload and update data for an existing snapshot. Both ``snapshotNode`` and ``snapshotData``
170-
must have valid ``uniqueId`` fields pointing to an existing node.
171-
172-
API: POST /snapshot
173-
"""
167+
# Reusing docstrings from the threaded version
174168
method, url, params = self._prepare_snapshot_update(snapshotNode=snapshotNode, snapshotData=snapshotData)
175169
return await self.send_request(method, url, params=params, auth=auth)
176170

177171
async def snapshots_get(self):
178-
"""
179-
Returns a list of all existing snapshots (list of ``snapshotNode`` objects).
180-
181-
API: GET /snapshots
182-
"""
172+
# Reusing docstrings from the threaded version
183173
method, url = self._prepare_snapshots_get()
184174
return await self.send_request(method, url)
185175

176+
# =============================================================================================
177+
# SNAPSHOT-RESTORE-CONTROLLER API METHODS
178+
# =============================================================================================
179+
180+
async def restore_node(self, nodeId, *, auth=None):
181+
# Reusing docstrings from the threaded version
182+
method, url, url_params = self._prepare_restore_node(nodeId=nodeId)
183+
return await self.send_request(method, url, url_params=url_params, auth=auth)
184+
185+
async def restore_items(self, *, snapshotItems, auth=None):
186+
# Reusing docstrings from the threaded version
187+
method, url, params = self._prepare_restore_items(snapshotItems=snapshotItems)
188+
return await self.send_request(method, url, params=params, auth=auth)
189+
186190

187191
SaveRestoreAPI.node_get.__doc__ = _SaveRestoreAPI_Threads.node_get.__doc__
188192
SaveRestoreAPI.nodes_get.__doc__ = _SaveRestoreAPI_Threads.nodes_get.__doc__
@@ -203,3 +207,5 @@ async def snapshots_get(self):
203207
SaveRestoreAPI.snapshot_add.__doc__ = _SaveRestoreAPI_Threads.snapshot_add.__doc__
204208
SaveRestoreAPI.snapshot_update.__doc__ = _SaveRestoreAPI_Threads.snapshot_update.__doc__
205209
SaveRestoreAPI.snapshots_get.__doc__ = _SaveRestoreAPI_Threads.snapshots_get.__doc__
210+
SaveRestoreAPI.restore_node.__doc__ = _SaveRestoreAPI_Threads.restore_node.__doc__
211+
SaveRestoreAPI.restore_items.__doc__ = _SaveRestoreAPI_Threads.restore_items.__doc__

src/save_and_restore_api/_api_base.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,20 @@ def _prepare_snapshots_get(self):
275275
method, url = "GET", "/snapshots"
276276
return method, url
277277

278+
# =============================================================================================
279+
# SNAPSHOT-RESTORE-CONTROLLER API METHODS
280+
# =============================================================================================
281+
282+
def _prepare_restore_node(self, *, nodeId):
283+
method, url = "POST", "/restore/node"
284+
url_params = {"nodeId": nodeId}
285+
return method, url, url_params
286+
287+
def _prepare_restore_items(self, *, snapshotItems):
288+
method, url = "POST", "/restore/items"
289+
params = snapshotItems
290+
return method, url, params
291+
278292
# =============================================================================================
279293

280294
# def create_config(self, parent_node_uid, name, pv_list):

src/save_and_restore_api/_api_threads.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ def send_request(
3939

4040
return response
4141

42+
# =============================================================================================
43+
# AUTHENTICATION-CONTROLLER API METHODS
44+
# =============================================================================================
45+
4246
def login(self, *, username=None, password=None):
4347
method, url, params = self._prepare_login(username=username, password=password)
4448
return self.send_request(method, url, params=params)
@@ -269,3 +273,26 @@ def snapshots_get(self):
269273
"""
270274
method, url = self._prepare_snapshots_get()
271275
return self.send_request(method, url)
276+
277+
# =============================================================================================
278+
# SNAPSHOT-RESTORE-CONTROLLER API METHODS
279+
# =============================================================================================
280+
281+
def restore_node(self, nodeId, *, auth=None):
282+
"""
283+
Restore PVs based on the data from an existing snapshot node specified by nodeId.
284+
285+
API: POST /restore/node
286+
"""
287+
method, url, url_params = self._prepare_restore_node(nodeId=nodeId)
288+
return self.send_request(method, url, url_params=url_params, auth=auth)
289+
290+
def restore_items(self, *, snapshotItems, auth=None):
291+
"""
292+
Restore PVs based on the list of snapshot items passed with the request. The list
293+
format matches the format of ``snapshotData["snapshotItems"]``
294+
295+
API: POST /restore/items
296+
"""
297+
method, url, params = self._prepare_restore_items(snapshotItems=snapshotItems)
298+
return self.send_request(method, url, params=params, auth=auth)

tests/test_misc.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ def test_version_01():
6565
# asyncio.run(testing())
6666

6767

68+
# =============================================================================================
69+
# TESTS FOR AUTHENTICATION-CONTROLLER API METHODS
70+
# =============================================================================================
71+
72+
6873
# fmt: off
6974
@pytest.mark.parametrize("library", ["THREADS", "ASYNC"])
7075
@pytest.mark.parametrize("username, password, roles, code", [

0 commit comments

Comments
 (0)