def _full_snapshot_event(self, iter_) -> typing.Optional[FullSnapshotEvent]: """Return a FullSnapshotEvent if it was possible to create a snapshot. Return None if not, indicating that there should be no event.""" run_context = self._model.get_run_context() detailed_progress = self._model.getDetailedProgress() if detailed_progress == _THE_EMPTY_DETAILED_PROGRESS: return None snapshot_dict = self._create_snapshot_dict(run_context, detailed_progress, iter_) if not snapshot_dict: return None snapshot = Snapshot(snapshot_dict.dict()) self._set_iter_snapshot(iter_, snapshot) return FullSnapshotEvent( phase_name=self._model.getPhaseName(), current_phase=self._model.currentPhase(), total_phases=self._model.phaseCount(), indeterminate=self._model.isIndeterminate(), progress=self._progress(), iteration=iter_, snapshot=snapshot, )
def track(self): while True: event = self._work_queue.get() if isinstance(event, str): try: if event == EvaluatorTracker.DONE: yield EndEvent( failed=self._model.hasRunFailed(), failed_msg=self._model.getFailMessage(), ) elif event == EvaluatorTracker.CONNECTION_ERROR: yield EndEvent( failed=True, failed_msg="Connection error", ) except GeneratorExit: # consumers may exit at this point, make sure the last # task is marked as done pass self._work_queue.task_done() break elif event["type"] == ids.EVTYPE_EE_SNAPSHOT: iter_ = event.data["iter"] snapshot = Snapshot(event.data) self._iter_snapshot[iter_] = snapshot yield FullSnapshotEvent( phase_name=self._model.getPhaseName(), current_phase=self._model.currentPhase(), total_phases=self._model.phaseCount(), indeterminate=self._model.isIndeterminate(), progress=self._progress(), iteration=iter_, snapshot=snapshot, ) elif event["type"] == ids.EVTYPE_EE_SNAPSHOT_UPDATE: iter_ = event.data["iter"] if iter_ not in self._iter_snapshot: raise OutOfOrderSnapshotUpdateException( f"got {ids.EVTYPE_EE_SNAPSHOT_UPDATE} without having stored snapshot for iter {iter_}" ) partial = PartialSnapshot( self._iter_snapshot[iter_]).from_cloudevent(event) self._iter_snapshot[iter_].merge_event(partial) yield SnapshotUpdateEvent( phase_name=self._model.getPhaseName(), current_phase=self._model.currentPhase(), total_phases=self._model.phaseCount(), indeterminate=self._model.isIndeterminate(), progress=self._progress(), iteration=iter_, partial_snapshot=partial, ) self._work_queue.task_done()
def test_large_snapshot( runmodel, active_realizations, large_snapshot, qtbot, mock_tracker ): widget = RunDialog( "poly.ert", runmodel, {"active_realizations": active_realizations} ) widget.has_failed_realizations = lambda: False widget.show() qtbot.addWidget(widget) with patch("ert_gui.simulation.run_dialog.create_tracker") as mock_tracker_factory: iter_0 = FullSnapshotEvent( snapshot=large_snapshot, phase_name="Foo", current_phase=0, total_phases=1, progress=0.5, iteration=0, indeterminate=False, ) iter_1 = FullSnapshotEvent( snapshot=large_snapshot, phase_name="Foo", current_phase=0, total_phases=1, progress=0.5, iteration=1, indeterminate=False, ) mock_tracker_factory.return_value = mock_tracker( [iter_0, iter_1, EndEvent(failed=False, failed_msg="")] ) widget.startSimulation() qtbot.waitForWindowShown(widget) qtbot.waitUntil(lambda: widget._total_progress_bar.value() == 100, timeout=5000) qtbot.mouseClick(widget.show_details_button, Qt.LeftButton) qtbot.waitUntil(lambda: widget._tab_widget.count() == 2, timeout=5000)
def _batch(self, events): batch: List[CloudEvent] = [] for event in events: if event["type"] == ids.EVTYPE_EE_SNAPSHOT: # A new iteration, so ensure any updates for the previous one, # is emitted. if batch: yield self._flush(batch) batch = [] iter_ = event.data["iter"] snapshot = Snapshot(event.data) self._iter_snapshot[iter_] = snapshot yield FullSnapshotEvent( phase_name=self._model.getPhaseName(), current_phase=self._model.currentPhase(), total_phases=self._model.phaseCount(), indeterminate=self._model.isIndeterminate(), progress=self._progress(), iteration=iter_, snapshot=snapshot, ) self._work_queue.task_done() elif event["type"] == ids.EVTYPE_EE_SNAPSHOT_UPDATE: iter_ = event.data["iter"] if iter_ not in self._iter_snapshot: raise OutOfOrderSnapshotUpdateException( f"got {ids.EVTYPE_EE_SNAPSHOT_UPDATE} without having stored snapshot for iter {iter_}" ) batch.append(event) else: raise ValueError("got unexpected event type", event["type"]) if batch: yield self._flush(batch)
@pytest.mark.parametrize( "events,tab_widget_count", [ pytest.param( [ FullSnapshotEvent( snapshot=( SnapshotBuilder() .add_step(step_id="0", status=state.STEP_STATE_UNKNOWN) .add_job( step_id="0", job_id="0", name="job_0", data={}, status=state.JOB_STATE_START, ) .build(["0"], state.REALIZATION_STATE_UNKNOWN) ), phase_name="Foo", current_phase=0, total_phases=1, progress=0.25, iteration=0, indeterminate=False, ), SnapshotUpdateEvent( partial_snapshot=PartialSnapshot( SnapshotBuilder().build( [], status=state.REALIZATION_STATE_FINISHED ) ),