2022-04-07 18:48:03 +00:00
|
|
|
#!/usr/bin/python3
|
|
|
|
|
|
|
|
"""
|
2022-08-26 14:35:59 +00:00
|
|
|
This module contains functions which are used for Large Object assembling:
|
2022-04-07 18:48:03 +00:00
|
|
|
getting Last Object and split and getting Link Object. It is not enough to
|
|
|
|
simply perform a "raw" HEAD request, as noted in the issue:
|
|
|
|
https://github.com/nspcc-dev/neofs-node/issues/1304. Therefore, the reliable
|
2022-08-26 14:35:59 +00:00
|
|
|
retrieval of the aforementioned objects must be done this way: send direct
|
2022-04-07 18:48:03 +00:00
|
|
|
"raw" HEAD request to the every Storage Node and return the desired OID on
|
|
|
|
first non-null response.
|
|
|
|
"""
|
|
|
|
|
2022-09-20 15:03:52 +00:00
|
|
|
import logging
|
2022-04-07 18:48:03 +00:00
|
|
|
|
2022-09-20 15:03:52 +00:00
|
|
|
import allure
|
2022-06-09 13:08:11 +00:00
|
|
|
import neofs_verbs
|
2022-09-20 15:03:52 +00:00
|
|
|
from common import NEOFS_NETMAP, WALLET_CONFIG
|
2022-06-09 13:08:11 +00:00
|
|
|
|
2022-09-20 15:03:52 +00:00
|
|
|
logger = logging.getLogger("NeoLogger")
|
2022-04-07 18:48:03 +00:00
|
|
|
|
|
|
|
|
2022-09-20 15:03:52 +00:00
|
|
|
@allure.step("Get Link Object")
|
|
|
|
def get_link_object(
|
|
|
|
wallet: str, cid: str, oid: str, bearer_token: str = "", wallet_config: str = WALLET_CONFIG
|
|
|
|
):
|
2022-04-07 18:48:03 +00:00
|
|
|
"""
|
2022-09-20 15:03:52 +00:00
|
|
|
Args:
|
|
|
|
wallet (str): path to the wallet on whose behalf the Storage Nodes
|
|
|
|
are requested
|
|
|
|
cid (str): Container ID which stores the Large Object
|
|
|
|
oid (str): Large Object ID
|
|
|
|
bearer_token (optional, str): path to Bearer token file
|
|
|
|
wallet_config (optional, str): path to the neofs-cli config file
|
|
|
|
Returns:
|
|
|
|
(str): Link Object ID
|
|
|
|
When no Link Object ID is found after all Storage Nodes polling,
|
2022-09-23 11:09:41 +00:00
|
|
|
the function throws an error.
|
2022-04-07 18:48:03 +00:00
|
|
|
"""
|
|
|
|
for node in NEOFS_NETMAP:
|
|
|
|
try:
|
2022-09-20 15:03:52 +00:00
|
|
|
resp = neofs_verbs.head_object(
|
|
|
|
wallet,
|
|
|
|
cid,
|
|
|
|
oid,
|
|
|
|
endpoint=node,
|
|
|
|
is_raw=True,
|
|
|
|
is_direct=True,
|
|
|
|
bearer_token=bearer_token,
|
|
|
|
wallet_config=wallet_config,
|
|
|
|
)
|
|
|
|
if resp["link"]:
|
|
|
|
return resp["link"]
|
2022-04-07 18:48:03 +00:00
|
|
|
except Exception:
|
|
|
|
logger.info(f"No Link Object found on {node}; continue")
|
2022-09-20 15:03:52 +00:00
|
|
|
logger.error(f"No Link Object for {cid}/{oid} found among all Storage Nodes")
|
2022-04-07 18:48:03 +00:00
|
|
|
return None
|
|
|
|
|
|
|
|
|
2022-09-20 15:03:52 +00:00
|
|
|
@allure.step("Get Last Object")
|
2022-04-07 18:48:03 +00:00
|
|
|
def get_last_object(wallet: str, cid: str, oid: str):
|
|
|
|
"""
|
2022-09-20 15:03:52 +00:00
|
|
|
Args:
|
|
|
|
wallet (str): path to the wallet on whose behalf the Storage Nodes
|
|
|
|
are requested
|
|
|
|
cid (str): Container ID which stores the Large Object
|
|
|
|
oid (str): Large Object ID
|
|
|
|
Returns:
|
|
|
|
(str): Last Object ID
|
|
|
|
When no Last Object ID is found after all Storage Nodes polling,
|
2022-09-23 11:09:41 +00:00
|
|
|
the function throws an error.
|
2022-04-07 18:48:03 +00:00
|
|
|
"""
|
|
|
|
for node in NEOFS_NETMAP:
|
|
|
|
try:
|
2022-09-20 15:03:52 +00:00
|
|
|
resp = neofs_verbs.head_object(
|
|
|
|
wallet, cid, oid, endpoint=node, is_raw=True, is_direct=True
|
|
|
|
)
|
|
|
|
if resp["lastPart"]:
|
|
|
|
return resp["lastPart"]
|
2022-04-07 18:48:03 +00:00
|
|
|
except Exception:
|
|
|
|
logger.info(f"No Last Object found on {node}; continue")
|
2022-09-20 15:03:52 +00:00
|
|
|
logger.error(f"No Last Object for {cid}/{oid} found among all Storage Nodes")
|
2022-04-07 18:48:03 +00:00
|
|
|
return None
|