|
3 | 3 | # Copyright (c) Microsoft Corporation.
|
4 | 4 | # Licensed under the MIT License.
|
5 | 5 |
|
| 6 | +import json |
6 | 7 | import logging
|
7 | 8 | from datetime import datetime
|
8 | 9 | from enum import Enum
|
|
15 | 16 | EventFileAdded,
|
16 | 17 | EventJobCreated,
|
17 | 18 | EventJobStopped,
|
18 |
| - EventMessage, |
19 | 19 | EventNodeCreated,
|
20 | 20 | EventNodeDeleted,
|
21 | 21 | EventNodeStateUpdated,
|
|
26 | 26 | EventTaskStateUpdated,
|
27 | 27 | EventTaskStopped,
|
28 | 28 | EventType,
|
| 29 | + parse_event_message, |
29 | 30 | )
|
30 | 31 | from onefuzztypes.models import (
|
31 | 32 | Job,
|
@@ -152,31 +153,43 @@ def add_container(self, name: Container) -> None:
|
152 | 153 |
|
153 | 154 | self.add_files_set(name, set(files.files))
|
154 | 155 |
|
155 |
| - def add_message(self, message: EventMessage) -> None: |
156 |
| - events = { |
157 |
| - EventPoolCreated: lambda x: self.pool_created(x), |
158 |
| - EventPoolDeleted: lambda x: self.pool_deleted(x), |
159 |
| - EventTaskCreated: lambda x: self.task_created(x), |
160 |
| - EventTaskStopped: lambda x: self.task_stopped(x), |
161 |
| - EventTaskFailed: lambda x: self.task_stopped(x), |
162 |
| - EventTaskStateUpdated: lambda x: self.task_state_updated(x), |
163 |
| - EventJobCreated: lambda x: self.job_created(x), |
164 |
| - EventJobStopped: lambda x: self.job_stopped(x), |
165 |
| - EventNodeStateUpdated: lambda x: self.node_state_updated(x), |
166 |
| - EventNodeCreated: lambda x: self.node_created(x), |
167 |
| - EventNodeDeleted: lambda x: self.node_deleted(x), |
168 |
| - EventCrashReported: lambda x: self.file_added(x), |
169 |
| - EventFileAdded: lambda x: self.file_added(x), |
170 |
| - } |
171 |
| - |
172 |
| - for event_cls in events: |
173 |
| - if isinstance(message.event, event_cls): |
174 |
| - events[event_cls](message.event) |
| 156 | + def add_message(self, message_obj: Any) -> None: |
| 157 | + message = parse_event_message(message_obj) |
| 158 | + |
| 159 | + event = message.event |
| 160 | + if isinstance(event, EventPoolCreated): |
| 161 | + self.pool_created(event) |
| 162 | + elif isinstance(event, EventPoolDeleted): |
| 163 | + self.pool_deleted(event) |
| 164 | + elif isinstance(event, EventTaskCreated): |
| 165 | + self.task_created(event) |
| 166 | + elif isinstance(event, EventTaskStopped): |
| 167 | + self.task_stopped(event) |
| 168 | + elif isinstance(event, EventTaskFailed): |
| 169 | + self.task_failed(event) |
| 170 | + elif isinstance(event, EventTaskStateUpdated): |
| 171 | + self.task_state_updated(event) |
| 172 | + elif isinstance(event, EventJobCreated): |
| 173 | + self.job_created(event) |
| 174 | + elif isinstance(event, EventJobStopped): |
| 175 | + self.job_stopped(event) |
| 176 | + elif isinstance(event, EventNodeStateUpdated): |
| 177 | + self.node_state_updated(event) |
| 178 | + elif isinstance(event, EventNodeCreated): |
| 179 | + self.node_created(event) |
| 180 | + elif isinstance(event, EventNodeDeleted): |
| 181 | + self.node_deleted(event) |
| 182 | + elif isinstance(event, (EventCrashReported, EventFileAdded)): |
| 183 | + self.file_added(event) |
175 | 184 |
|
176 | 185 | self.last_update = datetime.now()
|
177 | 186 | messages = [x for x in self.messages][-99:]
|
178 | 187 | messages += [
|
179 |
| - (datetime.now(), message.event_type, message.event.json(exclude_none=True)) |
| 188 | + ( |
| 189 | + datetime.now(), |
| 190 | + message.event_type, |
| 191 | + json.dumps(message_obj, sort_keys=True), |
| 192 | + ) |
180 | 193 | ]
|
181 | 194 | self.messages = messages
|
182 | 195 |
|
@@ -301,6 +314,10 @@ def task_stopped(self, event: EventTaskStopped) -> None:
|
301 | 314 | if event.task_id in self.tasks:
|
302 | 315 | del self.tasks[event.task_id]
|
303 | 316 |
|
| 317 | + def task_failed(self, event: EventTaskFailed) -> None: |
| 318 | + if event.task_id in self.tasks: |
| 319 | + del self.tasks[event.task_id] |
| 320 | + |
304 | 321 | def render_tasks(self) -> List:
|
305 | 322 | results = []
|
306 | 323 | for task in self.tasks.values():
|
@@ -352,6 +369,11 @@ def job_stopped(self, event: EventJobStopped) -> None:
|
352 | 369 | if event.job_id in self.jobs:
|
353 | 370 | del self.jobs[event.job_id]
|
354 | 371 |
|
| 372 | + to_remove = [x.task_id for x in self.tasks.values() if x.job_id == event.job_id] |
| 373 | + |
| 374 | + for task_id in to_remove: |
| 375 | + del self.tasks[task_id] |
| 376 | + |
355 | 377 | def render_jobs(self) -> List[Tuple]:
|
356 | 378 | results: List[Tuple] = []
|
357 | 379 |
|
|
0 commit comments