func commonConnect( apiOpen api.OpenFunc, apiInfo *api.Info, accountDetails *jujuclient.AccountDetails, modelUUID string, dialOpts api.DialOpts, ) (api.Connection, error) { if accountDetails != nil { // We only set the tag if either a password or // macaroon is found in the accounts.yaml file. // If neither is found, we'll use external // macaroon authentication which requires that // no tag be specified. userTag := names.NewUserTag(accountDetails.User) if accountDetails.Password != "" { // If a password is available, we always use // that. // // TODO(axw) make it invalid to store both // password and macaroon in accounts.yaml? apiInfo.Tag = userTag apiInfo.Password = accountDetails.Password } else if accountDetails.Macaroon != "" { var m macaroon.Macaroon if err := json.Unmarshal([]byte(accountDetails.Macaroon), &m); err != nil { return nil, errors.Trace(err) } apiInfo.Tag = userTag apiInfo.Macaroons = []macaroon.Slice{{&m}} } } if modelUUID != "" { apiInfo.ModelTag = names.NewModelTag(modelUUID) } st, err := apiOpen(apiInfo, dialOpts) return st, errors.Trace(err) }