// processUnitAndAgentStatus retrieves status information for both unit and unitAgents. func processUnitAndAgentStatus(unit *state.Unit, status *api.UnitStatus) { status.UnitAgent, status.Workload = processUnitStatus(unit) // Legacy fields required until Juju 2.0. // We only display pending, started, error, stopped. var ok bool legacyState, ok := state.TranslateToLegacyAgentState( state.Status(status.UnitAgent.Status), state.Status(status.Workload.Status), status.Workload.Info, ) if !ok { logger.Warningf( "translate to legacy status encounted unexpected workload status %q and agent status %q", status.Workload.Status, status.UnitAgent.Status) } status.AgentState = params.Status(legacyState) if status.AgentState == params.StatusError { status.AgentStateInfo = status.Workload.Info } status.AgentVersion = status.UnitAgent.Version status.Life = status.UnitAgent.Life status.Err = status.UnitAgent.Err processUnitLost(unit, status) return }
func (context *statusContext) processUnit(unit *state.Unit, serviceCharm string) api.UnitStatus { var result api.UnitStatus result.PublicAddress, _ = unit.PublicAddress() unitPorts, _ := unit.OpenedPorts() for _, port := range unitPorts { result.OpenedPorts = append(result.OpenedPorts, port.String()) } if unit.IsPrincipal() { result.Machine, _ = unit.AssignedMachineId() } curl, _ := unit.CharmURL() if serviceCharm != "" && curl != nil && curl.String() != serviceCharm { result.Charm = curl.String() } processUnitAndAgentStatus(unit, &result) if subUnits := unit.SubordinateNames(); len(subUnits) > 0 { result.Subordinates = make(map[string]api.UnitStatus) for _, name := range subUnits { subUnit := context.unitByName(name) // subUnit may be nil if subordinate was filtered out. if subUnit != nil { result.Subordinates[name] = context.processUnit(subUnit, serviceCharm) } } } return result }
func (sf *statusFormatter) updateUnitStatusInfo(unit *api.UnitStatus, serviceName string) { // This logic has no business here but can't be moved until Juju 2.0. statusInfo := unit.Workload.Info if unit.Workload.Status == "" { // Old server that doesn't support this field and others. // Just use the info string as-is. statusInfo = unit.AgentStateInfo } if unit.Workload.Status == params.StatusError { if relation, ok := sf.relations[getRelationIdFromData(unit)]; ok { // Append the details of the other endpoint on to the status info string. if ep, ok := findOtherEndpoint(relation.Endpoints, serviceName); ok { unit.Workload.Info = statusInfo + " for " + ep.String() unit.AgentStateInfo = unit.Workload.Info } } } }