mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-28 04:06:59 +00:00
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
104 lines
3.6 KiB
Python
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)
|