// AllModels allows controller administrators to get the list of all the // environments in the controller. func (s *ControllerAPI) AllModels() (params.UserModelList, error) { result := params.UserModelList{} if err := s.checkHasAdmin(); err != nil { return result, errors.Trace(err) } // Get all the environments that the authenticated user can see, and // supplement that with the other environments that exist that the user // cannot see. The reason we do this is to get the LastConnection time for // the environments that the user is able to see, so we have consistent // output when listing with or without --all when an admin user. environments, err := s.state.ModelsForUser(s.apiUser) if err != nil { return result, errors.Trace(err) } visibleEnvironments := set.NewStrings() for _, env := range environments { lastConn, err := env.LastConnection() if err != nil && !state.IsNeverConnectedError(err) { return result, errors.Trace(err) } visibleEnvironments.Add(env.UUID()) result.UserModels = append(result.UserModels, params.UserModel{ Model: params.Model{ Name: env.Name(), UUID: env.UUID(), OwnerTag: env.Owner().String(), }, LastConnection: &lastConn, }) } allEnvs, err := s.state.AllModels() if err != nil { return result, errors.Trace(err) } for _, env := range allEnvs { if !visibleEnvironments.Contains(env.UUID()) { result.UserModels = append(result.UserModels, params.UserModel{ Model: params.Model{ Name: env.Name(), UUID: env.UUID(), OwnerTag: env.Owner().String(), }, // No LastConnection as this user hasn't. }) } } // Sort the resulting sequence by environment name, then owner. sort.Sort(orderedUserModels(result.UserModels)) return result, nil }
// ListModels returns the models that the specified user // has access to in the current server. Only that controller owner // can list models for any user (at this stage). Other users // can only ask about their own models. func (em *ModelManagerAPI) ListModels(user params.Entity) (params.UserModelList, error) { result := params.UserModelList{} userTag, err := names.ParseUserTag(user.Tag) if err != nil { return result, errors.Trace(err) } err = em.authCheck(userTag) if err != nil { return result, errors.Trace(err) } models, err := em.state.ModelsForUser(userTag) if err != nil { return result, errors.Trace(err) } for _, model := range models { var lastConn *time.Time userLastConn, err := model.LastConnection() if err != nil { if !state.IsNeverConnectedError(err) { return result, errors.Trace(err) } } else { lastConn = &userLastConn } result.UserModels = append(result.UserModels, params.UserModel{ Model: params.Model{ Name: model.Name(), UUID: model.UUID(), OwnerTag: model.Owner().String(), }, LastConnection: lastConn, }) logger.Debugf("list models: %s, %s, %s", model.Name(), model.UUID(), model.Owner()) } return result, nil }