95 Commits
Author SHA1 Message Date
Darshan JainandCursor eed39bfb2f feat: parallelize SLO PromQL queries with ThreadPoolExecutor (#1560) (#1572)
* feat: parallelize SLO PromQL queries with ThreadPoolExecutor (#1560)

Use concurrent.futures.ThreadPoolExecutor to run independent SLO range
queries in parallel, reducing per-pass evaluation from ~11-12s to ~2-3s.
Includes configurable max_workers (default 10, capped to SLO count),
per-future error isolation for malformed SLO dicts, and comprehensive
unit tests for parallelism, mixed results, and exception isolation.

Signed-off-by: Darshan Jain <ddjain@redhat.com>
Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: prevent malformed SLOs from silently inflating resiliency score

- Move slo["expr"]/slo["name"] access inside try block so KeyError is
  caught and re-raised as ValueError with context
- Write failure result in the outer future.result() handler so malformed
  SLOs appear in the results mapping instead of being dropped
- Treat SLOs missing from prometheus_results as failed (score.py) rather
  than excluding them, which previously inflated the score
- Clamp max_workers to minimum of 1 to prevent ValueError from
  ThreadPoolExecutor when max_workers <= 0

Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Signed-off-by: Darshan Jain <ddjain@redhat.com>
Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-24 13:33:55 +05:30
Sahil LenkaandPaige Patton 673897815f add back the manifestwork template the managed cluster scenarios render (#1540)
the managed cluster scenarios have been loading manifestwork.j2 at
runtime since the plugin was moved into scenario_plugins, but the file
itself never made it into the new layout. every scenario call crashed
with a TemplateNotFound error before the manifestwork was created.

the template was found in the git history of the old kraken layout and
restored, with the invalid namespace dropped from the ClusterRole
(ClusterRoles are cluster-scoped, a namespace on one fails to apply and
breaks the rbac setup for the job). added a test that checks the file
is present and that it renders into a valid ManifestWork document with
the variables the scenarios pass in.

Signed-off-by: Sahil Lenka <sahillenka44@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-08-20 10:41:24 -04:00
reeeandqsxDree 7c1033589c feat: add prometheus trigger type for event-driven chaos (#1517)
* feat: add prometheus trigger type for event-driven chaos

Signed-off-by: qsxDree <qsxdreee@gmail.com>

* prometheus timeout implemented

Signed-off-by: qsxDree <qsxdreee@gmail.com>

* bumped krkn-lib version

Signed-off-by: qsxDree <qsxdreee@gmail.com>

---------

Signed-off-by: qsxDree <qsxdreee@gmail.com>
Co-authored-by: qsxDree <qsxdreee@gmail.com>
2026-08-18 10:06:23 +05:30
Darshan JainandCursor 45c11aa5a9 fix: skip unnecessary wait_duration sleep after the last scenario (#1558)
* fix: skip unnecessary wait_duration sleep after the last scenario

The wait_duration sleep was running unconditionally after every scenario,
including the final one. This wasted up to 60s (default) on single-scenario
runs where there is no next scenario to wait for.

Closes #1556

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: use wait_duration as soak window for SLO evaluation

Move end_timestamp capture to after the wait_duration sleep so the
resiliency score / SLO evaluation window includes the settling period.
This ensures delayed impacts during cooldown are captured in metrics.

The sleep now runs for every scenario (including the last) since it
serves as a measurement soak window, not just an inter-scenario delay.

Closes krkn-chaos#1556

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-14 22:13:10 +05:30
Darshan JainandCursor 51f41e3595 fix: improve logging clarity , reduce noise, fix log levels, and reword misleading messages (#1562)
* fix: improve logging clarity — reduce noise, fix log levels, and reword misleading messages

- Move per-directory rollback WARNING to DEBUG; add single INFO summary
- Change "No rollback context directories found" from WARNING to DEBUG
- Change "Skip cleanup/execution" from WARNING to DEBUG
- Fix misleading Cerberus "still failing" message: early-return when
  disabled, use correct log levels, remove inaccurate wording
- Change "No error logs collected" from INFO to DEBUG
- Reword "Detected distribution" to "Detected cluster platform"
- Reword OCP metadata collection log for clarity

Closes #1559

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: address review comments — fix tests, reword log messages

- Add cerberus_enabled = True to 4 publish_kraken_status tests broken
  by early-return guard
- Add new test for cerberus_disabled early-return path
- Reword rollback skip summary to neutral wording
- Remove capitalize() from platform detection log

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-14 09:45:55 -04:00
Paige Patton fef4f2d862 adding failed alerts to telemetery (#1552) 2026-08-13 13:07:01 -04:00
Darshan JainandCursor e86ac5b802 add force deletion option to pod disruption scenario (#1544)
* feat: add force pod deletion option to pod disruption scenario

Add a `force` boolean config option (default: false) that controls
whether pods are killed gracefully or forcefully. When force is true,
grace_period_seconds=0 is passed to delete_pod(), causing immediate
termination without waiting for the pod's terminationGracePeriodSeconds.

Works with both serial and parallel execution modes.

Depends on: krkn-lib feat/force-pod-delete branch

Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: address PR review - validate force config, bump krkn-lib, add tests

- Add type validation for 'force' config to reject non-boolean values
- Bump krkn-lib to 6.1.3 (includes grace_period_seconds in delete_pod)
- Add unit tests for force deletion in serial and parallel modes

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 19:57:43 +05:30
SWAGATO BAURIandDarshan Jain ee32a179cf feat(pod-disruption): support parallel pod deletion (#1536)
* feat(pod-disruption): support parallel pod deletion

Introduce 'kill_mode' field to pod disruption scenario to support parallel
deletion of pods. By default 'kill_mode' is 'sequential' preserving
existing behavior. When set to 'parallel', it concurrently deletes pods
using threading and queue, enabling effective testing of disruption scenarios
like etcd quorum loss where simultaneous disruption is necessary.

Resolves: #1516

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: swagatobauri <swagato731123@gmail.com>

* fix(pod-disruption): validate kill_mode and address PR feedback

- Validate 'kill_mode' at parse time: fallback to 'sequential' and log a
  warning if an unknown string is provided, preventing silent failures.
- Update test_parallel_mode_calls_delete_concurrently to use a
  threading.Barrier to definitively prove concurrent thread execution.
- Revert 'scenarios/openshift/etcd.yml' to default non-destructive behavior
  and extract parallel quorum loss example into a new explicitly named file
  'etcd_quorum_loss.yml'.

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: swagatobauri <swagato731123@gmail.com>

* refactor(pod-disruption): optimize imports and cap threads

- Reorganize imports in pod_disruption_scenario_plugin.py to comply with
  standard PEP-8 grouping (stdlib, third-party, local).
- Replace unbounded OS thread spawning in _delete_pods_parallel with
  concurrent.futures.ThreadPoolExecutor. Capped max_workers to 10 to
  prevent excessive concurrent API calls that could overload the Kubernetes
  API server under aggressive scenario configurations.

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: swagatobauri <swagato731123@gmail.com>

* refactor(pod-disruption): align execution config with network_chaos_ng

- Renamed config field from 'kill_mode' to 'execution' for consistency
  with the network_chaos_ng plugin.
- Changed valid values from 'sequential|parallel' to 'serial|parallel'.
- Replaced fallback warning with strict validation, raising ValueError on
  invalid execution values, aligning with the strict validation pattern
  used elsewhere in the codebase.
- Updated relevant tests and scenario YAML templates.

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: swagatobauri <swagato731123@gmail.com>

* fix(pod-disruption): remove unused logging import in models.py

Following the switch from a warning log to raising a ValueError for
invalid execution types, the logging import was no longer used.

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: swagatobauri <swagato731123@gmail.com>

---------

Signed-off-by: swagatobauri <swagato731123@gmail.com>
Co-authored-by: Darshan Jain <darjain@redhat.com>
2026-08-06 18:46:25 +05:30
Teju Gangisetty 44e0444b0d handle None values in node summary for text report (#1541)
Signed-off-by: Teju Gangisetty <tgangise@redhat.com>
2026-08-06 17:11:49 +05:30
Saurabh Wattamwar a6855f219f feat: add k8s trigger type for event-driven chaos (#1515)
* feat: add k8s trigger type for event-driven chaos

Closes #1496

Signed-off-by: Saurabh Wattamwar <swattamw@redhat.com>

* fix: address review comments on k8s trigger

- Validate namespace against resource_api.namespaced to fail fast
  when a namespaced resource is missing the namespace config
- Use numeric equality first in _compare for == and != operators
  so that 1.0 == 1 works consistently with >= and <=
- Fix krknctl-input.json description for apiVersion field

Signed-off-by: Saurabh Wattamwar <swattamw@redhat.com>

* feat: add optional context field to k8s trigger

Allows selecting a specific kubeconfig context for cross-cluster
triggers. If omitted, uses the default context as before.

Signed-off-by: Saurabh Wattamwar <swattamw@redhat.com>

* fix: use kubecli.dyn_client instead of raw DynamicClient and catch ValueError

- K8sTrigger now receives kubecli from TriggerManager and uses
  kubecli.dyn_client for centralized config and proxy support
- TriggerManager passes kubecli through _build_trigger to K8sTrigger
- run_kraken.py passes kubecli to TriggerManager
- Added ValueError to the except clause in evaluate() to handle
  non-numeric comparisons and namespace validation errors gracefully

Signed-off-by: Saurabh Wattamwar <swattamw@redhat.com>

* docs: add k8s trigger example config

Signed-off-by: Saurabh Wattamwar <swattamw@redhat.com>

* fix: make kubecli required and remove unused context field from k8s trigger

  Address remaining review comments on PR #1515:
  - Make kubecli a required argument with early validation instead of
    silently failing when None
  - Remove _context field since _get_client() delegates to kubecli.dyn_client
    which is already initialized with the correct context
  - Remove TRIGGER_K8S_CONTEXT from krknctl-input.json
  - Update tests to pass mock kubecli and cover missing-kubecli validation

Signed-off-by: Saurabh Wattamwar <swattamw@redhat.com>

---------

Signed-off-by: Saurabh Wattamwar <swattamw@redhat.com>
2026-08-04 14:13:15 -04:00
Sahil LenkaandPaige Patton be36abd53d protect config.telemetry access with fallback to empty dict (#1427)
* protect config.telemetry access with fallback to empty dict

If the YAML config does not include a telemetry section, three
spots in main() crash with KeyError because they access
config.telemetry directly. Everything else in the file uses
get_yaml_item_value which handles missing keys gracefully.

Added config.telemetry = get_yaml_item_value(config, telemetry, {})
before the first usage. This ensures the key always exists as at
least an empty dict, protecting all downstream .get() calls and
assignments (archive_path, run_tag, telemetry_group, etc.).

Wrote a test that passes a config without a telemetry section and
asserts main() returns -1 (no kubeconfig) instead of crashing
with KeyError.

Signed-off-by: Sahil Lenka <sahillenka44@gmail.com>

* clean up test imports and prevent filesystem side effects

Remove unused imports (Mock, get_yaml_item_value). Add
rollback_versions_directory to mock config so the test
does not write ~/.krkn/rollback to disk.

Signed-off-by: Sahil Lenka <sahillenka44@gmail.com>

---------

Signed-off-by: Sahil Lenka <sahillenka44@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-08-03 12:00:44 -04:00
Teju Gangisetty 84b360c83b changed pdf library to reportlab (#1532)
Signed-off-by: Teju Gangisetty <tgangise@redhat.com>
2026-07-31 12:30:55 -04:00
Sahil LenkaandPaige Patton 1bec1f9051 multiprocess_nodes: clean up pool in finally block, fix log level (#1415)
ThreadPool.close() was placed after starmap/map but outside a
finally block. If the pool operation throws, close() never runs
and worker threads hang around until process exit.

Moved pool.close() and added pool.join() into a finally block.
Changed logging.info to logging.error in the exception handler
so pool failures are visible at the default log level.

Wrote two tests before touching code. The first verifies that
close() and join() are called even when map raises. The second
verifies that logging.error is used instead of logging.info.

Signed-off-by: Sahil Lenka <sahillenka44@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-07-30 11:07:30 -04:00
Teju GangisettyandPaige Patton cab32f3e98 improve krkn output to summarize key areas (#1520)
Signed-off-by: Teju Gangisetty <tgangise@redhat.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-07-30 11:05:08 -04:00
Paige Patton 04eee83691 add junit into own util (#1529) 2026-07-29 16:22:07 -04:00
Paige Patton 5017fbb47d adding resiliency score (#1364)
Assisted By: Claude Code:

Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-07-28 16:50:08 -04:00
SWAGATO BAURIandDarshan Jain 06954dd648 feat: add http trigger type for event-driven chaos (#1504)
* feat: add http trigger type for event-driven chaos

Adds an http trigger type so krkn can wait for an HTTP endpoint to return
an expected status before chaos injection. Completes the trigger types
on top of the Phase 1 framework (#1484).

- krkn/scenario_plugins/triggers/http_trigger.py: implements HttpTrigger
- krkn/scenario_plugins/triggers/trigger_manager.py: registers "http" type
- krkn/scenario_plugins/triggers/__init__.py: exports HttpTrigger
- tests/test_triggers/test_http_trigger.py: 30 tests for HttpTrigger
- scenarios/kube/trigger_http_example.yaml: example configuration

Closes krkn-chaos/krkn#1498

Signed-off-by: swagatobauri <swagato731123@gmail.com>

* fix(triggers): address code review feedback for http trigger

- Add type validation for body_contains in http_trigger.py
- Use mock_info.assert_not_called() for strict logging assertions in tests

Signed-off-by: swagatobauri <swagato731123@gmail.com>

* feat(krknctl): add http trigger arguments to krknctl input fields

Wire HTTP triggers into krknctl-input.json so they are exposed as CLI flags
by krknctl.

Related to krkn-chaos/krkn#1498

Signed-off-by: swagatobauri <swagato731123@gmail.com>

* test(triggers): add factory wiring and invalid body_contains tests

Signed-off-by: swagatobauri <swagato731123@gmail.com>

* fix(triggers): move trigger_http_example.yaml to config directory per review

Signed-off-by: swagatobauri <swagato731123@gmail.com>

* fix(triggers): move HttpTrigger import to top of file per review

Signed-off-by: swagatobauri <swagato731123@gmail.com>

---------

Signed-off-by: swagatobauri <swagato731123@gmail.com>
Co-authored-by: Darshan Jain <darjain@redhat.com>
2026-07-27 13:09:37 +05:30
varun-ai69andPaige Patton 01f6b467ee fix(rollback): execute version files in LIFO order (#1487) (#1494)
Signed-off-by: varun-ai69 <kushwahavarun86@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-07-24 12:29:57 -04:00
Paige Patton 5973f56d20 adding critical or error alerts to fail run (#1503)
Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-07-23 16:57:15 -04:00
249b07b250 fix: build egress tc netem tree with actual loss/delay values (#1501)
* fix: build tc netem tree with actual loss/delay values instead of changing after

The egress path in node-network-chaos built the tc htb+netem tree with
hardcoded loss 0% and delay 0ms, then tried to update via tc qdisc change.
On some hardware (bare-metal with Mellanox NIC), the change command fails
silently — no packets are ever dropped, producing false-negative tests.

Build the tree with actual rate/delay/loss values in a single pass,
matching how the ingress path already works. This eliminates the
tc qdisc change step entirely. Also log stderr warnings from tc commands
that were previously swallowed silently.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: ddjain <darjain@redhat.com>

* refactor: remove unused get_egress_shaping_comand after single-pass tc tree build

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 21:42:16 +05:30
Darshan JainandClaude Opus 4.6 f62d2e1c36 feat: add event-driven chaos triggers with command trigger (Phase 1) (#1484)
* feat: add event-driven chaos triggers with command trigger (Phase 1)

Adds a pluggable trigger system that gates chaos injection on
user-defined preconditions. A top-level `triggers` block in
config.yaml is evaluated before the chaos loop, with configurable
polling mode (all_of/any_of), timeout, interval, and on_timeout
behavior (skip/fail/run_anyway).

Phase 1 implements the command trigger type which runs a shell
command and checks its exit code.

- AbstractTrigger base class for pluggable trigger types
- CommandTrigger with input validation (expected_rc int coercion)
- TriggerManager with positive-number validation for timeout/interval
- Trigger evaluation runs before health check plugins start
- Broad exception handling in evaluate() prevents UnboundLocalError
- Debug logging of command returncode/stderr for observability
- 33 unit tests covering all functionality and edge cases

Closes #1483

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: ddjain <darjain@redhat.com>

* fix: address review feedback on trigger validation

- Validate conditions is a list, not a string
- Expose on_timeout as a property, use it in run_kraken.py
  instead of re-reading raw config
- Validate expected_rc is in 0-255 Unix range
- Add 4 new tests (37 trigger tests total)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: ddjain <darjain@redhat.com>

---------

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-16 20:42:40 +05:30
Paige Patton 3a6bd7d18a adding vmi ready status (#1371)
Assisted By: Claude Code:

Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-07-02 14:22:07 -04:00
a81d084c93 fix: validate container_name in container scenario plugin (#1409) (#1410)
* fix: validate container_name in container scenario plugin

The container scenario plugin removed pods and incremented killed_count
even when the requested container_name was never found, causing scenarios
to silently report success with no disruption (issue #1409).

Track whether a container was actually found and killed; only increment
killed_count on a real kill, skip pods that lack the target container,
and raise a clear RuntimeError once all pods are exhausted without a kill.

Adds unit tests covering invalid, valid, empty, heterogeneous, and
count-exceeds-target scenarios.

Closes #1409

* fix: report actual kill count in container-not-found error

When the candidate pod list is exhausted without finding the target
container, the RuntimeError now reports how many containers were
actually killed ("N of M requested container(s) were killed") instead
of always claiming "No containers were killed", which was inaccurate in
partial-success cases.

* fix: only raise container-not-found error when nothing was killed

Address review feedback: the "not found in any matching pod" error was
raised even after one or more containers had already been killed (when
count exceeds the number of pods containing the target), making the
message contradictory.

Now that error only fires when killed_count == 0. When some kills
already happened but the candidate list is exhausted, the loop falls
through to the existing "Trying to kill more containers than were found"
error, which accurately describes that case.

---------

Co-authored-by: augmentcode[bot] <185243770+augmentcode[bot]@users.noreply.github.com>
Co-authored-by: Darshan Jain <darjain@redhat.com>
2026-07-01 00:52:01 +05:30
Shivansh Katiyar f8c0766ebc Implement Power Outage Rollback Feature (#927)
Signed-off-by: SK8-infi <shivansh.katiyar1712@gmail.com>
2026-06-05 10:16:11 -04:00
Paige Patton a24f4440ec adding shell checks in pvc scenario (#1381)
Assisted By: Claude Code:

Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-06-04 16:45:49 -04:00
Nitesh SinghandPaige Patton 53a81e8e90 feat: Add exec_with_shell_fallback method and fix failing unit tests (#1225)
- Add exec_with_shell_fallback method with retry logic and shell fallback
- Add unit tests for the new method with proper mocking
- All tests now pass as expected

Signed-off-by: NITESH SINGH <niteshkumar121411@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-06-04 16:38:15 -04:00
Paige PattonandClaude Sonnet 4.6 4328c24d28 feat: add label_selector support to kubevirt vm outage and virt health check (#1341)
Allows selecting VMIs by label selector as an alternative to vm_name regex,
making vm_name optional when label_selector is provided.

Signed-off-by: Paige Patton <prubenda@redhat.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 17:02:10 -04:00
Netram FaranandPaige Patton 92272f9143 fix(health-check): derive status from previous_status_code instead of hardcoding False (#1354)
* fix(health-check): derive status from previous_status_code instead of hardcoding False

Signed-off-by: netram75 <netram.24bcs10329@sst.scaler.com>

* test(health-check): assert status field on change record in recovery test

Signed-off-by: netram75 <netram.24bcs10329@sst.scaler.com>

---------

Signed-off-by: netram75 <netram.24bcs10329@sst.scaler.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-05-27 12:55:28 -04:00
eb2efa84ea feat: storage I/O throttle scenario (cgroups v1/v2) for PVC-backed workloads (#1296)
* feat(storage-throttle): add storage throttle scenario and tests

Consolidate the storage-throttle implementation, scenario configs, CI v2 coverage, and krkn-lib 6.0.10 dependency update into a single signed commit for cleaner PR history.

Signed-off-by: ddjain <darjain@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: ddjain <darjain@redhat.com>

* adding need dco auto review (#1329)

Signed-off-by: Paige Patton <prubenda@redhat.com>
Signed-off-by: ddjain <darjain@redhat.com>

* fix: start_klusterlet_scenario action calls start instead of stop (#1324)

The start_klusterlet_scenario branch in inject_managedcluster_scenario
was calling stop_klusterlet_scenario on the scenarios object instead of
start_klusterlet_scenario. Any user configuring this action would stop
the klusterlet (scale to 0) instead of starting it (scale to 3).

Fixes #1323

Signed-off-by: v0idheaven <dahiyavarun2007@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
Signed-off-by: ddjain <darjain@redhat.com>

* adding links to issue of completed roadmap items (#1328)

Signed-off-by: Paige Patton <prubenda@redhat.com>
Signed-off-by: ddjain <darjain@redhat.com>

* container scenario template image update (#1342)

Signed-off-by: Paige Patton <prubenda@redhat.com>
Signed-off-by: ddjain <darjain@redhat.com>

---------

Signed-off-by: ddjain <darjain@redhat.com>
Signed-off-by: Paige Patton <prubenda@redhat.com>
Signed-off-by: v0idheaven <dahiyavarun2007@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
Co-authored-by: Varun Yadav <dahiyavarun2007@gmail.com>
2026-05-19 00:24:55 +05:30
Paige Patton 0e8af957f3 addinig vmi network outages (#1234)
Assisted By: Claude Code:
Assisted By: Claude Code:

Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-05-14 14:34:19 -04:00
Paige Patton 7ec263f84c health check plugin (#1176)
Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-05-14 14:32:07 -04:00
Arpit RajandPaige Patton d70c56aa30 fix: add connection pooling for HTTP health checks in cerberus and HealthChecker (#1236)
Signed-off-by: 1PoPTRoN <vrxn.arp1traj@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-05-14 11:22:54 -04:00
Paige Patton c7d8116afd bm test cases (#1308)
Assisted By: Claude Code:
Assisted By: Claude Code:

Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-05-14 08:39:04 -04:00
Netram FaranandPaige Patton f5e5d0677b fix(cerberus): fix config key typo and shadowed global in get_status (#1303)
* fix(cerberus): fix config key typo and shadowed global in get_status

Fixes #1302

- Fix typo in set_url(): read 'check_application_routes' instead of
  'check_applicaton_routes' so the correct config key is used
- Remove local 'check_application_routes = False' in get_status() and
  declare global instead, so the value set by set_url() is actually read
- Update test config key and remove the workaround comment that
  acknowledged the shadowed global

Signed-off-by: netram75 <netram.24bcs10329@sst.scaler.com>

* fix(cerberus): remove extra cerberus_url arg from application_status call

application_status(start_time, end_time) takes two parameters but was
being called with three (cerberus_url, start_time, end_time), which
would raise a TypeError whenever check_application_routes is enabled.
Remove the stale argument since the function already reads cerberus_url
from the module global.

Signed-off-by: netram75 <netram.24bcs10329@sst.scaler.com>

---------

Signed-off-by: netram75 <netram.24bcs10329@sst.scaler.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-05-13 13:48:51 -04:00
Paige Patton ebe6049be9 adding start of vmi network scenario (#1260)
Assisted By: Claude Code:
Assisted By: Claude Code:

Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-05-13 13:20:08 -04:00
Arpit Raj 4e87841aca fix: fail node actions when actions list is empty (#1273)
Signed-off-by: 1PoPTRoN <vrxn.arp1traj@gmail.com>
2026-05-08 09:06:05 -04:00
Semih702andsemih702 e296565e4b fix: handle Alibaba request error logging (#1262)
Signed-off-by: semih702 <semih702@users.noreply.github.com>
Co-authored-by: semih702 <semih702@users.noreply.github.com>
2026-05-04 09:10:22 -04:00
95530dfe55 fix(rollback): resolve signal handler race condition by clearing context after execution (#1245)
- Fixed race condition in signal handler
- Cleared context after execution instead of before
- Improved rollback stability

Signed-off-by: Nitesh <nitesh@example.com>
Co-authored-by: Nitesh <nitesh@example.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-04-30 08:14:55 -04:00
Nitesh KumarandNitesh a912f958e5 fix(security): replace yaml.full_load with yaml.safe_load to prevent RCE (#1242)
Signed-off-by: Nitesh <nitesh@example.com>
Co-authored-by: Nitesh <nitesh@example.com>
2026-04-22 09:50:56 -04:00
Sahil Shah dfc3a1d716 Adding http load scenario (#1160)
Signed-off-by: Sahil Shah <sahshah@redhat.com>
2026-04-09 10:47:50 -04:00
Paige Patton 0777ef924f changing pod recovery to vmi recovery
Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-04-08 16:37:25 -04:00
Arpit Raj daa6dc4df9 fix: replace hardcoded /tmp paths with secure tempfile.mkdtemp() (#1223)
Signed-off-by: 1PoPTRoN <vrxn.arp1traj@gmail.com>
2026-04-07 10:55:46 -04:00
Arpit Raj 9f417d8f1a fix: log exception details in delete_job to surface get_job_pods errors (#1220)
Signed-off-by: 1PoPTRoN <vrxn.arp1traj@gmail.com>
2026-04-01 08:52:51 -04:00
Paige Patton 357889196a Adding node interface down/up scenario' (#1192)
* Adding node interface down/up scenario'

Signed-off-by: Paige Patton <prubenda@redhat.com>

* Trigger CI

---------

Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-03-31 13:59:41 -04:00
Paige Patton 35ee9d7bae adding changes to properly pass/fail a scenario if errors occur (#1065)
Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-03-31 12:31:25 -04:00
Paige Patton 626e203d33 removing kubernetes functions (#1205)
Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-03-31 08:46:40 -04:00
Paige Patton 71bd34b020 adding better logging for when sceanrio file cant be found (#1203)
Signed-off-by: Paige Patton <prubenda@redhat.com>
2026-03-27 13:47:49 -04:00
Tullio Sebastiani 4d5aea146d Run method fixes (#1202)
* kubevirt plugin fixes

Signed-off-by: Tullio Sebastiani <tsebasti@redhat.com>

* managed_cluster plugin fixes

Signed-off-by: Tullio Sebastiani <tsebasti@redhat.com>

* unit tests fix

Signed-off-by: Tullio Sebastiani <tsebasti@redhat.com>

---------

Signed-off-by: Tullio Sebastiani <tsebasti@redhat.com>
2026-03-27 14:31:19 +01:00
Yashasvi YadavandPaige Patton 62f500fb2e feat: add GCP zone outage rollback support (#1200)
Add rollback functionality for GCP zone outage scenarios following the
established rollback pattern (Service Hijacking, PVC, Syn Flood).

- Add @set_rollback_context_decorator to run()
- Set rollback callable before stopping nodes with base64/JSON encoded data
- Add rollback_gcp_zone_outage() static method with per-node error handling
- Fix missing poll_interval argument in starmap calls
- Add unit tests for rollback and run methods

Closes #915

Signed-off-by: YASHASVIYADAV30 <yashasviydv30@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-03-26 14:42:45 -04:00
Arpit RajandPaige Patton ec241d35d6 fix: improve logging reliability and code quality (#1199)
- Fix typo 'wating' -> 'waiting' in scenario wait log message
- Replace print() with logging.debug() for pod metrics in prometheus client
- Replace star import with explicit imports in utils/__init__.py
- Remove unnecessary global declaration in main()
- Log VM status exceptions at ERROR level with exception details

Include unit tests in tests/test_logging_and_code_quality.py covering all fixes.

Signed-off-by: 1PoPTRoN <vrxn.arp1traj@gmail.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
2026-03-26 13:08:56 -04:00