influx-cli/config/config.go
Jeffrey Smith II f34e6a888f
feat: add username and password login (#418)
* feat: add username and password login

* fix: make sure cookie is not empty

* chore: go mod tidy

* fix: prevent local config from influencing tests

* fix: small cleanup on error handling

* fix: remove unnecessary trim
2022-07-28 10:53:19 -04:00

94 lines
2.2 KiB
Go

package config
import (
"fmt"
"os"
"os/user"
"path/filepath"
"github.com/influxdata/influx-cli/v2/api"
)
// Config store the crendentials of influxdb host and token.
type Config struct {
Name string `toml:"-" json:"-"`
Host string `toml:"url" json:"url"`
// Token is base64 encoded sequence.
Token string `toml:"token" json:"token"`
Org string `toml:"org" json:"org"`
Active bool `toml:"active,omitempty" json:"active,omitempty"`
PreviousActive bool `toml:"previous,omitempty" json:"previous,omitempty"`
Cookie string `toml:"cookie,omitempty" json:"cookie,omitempty"`
}
// DefaultConfig is default config without token
var DefaultConfig = Config{
Name: "default",
Host: "http://localhost:8086",
Active: true,
}
// DefaultPath computes the path where CLI configs will be stored if not overridden.
func DefaultPath() (string, error) {
var dir string
// By default, store meta and data files in current users home directory
u, err := user.Current()
if err == nil {
dir = u.HomeDir
} else if home := os.Getenv("HOME"); home != "" {
dir = home
} else {
wd, err := os.Getwd()
if err != nil {
return "", err
}
dir = wd
}
dir = filepath.Join(dir, ".influxdbv2", "configs")
return dir, nil
}
// Service is the service to list and write configs.
type Service interface {
CreateConfig(Config) (Config, error)
DeleteConfig(name string) (Config, error)
UpdateConfig(Config) (Config, error)
SwitchActive(name string) (Config, error)
Active() (Config, error)
ListConfigs() (Configs, error)
}
// Configs is map of configs indexed by name.
type Configs map[string]Config
// Switch to another config.
func (cfgs Configs) switchActive(name string) error {
if _, ok := cfgs[name]; !ok {
return &api.Error{
Code: api.ERRORCODE_NOT_FOUND,
Message: api.PtrString(fmt.Sprintf("config %q is not found", name)),
}
}
for k, v := range cfgs {
v.PreviousActive = v.Active && (k != name)
v.Active = k == name
cfgs[k] = v
}
return nil
}
func (cfgs Configs) active() Config {
for _, cfg := range cfgs {
if cfg.Active {
return cfg
}
}
if len(cfgs) > 0 {
for _, cfg := range cfgs {
return cfg
}
}
return DefaultConfig
}