diff --git a/sdcm/sct_events/base.py b/sdcm/sct_events/base.py index 8f54c6d0b0..a7bc0411c4 100644 --- a/sdcm/sct_events/base.py +++ b/sdcm/sct_events/base.py @@ -302,6 +302,8 @@ def __getstate__(self): if subcontext := getattr(self, "subcontext"): attrs["subcontext"] = [self.attribute_with_value_for_json(attributes_list=event.subcontext_fields, event=event) for event in subcontext] + else: + attrs["subcontext"] = [] return attrs def __str__(self): diff --git a/unit_tests/test_sct_events_base.py b/unit_tests/test_sct_events_base.py index e02b9363c9..f418b2299b 100644 --- a/unit_tests/test_sct_events_base.py +++ b/unit_tests/test_sct_events_base.py @@ -156,7 +156,8 @@ class Y(SctEvent): y.to_json(), f'{{"base": "Y", "type": null, "subtype": null, "event_timestamp": {y.event_timestamp}, ' f'"source_timestamp": null, ' - f'"severity": "UNKNOWN", "event_id": "fa4a84a2-968b-474c-b188-b3bac4be8527", "log_level": 30}}' + f'"severity": "UNKNOWN", "event_id": "fa4a84a2-968b-474c-b188-b3bac4be8527", "log_level": 30, ' + f'"subcontext": []}}' ) def test_publish(self): diff --git a/unit_tests/test_sct_events_continuous_events_registry.py b/unit_tests/test_sct_events_continuous_events_registry.py index a7d5881a86..d25243df4d 100644 --- a/unit_tests/test_sct_events_continuous_events_registry.py +++ b/unit_tests/test_sct_events_continuous_events_registry.py @@ -9,7 +9,7 @@ from sdcm.sct_events import Severity from sdcm.sct_events.continuous_event import ContinuousEventsRegistry, ContinuousEventRegistryException from sdcm.sct_events.database import get_pattern_to_event_to_func_mapping, CompactionEvent, \ - IndexSpecialColumnErrorEvent, ScyllaServerStatusEvent + IndexSpecialColumnErrorEvent, ScyllaServerStatusEvent, DatabaseLogEvent from sdcm.sct_events.loaders import GeminiStressEvent from sdcm.sct_events.nemesis import DisruptionEvent from sdcm.sct_events.nodetool import NodetoolEvent @@ -107,6 +107,29 @@ def test_add_nemesis_sub_context_to_information_event(self): # Validate that the event subcontext is serialized assert event.to_json() + def test_add_nemesis_sub_context_to_db_log_event(self): + event = DatabaseLogEvent.ABORTING_ON_SHARD() + # event not during nemesis + assert event.subcontext == [] + + # cloned events should have empty subcontext as well + cloned_event = event.clone() + assert cloned_event.subcontext == [] + + number_of_insertions = 2 + for i in range(number_of_insertions): + DisruptionEvent(node=uuid.uuid1(), nemesis_name=f"test{i}", publish_event=False).begin_event() + GeminiStressEvent(node=uuid.uuid1(), cmd="gemini hello", publish_event=False).begin_event() + + event = DatabaseLogEvent.ABORTING_ON_SHARD().clone() + event.add_info(node="n1", line="kernel: Linux version", line_number=0) + assert event.msgfmt == ('({0.base} {0.severity}) period_type={0.period_type} event_id={0.event_id} ' + 'during_nemesis=test0,test1: type={0.type} regex={0.regex} ' + 'line_number={0.line_number} node={0.node}\n{0.line}') + + # Validate that the event subcontext is serialized + assert event.to_json() + def test_adding_a_non_continuous_event_raises_error(self, registry: ContinuousEventsRegistry, info_event):