From 9379ca8fc359701b0c2d66cbc5a27426a9076aef Mon Sep 17 00:00:00 2001 From: Anton Nikiforov Date: Fri, 15 Nov 2024 11:13:06 +0300 Subject: [PATCH] [#180] preset_grpc: Add ability to attach rule for created container Signed-off-by: Anton Nikiforov --- scenarios/preset/helpers/frostfs_cli.py | 19 +++++++++++++++++-- scenarios/preset/preset_grpc.py | 12 ++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/scenarios/preset/helpers/frostfs_cli.py b/scenarios/preset/helpers/frostfs_cli.py index 116a797..dcbebcc 100644 --- a/scenarios/preset/helpers/frostfs_cli.py +++ b/scenarios/preset/helpers/frostfs_cli.py @@ -1,7 +1,7 @@ import re from helpers.cmd import execute_cmd, log -def create_container(endpoint, policy, container_creation_retry, wallet_path, config, local=False, retry=0): +def create_container(endpoint, policy, container_creation_retry, wallet_path, config, rules, local=False, retry=0): if retry > int(container_creation_retry): raise ValueError(f"unable to create container: too many unsuccessful attempts") @@ -34,6 +34,21 @@ def create_container(endpoint, policy, container_creation_retry, wallet_path, co log(f"Created container: {cid} ({policy})", endpoint) + # Add rule for container + if rules: + r = "" + for rule in rules: + rule = rule.replace("CONTAINER_ID", cid) + r += f" --rule '{rule}' " + cmd_line = f"frostfs-cli --rpc-endpoint {endpoint} ape-manager add {wallet_file} {wallet_config} " \ + f" --chain-id 'chain-id' {r} --target-name '{cid}' --target-type 'container'" + output, success = execute_cmd(cmd_line) + if not success: + log(f"{cmd_line}\n" + f"Rule has not been added\n" + f"{output}", endpoint) + return False + if not local: return cid @@ -86,7 +101,7 @@ def create_container(endpoint, policy, container_creation_retry, wallet_path, co return cid log(f"Created container {cid} is not stored on {endpoint}, creating another one...", endpoint) - return create_container(endpoint, policy, container_creation_retry, wallet_path, config, local, retry + 1) + return create_container(endpoint, policy, container_creation_retry, wallet_path, config, rules, local, retry + 1) def upload_object(container, payload_filepath, endpoint, wallet_file, wallet_config): diff --git a/scenarios/preset/preset_grpc.py b/scenarios/preset/preset_grpc.py index fbec2e3..0439d73 100755 --- a/scenarios/preset/preset_grpc.py +++ b/scenarios/preset/preset_grpc.py @@ -16,6 +16,7 @@ ERROR_WRONG_CONTAINERS_COUNT = 1 ERROR_WRONG_OBJECTS_COUNT = 2 MAX_WORKERS = 50 DEFAULT_POLICY = "REP 2 IN X CBF 2 SELECT 2 FROM * AS X" +DEFAULT_RULES = ["allow Object.* *"] parser = argparse.ArgumentParser() parser.add_argument('--size', help='Upload objects size in kb') @@ -37,6 +38,10 @@ parser.add_argument('--workers', help='Count of workers in preset. Max = 50, Def parser.add_argument('--sleep', help='Time to sleep between containers creation and objects upload (in seconds), ' 'Default = 8', default=8) parser.add_argument('--local', help='Create containers that store data on provided endpoints. Warning: additional empty containers may be created.', action='store_true') +parser.add_argument( + '--rule', + help='Rule attached to created containers. All entries of CONTAINER_ID will be replaced with id of created container.', + action="append") args: Namespace = parser.parse_args() print(args) @@ -55,7 +60,10 @@ def main(): wallet_config = args.config workers = int(args.workers) objects_per_container = int(args.preload_obj) - + rules = args.rule + if not rules: + rules = DEFAULT_RULES + ignore_errors = args.ignore_errors if args.update: # Open file @@ -67,7 +75,7 @@ def main(): containers_count = int(args.containers) print(f"Create containers: {containers_count}") with ProcessPoolExecutor(max_workers=min(MAX_WORKERS, workers)) as executor: - containers_runs = [executor.submit(create_container, endpoint, policy, container_creation_retry, wallet, wallet_config, args.local) + containers_runs = [executor.submit(create_container, endpoint, policy, container_creation_retry, wallet, wallet_config, rules, args.local) for _, endpoint, policy in zip(range(containers_count), cycle(endpoints), cycle(args.policy))]