def update_metadata(self, metadata: Dict[str, Any]) -> None: if self._snapshot is None: raise UnsupportedOperationException( f"updating metadata on {self.__class__} without providing a snapshot" + " is not supported") dictionary = pyrsistent.pmap({ids.METADATA: metadata}) self._data = recursive_update(self._data, dictionary, check_key=False) self._snapshot.merge_metadata(metadata)
def _apply_update(self, update: "SnapshotDict") -> None: if self._snapshot is None: raise UnsupportedOperationException( f"trying to mutate {self.__class__} without providing a snapshot is " + "not supported") dictionary = update.dict(exclude_unset=True, exclude_none=True, exclude_defaults=True) self._data = recursive_update(self._data, dictionary, check_key=False) self._snapshot.merge(dictionary)
def merge_metadata(self, metadata: Dict[str, Any]) -> None: self._data = recursive_update(self._data, pyrsistent.pmap({ids.METADATA: metadata}), check_key=False)
def merge(self, update: Mapping[str, Any]) -> None: self._data = recursive_update(self._data, update)
def merge_event(self, event: PartialSnapshot) -> None: self._data = recursive_update(self._data, event.data())
def from_cloudevent(self, event: CloudEvent) -> "PartialSnapshot": e_type = event["type"] e_source = event["source"] status = _FM_TYPE_EVENT_TO_STATUS.get(e_type) timestamp = event["time"] if self._snapshot is None: raise UnsupportedOperationException( f"updating {self.__class__} without a snapshot is not supported" ) if e_type in ids.EVGROUP_FM_STEP: start_time = None end_time = None if e_type == ids.EVTYPE_FM_STEP_RUNNING: start_time = convert_iso8601_to_datetime(timestamp) elif e_type in { ids.EVTYPE_FM_STEP_SUCCESS, ids.EVTYPE_FM_STEP_FAILURE, ids.EVTYPE_FM_STEP_TIMEOUT, }: end_time = convert_iso8601_to_datetime(timestamp) self.update_step( get_real_id(e_source), get_step_id(e_source), step=Step( status=status, start_time=start_time, end_time=end_time, ), ) if e_type == ids.EVTYPE_FM_STEP_TIMEOUT: step = self._snapshot.get_step(get_real_id(e_source), get_step_id(e_source)) for job_id, job in step.jobs.items(): if job.status != state.JOB_STATE_FINISHED: job_error = "The run is cancelled due to reaching MAX_RUNTIME" self.update_job( get_real_id(e_source), get_step_id(e_source), job_id, job=Job(status=state.JOB_STATE_FAILURE, error=job_error), ) elif e_type in ids.EVGROUP_FM_JOB: start_time = None end_time = None if e_type == ids.EVTYPE_FM_JOB_START: start_time = convert_iso8601_to_datetime(timestamp) elif e_type in { ids.EVTYPE_FM_JOB_SUCCESS, ids.EVTYPE_FM_JOB_FAILURE }: end_time = convert_iso8601_to_datetime(timestamp) self.update_job( get_real_id(e_source), get_step_id(e_source), get_job_id(e_source), job=Job( status=status, start_time=start_time, end_time=end_time, data=event.data if e_type == ids.EVTYPE_FM_JOB_RUNNING else None, stdout=event.data.get(ids.STDOUT) if e_type == ids.EVTYPE_FM_JOB_START else None, stderr=event.data.get(ids.STDERR) if e_type == ids.EVTYPE_FM_JOB_START else None, error=event.data.get(ids.ERROR_MSG) if e_type == ids.EVTYPE_FM_JOB_FAILURE else None, ), ) elif e_type in ids.EVGROUP_ENSEMBLE: self.update_status(_ENSEMBLE_TYPE_EVENT_TO_STATUS[e_type]) elif e_type == ids.EVTYPE_EE_SNAPSHOT_UPDATE: self._data = recursive_update(self._data, event.data, check_key=False) else: raise ValueError(f"Unknown type: {e_type}") return self