func (context *statusContext) processService(service *state.Service) (status params.ServiceStatus) { serviceCharmURL, _ := service.CharmURL() status.Charm = serviceCharmURL.String() status.Exposed = service.IsExposed() status.Life = processLife(service) latestCharm, ok := context.latestCharms[*serviceCharmURL.WithRevision(-1)] if ok && latestCharm != serviceCharmURL.String() { status.CanUpgradeTo = latestCharm } var err error status.Relations, status.SubordinateTo, err = context.processServiceRelations(service) if err != nil { status.Err = err return } networks, err := service.Networks() if err != nil { status.Err = err return } var cons constraints.Value if service.IsPrincipal() { // Only principals can have constraints. cons, err = service.Constraints() if err != nil { status.Err = err return } } // TODO(dimitern): Drop support for this in a follow-up. if len(networks) > 0 || cons.HaveNetworks() { // Only the explicitly requested networks (using "juju deploy // <svc> --networks=...") will be enabled, and altough when // specified, networks constraints will be used for instance // selection, they won't be actually enabled. status.Networks = params.NetworksSpecification{ Enabled: networks, Disabled: append(cons.IncludeNetworks(), cons.ExcludeNetworks()...), } } if service.IsPrincipal() { status.Units = context.processUnits(context.units[service.Name()], serviceCharmURL.String()) serviceStatus, err := service.Status() if err != nil { status.Err = err return } status.Status.Status = params.Status(serviceStatus.Status) status.Status.Info = serviceStatus.Message status.Status.Data = serviceStatus.Data status.Status.Since = serviceStatus.Since status.MeterStatuses = context.processUnitMeterStatuses(context.units[service.Name()]) } return status }