// ListEnvironments returns the environments that the specified user // has access to in the current server. Only that state server owner // can list environments for any user (at this stage). Other users // can only ask about their own environments. func (em *EnvironmentManagerAPI) ListEnvironments(user params.Entity) (params.UserEnvironmentList, error) { result := params.UserEnvironmentList{} 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) } environments, err := em.state.EnvironmentsForUser(userTag) if err != nil { return result, errors.Trace(err) } for _, env := range environments { result.UserEnvironments = append(result.UserEnvironments, params.UserEnvironment{ Environment: params.Environment{ Name: env.Name(), UUID: env.UUID(), OwnerTag: env.Owner().String(), }, LastConnection: env.LastConnection, }) logger.Debugf("list env: %s, %s, %s", env.Name(), env.UUID(), env.Owner()) } return result, nil }
// AllEnvironments allows controller administrators to get the list of all the // environments in the controller. func (s *ControllerAPI) AllEnvironments() (params.UserEnvironmentList, error) { result := params.UserEnvironmentList{} // 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.EnvironmentsForUser(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.UserEnvironments = append(result.UserEnvironments, params.UserEnvironment{ Environment: params.Environment{ Name: env.Name(), UUID: env.UUID(), OwnerTag: env.Owner().String(), }, LastConnection: &lastConn, }) } allEnvs, err := s.state.AllEnvironments() if err != nil { return result, errors.Trace(err) } for _, env := range allEnvs { if !visibleEnvironments.Contains(env.UUID()) { result.UserEnvironments = append(result.UserEnvironments, params.UserEnvironment{ Environment: params.Environment{ 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(orderedUserEnvironments(result.UserEnvironments)) return result, nil }