// ModelInfo returns information about the current model. func (c *Client) ModelInfo() (params.ModelInfo, error) { if err := c.checkCanWrite(); err != nil { return params.ModelInfo{}, err } state := c.api.stateAccessor conf, err := state.ModelConfig() if err != nil { return params.ModelInfo{}, err } model, err := state.Model() if err != nil { return params.ModelInfo{}, err } info := params.ModelInfo{ DefaultSeries: config.PreferredSeries(conf), CloudTag: names.NewCloudTag(model.Cloud()).String(), CloudRegion: model.CloudRegion(), ProviderType: conf.Type(), Name: conf.Name(), UUID: model.UUID(), OwnerTag: model.Owner().String(), Life: params.Life(model.Life().String()), } if tag, ok := model.CloudCredential(); ok { info.CloudCredentialTag = tag.String() } return info, nil }
func (m *ModelManagerAPI) getModelInfo(tag names.ModelTag) (params.ModelInfo, error) { st, err := m.state.ForModel(tag) if errors.IsNotFound(err) { return params.ModelInfo{}, common.ErrPerm } else if err != nil { return params.ModelInfo{}, errors.Trace(err) } defer st.Close() model, err := st.Model() if errors.IsNotFound(err) { return params.ModelInfo{}, common.ErrPerm } else if err != nil { return params.ModelInfo{}, errors.Trace(err) } cfg, err := model.Config() if err != nil { return params.ModelInfo{}, errors.Trace(err) } controllerCfg, err := st.ControllerConfig() if err != nil { return params.ModelInfo{}, errors.Trace(err) } users, err := model.Users() if err != nil { return params.ModelInfo{}, errors.Trace(err) } status, err := model.Status() if err != nil { return params.ModelInfo{}, errors.Trace(err) } owner := model.Owner() info := params.ModelInfo{ Name: cfg.Name(), UUID: cfg.UUID(), ControllerUUID: controllerCfg.ControllerUUID(), OwnerTag: owner.String(), Life: params.Life(model.Life().String()), Status: common.EntityStatusFromState(status), ProviderType: cfg.Type(), DefaultSeries: config.PreferredSeries(cfg), CloudTag: names.NewCloudTag(model.Cloud()).String(), CloudRegion: model.CloudRegion(), } if cloudCredentialTag, ok := model.CloudCredential(); ok { info.CloudCredentialTag = cloudCredentialTag.String() } authorizedOwner := m.authCheck(owner) == nil for _, user := range users { if !authorizedOwner && m.authCheck(user.UserTag) != nil { // The authenticated user is neither the owner // nor administrator, nor the model user, so // has no business knowing about the model user. continue } userInfo, err := common.ModelUserInfo(user, st) if err != nil { return params.ModelInfo{}, errors.Trace(err) } info.Users = append(info.Users, userInfo) } if len(info.Users) == 0 { // No users, which means the authenticated user doesn't // have access to the model. return params.ModelInfo{}, common.ErrPerm } canSeeMachines := authorizedOwner if !canSeeMachines { if canSeeMachines, err = m.hasWriteAccess(tag); err != nil { return params.ModelInfo{}, errors.Trace(err) } } if canSeeMachines { if info.Machines, err = common.ModelMachineInfo(st); err != nil { return params.ModelInfo{}, err } } return info, nil }