"""Unit tests for alert -> Ansible action context vars (task 250, #5157).""" from steward.core.alerts import action_vars, alert_extra_vars from steward.models.alerts import AlertOperator, AlertRule def test_alert_extra_vars_describes_the_firing(): rule = AlertRule( name="UPS low battery", source_module="snmp", resource_name="ups", metric_name="battery_status", operator=AlertOperator.lt, threshold=3.0, created_by="u", ) assert alert_extra_vars(rule, 2.0) == { "steward_alert_rule": "UPS low battery", # one value, spaces and all "steward_alert_source": "snmp", "steward_alert_resource": "ups", "steward_alert_metric": "battery_status", "steward_alert_value": 2.0, "steward_alert_threshold": 3.0, "steward_alert_operator": "<", } def test_action_vars_split_at_the_first_equals(): assert action_vars(["greeting=hello world", "q=a=b", " k = v", "bare", "=x"]) == { "greeting": "hello world", "q": "a=b", "k": " v"} assert action_vars(None) == {} def test_an_alert_run_passes_its_vars_as_a_json_file_not_on_the_command_line(): import json from steward.ansible.executor import build_ansible_command, build_extra_vars_file rule = AlertRule(name="High CPU on web", source_module="host_agent", resource_name="web", metric_name="cpu_pct", operator=AlertOperator.gt, threshold=90.0, created_by="u") merged = {**action_vars(["note=from the action"]), **alert_extra_vars(rule, 95.5)} cmd = build_ansible_command("p.yml", "inv", {"extra_vars_map": merged}) assert "-e" not in cmd # nothing interpolated into argv argv, files = build_extra_vars_file(merged, "/tmp/x") assert argv == ["-e", "@/tmp/x/extravars.json"] assert json.loads(files[0][1])["steward_alert_rule"] == "High CPU on web" assert json.loads(files[0][1])["note"] == "from the action"