def _StartScheduledFlow(scheduled_flow: rdf_flow_objects.ScheduledFlow) -> str: """Starts a Flow from a ScheduledFlow and deletes the ScheduledFlow.""" sf = scheduled_flow ra = scheduled_flow.runner_args try: flow_id = StartFlow( client_id=sf.client_id, creator=sf.creator, flow_args=sf.flow_args, flow_cls=registry.FlowRegistry.FlowClassByName(sf.flow_name), output_plugins=ra.output_plugins, start_at=rdfvalue.RDFDatetime.Now(), cpu_limit=ra.cpu_limit, network_bytes_limit=ra.network_bytes_limit, # TODO(user): runtime_limit is missing in FlowRunnerArgs. ) except Exception as e: scheduled_flow.error = str(e) data_store.REL_DB.WriteScheduledFlow(scheduled_flow) raise data_store.REL_DB.DeleteScheduledFlow( client_id=scheduled_flow.client_id, creator=scheduled_flow.creator, scheduled_flow_id=scheduled_flow.scheduled_flow_id) return flow_id
def WriteScheduledFlow( self, scheduled_flow: rdf_flow_objects.ScheduledFlow) -> None: """See base class.""" if scheduled_flow.client_id not in self.metadatas: raise db.UnknownClientError(scheduled_flow.client_id) if scheduled_flow.creator not in self.users: raise db.UnknownGRRUserError(scheduled_flow.creator) full_id = (scheduled_flow.client_id, scheduled_flow.creator, scheduled_flow.scheduled_flow_id) self.scheduled_flows[full_id] = scheduled_flow.Copy()