2025-01-17 14:23:52 +08:00
|
|
|
import allure
|
2025-02-10 15:08:29 +08:00
|
|
|
from tenacity import retry, stop_after_delay, wait_fixed
|
2025-01-17 14:23:52 +08:00
|
|
|
|
2025-01-21 16:57:23 +08:00
|
|
|
from src.env_vars import NOMOS_EXECUTOR
|
2025-03-05 03:37:11 +00:00
|
|
|
from src.libs.common import add_padding
|
2025-02-28 03:52:02 +00:00
|
|
|
from src.libs.custom_logger import get_custom_logger
|
2025-01-17 14:23:52 +08:00
|
|
|
from src.steps.common import StepsCommon
|
|
|
|
|
|
2025-02-28 03:52:02 +00:00
|
|
|
logger = get_custom_logger(__name__)
|
|
|
|
|
|
2025-01-17 14:23:52 +08:00
|
|
|
|
2025-02-28 03:52:02 +00:00
|
|
|
def prepare_dispersal_request(data, app_id, index, utf8=True, padding=True):
|
|
|
|
|
if utf8:
|
|
|
|
|
data_bytes = data.encode("utf-8")
|
|
|
|
|
else:
|
|
|
|
|
data_bytes = bytes(data)
|
|
|
|
|
|
|
|
|
|
data_list = list(data_bytes)
|
|
|
|
|
if padding:
|
|
|
|
|
data_list = add_padding(data_list)
|
|
|
|
|
|
|
|
|
|
dispersal_data = {"data": data_list, "metadata": {"app_id": app_id, "index": index}}
|
2025-01-17 14:23:52 +08:00
|
|
|
return dispersal_data
|
|
|
|
|
|
|
|
|
|
|
2025-01-17 19:27:43 +08:00
|
|
|
def prepare_get_range_request(app_id, start_index, end_index):
|
|
|
|
|
query_data = {"app_id": app_id, "range": {"start": start_index, "end": end_index}}
|
|
|
|
|
return query_data
|
|
|
|
|
|
|
|
|
|
|
2025-02-12 10:38:15 +08:00
|
|
|
def response_contains_data(response):
|
2025-03-13 10:18:02 +00:00
|
|
|
if response is None:
|
|
|
|
|
return False
|
|
|
|
|
|
2025-02-12 10:38:15 +08:00
|
|
|
for index, blobs in response:
|
|
|
|
|
if len(blobs) != 0:
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
return False
|
2025-01-17 14:23:52 +08:00
|
|
|
|
2025-02-12 10:38:15 +08:00
|
|
|
|
|
|
|
|
class StepsDataAvailability(StepsCommon):
|
2025-01-21 16:57:23 +08:00
|
|
|
def find_executor_node(self):
|
|
|
|
|
executor = {}
|
|
|
|
|
for node in self.main_nodes:
|
|
|
|
|
if node.node_type() == NOMOS_EXECUTOR:
|
|
|
|
|
executor = node
|
|
|
|
|
return executor
|
|
|
|
|
|
2025-01-17 14:23:52 +08:00
|
|
|
@allure.step
|
2025-03-12 05:11:20 +00:00
|
|
|
def disperse_data(self, data, app_id, index, client_node=None, **kwargs):
|
|
|
|
|
|
|
|
|
|
timeout_duration = kwargs.get("timeout_duration", 65)
|
|
|
|
|
utf8 = kwargs.get("utf8", True)
|
|
|
|
|
padding = kwargs.get("padding", True)
|
|
|
|
|
send_invalid = kwargs.get("send_invalid", False)
|
|
|
|
|
|
|
|
|
|
request = prepare_dispersal_request(data, app_id, index, utf8=utf8, padding=padding)
|
|
|
|
|
|
2025-03-06 01:57:21 +00:00
|
|
|
@retry(stop=stop_after_delay(timeout_duration), wait=wait_fixed(0.1), reraise=True)
|
2025-02-25 16:39:55 +11:00
|
|
|
def disperse(my_self=self):
|
|
|
|
|
try:
|
2025-03-05 06:50:20 +00:00
|
|
|
if client_node is None:
|
2025-03-12 05:11:20 +00:00
|
|
|
executor = my_self.find_executor_node()
|
2025-03-05 06:50:20 +00:00
|
|
|
response = executor.send_dispersal_request(request)
|
|
|
|
|
else:
|
2025-03-12 00:12:35 +00:00
|
|
|
response = client_node.send_dispersal_request(request, send_invalid=send_invalid)
|
2025-03-17 08:06:33 +00:00
|
|
|
|
2025-02-25 16:39:55 +11:00
|
|
|
except Exception as ex:
|
2025-03-17 08:06:33 +00:00
|
|
|
logger.error(f"Exception while dispersing data: {ex}")
|
|
|
|
|
raise
|
2025-02-25 16:39:55 +11:00
|
|
|
|
2025-03-03 00:33:41 +00:00
|
|
|
assert hasattr(response, "status_code"), "Missing status_code"
|
2025-02-21 19:00:04 +11:00
|
|
|
|
2025-03-03 00:33:41 +00:00
|
|
|
return response
|
2025-02-25 16:56:36 +11:00
|
|
|
|
2025-03-03 00:33:41 +00:00
|
|
|
return disperse()
|
2025-02-21 19:00:04 +11:00
|
|
|
|
2025-01-17 19:27:43 +08:00
|
|
|
@allure.step
|
2025-03-12 05:11:20 +00:00
|
|
|
def get_data_range(self, node, app_id, start, end, client_node=None, **kwargs):
|
|
|
|
|
|
|
|
|
|
timeout_duration = kwargs.get("timeout_duration", 65)
|
2025-03-13 10:18:02 +00:00
|
|
|
interval = kwargs.get("interval", 0.1)
|
2025-03-12 05:11:20 +00:00
|
|
|
send_invalid = kwargs.get("send_invalid", False)
|
|
|
|
|
|
|
|
|
|
query = prepare_get_range_request(app_id, start, end)
|
|
|
|
|
|
2025-03-13 10:18:02 +00:00
|
|
|
@retry(stop=stop_after_delay(timeout_duration), wait=wait_fixed(interval), reraise=True)
|
2025-02-25 16:39:55 +11:00
|
|
|
def get_range():
|
|
|
|
|
try:
|
2025-03-06 02:14:41 +00:00
|
|
|
if client_node is None:
|
|
|
|
|
response = node.send_get_data_range_request(query)
|
|
|
|
|
else:
|
2025-03-12 00:12:35 +00:00
|
|
|
response = client_node.send_get_data_range_request(query, send_invalid=send_invalid)
|
2025-02-25 16:39:55 +11:00
|
|
|
except Exception as ex:
|
2025-03-17 08:06:33 +00:00
|
|
|
logger.error(f"Exception while retrieving data: {ex}")
|
|
|
|
|
raise
|
2025-02-25 16:39:55 +11:00
|
|
|
|
|
|
|
|
assert response_contains_data(response), "Get data range response is empty"
|
|
|
|
|
|
|
|
|
|
return response
|
2025-02-25 16:56:36 +11:00
|
|
|
|
2025-03-03 00:33:41 +00:00
|
|
|
return get_range()
|