Files
scylladb/test/nodetool/test_restore.py
Ernest Zaslavsky 196f7cad93 nodetool: fix handling of "--primary-replica-only" argument
The "--primary-replica-only" ("-pro") flag was previously ignored by
the `restore` operation. This patch ensures the argument is parsed and
applied correctly.

Closes scylladb/scylladb#28490
2026-02-18 12:21:27 +02:00

104 lines
3.6 KiB
Python

#
# Copyright 2024-present ScyllaDB
#
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
#
import pytest
from test.nodetool.rest_api_mock import expected_request
@pytest.mark.parametrize("nowait,task_state,task_error", [(False, "failed", "error"),
(False, "done", ""),
(True, "", "")])
def test_restore(nodetool, scylla_only, nowait, task_state, task_error):
endpoint = "s3.us-east-2.amazonaws.com"
bucket = "bucket-foo"
keyspace = "ks"
table = "cf"
prefix = "foo/bar"
params = {"endpoint": endpoint,
"bucket": bucket,
"prefix": prefix,
"keyspace": keyspace,
"table": table}
task_id = "2c4a3e5f"
start_time = "2024-08-08T14:29:25Z"
end_time = "2024-08-08T14:30:42Z"
task_status = {
"id": task_id,
"type": "download_sstables",
"kind": "node",
"scope": "node",
"state": task_state,
"is_abortable": False,
"start_time": start_time,
"end_time": end_time,
"error": task_error,
"sequence_number": 0,
"shard": 0,
"progress_total": 1.0,
"progress_completed": 1.0,
"children_ids": []
}
# just generate filenames of TOC components of random sstables
sstables = [f"me-{id}-big-TOC.txt" for id in range(12)]
expected_requests = [
expected_request(
"POST",
"/storage_service/restore",
params,
sstables,
response=task_id)
]
args = ["restore",
"--endpoint", endpoint,
"--bucket", bucket,
"--prefix", prefix,
"--keyspace", keyspace,
"--table", table]
if nowait:
args.append("--nowait")
args.extend(sstables)
res = nodetool(*args, expected_requests=expected_requests)
assert task_id in res.stdout
else:
args.extend(sstables)
# wait for the completion of backup task
expected_requests.append(
expected_request(
"GET",
f"/task_manager/wait_task/{task_id}",
response=task_status))
res = nodetool(*args, expected_requests=expected_requests, check_return_code=False)
if task_state == "done":
expected_returncode = 0
expected_output = f"""{task_state}
start: {start_time}
end: {end_time}
"""
else:
expected_returncode = 1
expected_output = f"""{task_state}: {task_error}
start: {start_time}
end: {end_time}
"""
assert res.returncode == expected_returncode
assert res.stdout == expected_output
@pytest.mark.parametrize("scope_val", ["all", "dc", "rack"])
@pytest.mark.parametrize("pro_val", ["--primary-replica-only", "-pro"])
def test_restore_scope_primary_replica(nodetool, scylla_only, scope_val, pro_val):
nodetool("restore", "--endpoint", "s3.us-east-2.amazonaws.com", "--bucket", "test_bucket", "--prefix",
"test_prefix", "--keyspace", "ks", "--table", "tbl", f"--scope={scope_val}", pro_val,
"me-1-big-TOC.txt",
expected_requests=[
expected_request("POST", "/storage_service/restore",
params={"endpoint": "s3.us-east-2.amazonaws.com", "bucket": "test_bucket",
"table": "tbl", "prefix": "test_prefix", "keyspace": "ks",
"scope": f"{scope_val}", "primary_replica_only": "true"}, body=["me-1-big-TOC.txt"])],
check_return_code=False)