From 17f832637c5972b21da236122b3672f71482b8bc Mon Sep 17 00:00:00 2001 From: Abhinav Sharma <113504774+abhinavs1920@users.noreply.github.com> Date: Fri, 11 Jul 2025 23:40:16 +0530 Subject: [PATCH] =?UTF-8?q?feat:=20add=20optional=20node-name=20field=20to?= =?UTF-8?q?=20hog=20scenarios=20with=20precedence=20over=C2=A0node-selecto?= =?UTF-8?q?r=20(#831)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Abhinav Sharma Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com> --- .../hogs/hogs_scenario_plugin.py | 22 ++++++++++++++----- scenarios/kube/cpu-hog.yml | 1 + scenarios/kube/io-hog.yml | 3 ++- scenarios/kube/memory-hog.yml | 1 + 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/krkn/scenario_plugins/hogs/hogs_scenario_plugin.py b/krkn/scenario_plugins/hogs/hogs_scenario_plugin.py index 37fa7519..b82e9acd 100644 --- a/krkn/scenario_plugins/hogs/hogs_scenario_plugin.py +++ b/krkn/scenario_plugins/hogs/hogs_scenario_plugin.py @@ -25,6 +25,10 @@ class HogsScenarioPlugin(AbstractScenarioPlugin): with open(scenario, "r") as f: scenario = yaml.full_load(f) scenario_config = HogConfig.from_yaml_dict(scenario) + + # Get node-name if provided + node_name = scenario.get('node-name') + has_selector = True if not scenario_config.node_selector or not re.match("^.+=.*$", scenario_config.node_selector): if scenario_config.node_selector: @@ -33,13 +37,19 @@ class HogsScenarioPlugin(AbstractScenarioPlugin): else: node_selector = scenario_config.node_selector - available_nodes = lib_telemetry.get_lib_kubernetes().list_nodes(node_selector) - if len(available_nodes) == 0: - raise Exception("no available nodes to schedule workload") + if node_name: + logging.info(f"Using specific node: {node_name}") + all_nodes = lib_telemetry.get_lib_kubernetes().list_nodes("") + if node_name not in all_nodes: + raise Exception(f"Specified node {node_name} not found or not available") + available_nodes = [node_name] + else: + available_nodes = lib_telemetry.get_lib_kubernetes().list_nodes(node_selector) + if len(available_nodes) == 0: + raise Exception("no available nodes to schedule workload") - if not has_selector: - # if selector not specified picks a random node between the available - available_nodes = [available_nodes[random.randint(0, len(available_nodes))]] + if not has_selector: + available_nodes = [available_nodes[random.randint(0, len(available_nodes))]] if scenario_config.number_of_nodes and len(available_nodes) > scenario_config.number_of_nodes: available_nodes = random.sample(available_nodes, scenario_config.number_of_nodes) diff --git a/scenarios/kube/cpu-hog.yml b/scenarios/kube/cpu-hog.yml index eeb130e2..502ba74e 100644 --- a/scenarios/kube/cpu-hog.yml +++ b/scenarios/kube/cpu-hog.yml @@ -5,6 +5,7 @@ image: quay.io/krkn-chaos/krkn-hog namespace: default cpu-load-percentage: 90 cpu-method: all +# node-name: "worker-0" # Uncomment to target a specific node by name node-selector: "node-role.kubernetes.io/worker=" number-of-nodes: 2 taints: [] #example ["node-role.kubernetes.io/master:NoSchedule"] diff --git a/scenarios/kube/io-hog.yml b/scenarios/kube/io-hog.yml index 606ad259..1af1d5b1 100644 --- a/scenarios/kube/io-hog.yml +++ b/scenarios/kube/io-hog.yml @@ -6,10 +6,11 @@ namespace: default io-block-size: 1m io-write-bytes: 1g io-target-pod-folder: /hog-data +# node-name: "worker-0" # Uncomment to target a specific node by name io-target-pod-volume: name: node-volume hostPath: path: /root # a path writable by kubelet in the root filesystem of the node node-selector: "node-role.kubernetes.io/worker=" number-of-nodes: '' -taints: [] #example ["node-role.kubernetes.io/master:NoSchedule"] \ No newline at end of file +taints: [] #example ["node-role.kubernetes.io/master:NoSchedule"] \ No newline at end of file diff --git a/scenarios/kube/memory-hog.yml b/scenarios/kube/memory-hog.yml index f69eb082..bdee31d5 100644 --- a/scenarios/kube/memory-hog.yml +++ b/scenarios/kube/memory-hog.yml @@ -4,6 +4,7 @@ hog-type: memory image: quay.io/krkn-chaos/krkn-hog namespace: default memory-vm-bytes: 90% +# node-name: "worker-0" # Uncomment to target a specific node by name node-selector: "node-role.kubernetes.io/worker=" number-of-nodes: '' taints: [] #example ["node-role.kubernetes.io/master:NoSchedule"]