github.com/kubeshop/testkube@v1.17.23/cmd/kubectl-testkube/config/storage.go (about)

     1  package config
     2  
     3  import (
     4  	"encoding/json"
     5  	"os"
     6  	"path"
     7  
     8  	"github.com/kubeshop/testkube/pkg/oauth"
     9  )
    10  
    11  const (
    12  	APIServerName               string = "testkube-api-server"
    13  	APIServerPort               int    = 8088
    14  	DashboardName               string = "testkube-dashboard"
    15  	DashboardPort               int    = 8080
    16  	EnterpriseUiName            string = "testkube-enterprise-ui"
    17  	EnterpriseUiPort            int    = 8080
    18  	EnterpriseApiName           string = "testkube-enterprise-api"
    19  	EnterpriseApiPort           int    = 8088
    20  	EnterpriseApiForwardingPort int    = 8090
    21  	EnterpriseDexName           string = "testkube-enterprise-dex"
    22  	EnterpriseDexPort           int    = 5556
    23  	EnterpriseDexForwardingPort int    = 5556
    24  
    25  	configDirName = ".testkube"
    26  	configFile    = "config.json"
    27  )
    28  
    29  var DefaultConfig = Data{
    30  	TelemetryEnabled: true,
    31  	Namespace:        "testkube",
    32  	APIURI:           "http://localhost:8088",
    33  	APIServerName:    APIServerName,
    34  	APIServerPort:    APIServerPort,
    35  	DashboardName:    DashboardName,
    36  	DashboardPort:    DashboardPort,
    37  	OAuth2Data: OAuth2Data{
    38  		Provider: oauth.GithubProviderType,
    39  	},
    40  }
    41  
    42  func GetStorage(dir string) (Storage, error) {
    43  	storage := Storage{Dir: dir}
    44  	err := storage.Init()
    45  	return storage, err
    46  }
    47  
    48  type Storage struct {
    49  	Dir string
    50  }
    51  
    52  func (c *Storage) Load() (data Data, err error) {
    53  	path, err := c.getPath()
    54  	if err != nil {
    55  		return data, err
    56  	}
    57  	d, err := os.ReadFile(path)
    58  	if err != nil {
    59  		return data, err
    60  	}
    61  	err = json.Unmarshal(d, &data)
    62  	return data, err
    63  }
    64  
    65  func (c *Storage) Save(data Data) error {
    66  	d, err := json.Marshal(data)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	path, err := c.getPath()
    71  	if err != nil {
    72  		return err
    73  	}
    74  	return os.WriteFile(path, d, 0700)
    75  }
    76  
    77  func (c *Storage) Init() error {
    78  	var defaultConfig = DefaultConfig
    79  	// create ConfigWriter dir if not exists
    80  	dir, err := c.getDir()
    81  	if err != nil {
    82  		return err
    83  	}
    84  	_, err = os.Stat(dir)
    85  	if os.IsNotExist(err) {
    86  		err := os.Mkdir(dir, 0700)
    87  		if err != nil {
    88  			return err
    89  		}
    90  	} else if err != nil {
    91  		return err
    92  	}
    93  
    94  	// create empty JSON file if not exists
    95  	path, err := c.getPath()
    96  	if err != nil {
    97  		return err
    98  	}
    99  	_, err = os.Stat(path)
   100  	if os.IsNotExist(err) {
   101  		f, err := os.Create(path)
   102  		if err != nil {
   103  			return err
   104  		}
   105  		f.Close()
   106  
   107  		return c.Save(defaultConfig)
   108  	} else if err != nil {
   109  		return err
   110  	}
   111  
   112  	return nil
   113  }
   114  
   115  func (c *Storage) getDir() (string, error) {
   116  	var err error
   117  	var dir string
   118  	if c.Dir != "" {
   119  		dir = c.Dir
   120  	} else {
   121  		dir, err = os.UserHomeDir()
   122  		if err != nil {
   123  			return "", err
   124  		}
   125  	}
   126  
   127  	return path.Join(dir, configDirName), nil
   128  }
   129  
   130  func (c *Storage) getPath() (string, error) {
   131  	dir, err := c.getDir()
   132  	if err != nil {
   133  		return "", err
   134  	}
   135  	return path.Join(dir, configFile), nil
   136  }