def TerminateFlow(client_id,
                  flow_id,
                  reason=None,
                  flow_state=rdf_flow_objects.Flow.FlowState.ERROR):
  """Terminates a flow and all of its children.

  Args:
    client_id: Client ID of a flow to terminate.
    flow_id: Flow ID of a flow to terminate.
    reason: String with a termination reason.
    flow_state: Flow state to be assigned to a flow after termination. Defaults
      to FlowState.ERROR.
  """

  to_terminate = [data_store.REL_DB.ReadFlowObject(client_id, flow_id)]

  while to_terminate:
    next_to_terminate = []
    for rdf_flow in to_terminate:
      _TerminateFlow(rdf_flow, reason=reason, flow_state=flow_state)
      next_to_terminate.extend(
          data_store.REL_DB.ReadChildFlowObjects(rdf_flow.client_id,
                                                 rdf_flow.flow_id))
    to_terminate = next_to_terminate
def TerminateFlow ( client_id , flow_id , reason = None , flow_state = rdf_flow_objects . Flow . FlowState . ERROR ) : to_terminate = [ data_store . REL_DB . ReadFlowObject ( client_id , flow_id ) ] while to_terminate : next_to_terminate = [ ] for rdf_flow in to_terminate : _TerminateFlow ( rdf_flow , reason = reason , flow_state = flow_state ) next_to_terminate . extend ( data_store . REL_DB . ReadChildFlowObjects ( rdf_flow . client_id , rdf_flow . flow_id ) ) to_terminate = next_to_terminate
Terminates a flow and all of its children.

  Args:
    client_id: Client ID of a flow to terminate.
    flow_id: Flow ID of a flow to terminate.
    reason: String with a termination reason.
    flow_state: Flow state to be assigned to a flow after termination. Defaults
      to FlowState.ERROR.