// processMachine retrieves version and status information for the given machine. // It also returns deprecated legacy status information. func processMachine(machine *state.Machine) (out params.AgentStatus, compat params.AgentStatus) { out.Life = processLife(machine) if t, err := machine.AgentTools(); err == nil { out.Version = t.Version.Number.String() } populateStatusFromGetter(&out, machine) compat = out if out.Err != nil { return } if out.Status == params.StatusPending { // The status is pending - there's no point // in enquiring about the agent liveness. return } agentAlive, err := machine.AgentPresence() if err != nil { return } if machine.Life() != state.Dead && !agentAlive { // The agent *should* be alive but is not. Set status to // StatusDown and munge Info to indicate the previous status and // info. This is unfortunately making presentation decisions // on behalf of the client (crappy). // // This is munging is only being left in place for // compatibility with older clients. TODO: At some point we // should change this so that Info left alone. API version may // help here. // // Better yet, Status shouldn't be changed here in the API at // all! Status changes should only happen in State. One // problem caused by this is that this status change won't be // seen by clients using a watcher because it didn't happen in // State. if out.Info != "" { compat.Info = fmt.Sprintf("(%s: %s)", out.Status, out.Info) } else { compat.Info = fmt.Sprintf("(%s)", out.Status) } compat.Status = params.StatusDown } return }