...

Source file src/edge-infra.dev/pkg/edge/edgecli/config.go

Documentation: edge-infra.dev/pkg/edge/edgecli

     1  package edgecli
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"os"
     7  	"strings"
     8  
     9  	"gopkg.in/yaml.v2"
    10  )
    11  
    12  type Config struct {
    13  	CurrentBannerContext  string                     `yaml:"currentBannerContext"`
    14  	CurrentClusterContext string                     `yaml:"currentClusterContext"`
    15  	BannerContexts        map[string]*BannerContext  `yaml:"bannerContexts"`
    16  	ClusterContexts       map[string]*ClusterContext `yaml:"clusterContexts"`
    17  }
    18  
    19  type BannerContext struct {
    20  	BannerEdgeID string `yaml:"bannerEdgeID"`
    21  	BannerName   string `yaml:"bannerName"`
    22  	TenantOrg    string `yaml:"tenantOrg"`
    23  	Username     string `yaml:"username"`
    24  	Endpoint     string `yaml:"endpoint"`
    25  	Token        string `yaml:"token"`
    26  	TokenTime    string `yaml:"tokenTime"`
    27  }
    28  
    29  type ClusterContext struct {
    30  	ClusterEdgeID string `yaml:"clusterEdgeID"`
    31  }
    32  
    33  const edgeDir = "/.edge"
    34  
    35  // ReadConfig reads from the .edge file to return an edgecli Config
    36  func ReadConfig() (*Config, error) {
    37  	home, err := os.UserHomeDir()
    38  	if err != nil {
    39  		return &Config{}, err
    40  	}
    41  
    42  	// creating .edge file if it does not already exist
    43  	edgeData, err := os.ReadFile(home + edgeDir)
    44  	if err != nil {
    45  		fmt.Println("Config file does not exist. Adding a .edge file to " + home)
    46  		_, err = os.Create(home + edgeDir)
    47  		if err != nil {
    48  			return &Config{}, fmt.Errorf(".edge could not be created in %s: %w", home, err)
    49  		}
    50  		edgeData, err = os.ReadFile(home + edgeDir)
    51  		if err != nil {
    52  			return &Config{}, fmt.Errorf(".edge file could not be read: %w", err)
    53  		}
    54  	}
    55  
    56  	var config Config
    57  	err = yaml.Unmarshal(edgeData, &config)
    58  	if err != nil {
    59  		log.Fatal(err)
    60  	}
    61  	return &config, nil
    62  }
    63  
    64  // WriteConfig overwrites the .edge file with provided edgecli Config.
    65  func WriteConfig(cfg *Config) error {
    66  	home, err := os.UserHomeDir()
    67  	if err != nil {
    68  		return err
    69  	}
    70  
    71  	// creating .edge file if it does not already exist
    72  	_, err = os.ReadFile(home + edgeDir)
    73  	if err != nil {
    74  		fmt.Println("Config file does not exist. Adding a .edge file to " + home)
    75  		_, err = os.Create(home + edgeDir)
    76  		if err != nil {
    77  			return fmt.Errorf(".edge could not be created in %s: %w", home, err)
    78  		}
    79  	}
    80  
    81  	if err := os.Truncate(home+edgeDir, 0); err != nil {
    82  		return err
    83  	}
    84  
    85  	data, err := yaml.Marshal(cfg)
    86  	if err != nil {
    87  		return fmt.Errorf("Could not marshall the config data: %w", err)
    88  	}
    89  
    90  	if err = os.WriteFile(home+edgeDir, data, 0644); err != nil {
    91  		return fmt.Errorf("Could not write to edge file: %w", err)
    92  	}
    93  
    94  	return nil
    95  }
    96  
    97  func (cfg *Config) CurrentBanner() *BannerContext {
    98  	banner := cfg.BannerContexts[cfg.CurrentBannerContext]
    99  	if banner == nil {
   100  		return &BannerContext{}
   101  	}
   102  	return banner
   103  }
   104  
   105  func (cfg *Config) CurrentCluster() *ClusterContext {
   106  	cluster := cfg.ClusterContexts[cfg.CurrentClusterContext]
   107  	if cluster == nil {
   108  		return &ClusterContext{}
   109  	}
   110  	return cluster
   111  }
   112  
   113  // AddBanner adds new banner to config, returns it, and writes to .edge.
   114  func (cfg *Config) AddBanner(name, bannerEdgeID, bannerName, username, tenantOrg, endpoint, token, tokenTime string) (*BannerContext, error) {
   115  	if cfg.BannerContexts == nil {
   116  		cfg.BannerContexts = make(map[string]*BannerContext)
   117  	}
   118  	if bannerEdgeID == "" {
   119  		return nil, fmt.Errorf("No Banner Edge ID provided")
   120  	}
   121  	if name == "" {
   122  		return nil, fmt.Errorf("No banner context name provided")
   123  	}
   124  
   125  	if _, exists := cfg.BannerContexts[name]; exists {
   126  		return nil, fmt.Errorf("Banner context named %s already exists", name)
   127  	}
   128  	cfg.BannerContexts[name] = &BannerContext{
   129  		BannerEdgeID: bannerEdgeID,
   130  		BannerName:   bannerName,
   131  		Username:     username,
   132  		TenantOrg:    tenantOrg,
   133  		Endpoint:     endpoint,
   134  		Token:        token,
   135  		TokenTime:    tokenTime,
   136  	}
   137  	// write config back to .edge file
   138  	if err := WriteConfig(cfg); err != nil {
   139  		return nil, err
   140  	}
   141  	return cfg.BannerContexts[name], nil
   142  }
   143  
   144  // AddCluster adds new cluster to config, returns it, and writes to .edge.
   145  func (cfg *Config) AddCluster(name, clusterEdgeID string) (*ClusterContext, error) {
   146  	if cfg.ClusterContexts == nil {
   147  		cfg.ClusterContexts = make(map[string]*ClusterContext)
   148  	}
   149  	if clusterEdgeID == "" {
   150  		return nil, fmt.Errorf("No Cluster Edge ID provided")
   151  	}
   152  	if name == "" {
   153  		name = clusterEdgeID
   154  	}
   155  	if _, exists := cfg.ClusterContexts[name]; exists {
   156  		return nil, fmt.Errorf("Cluster context named %s already exists", name)
   157  	}
   158  	cfg.ClusterContexts[name] = &ClusterContext{
   159  		ClusterEdgeID: clusterEdgeID,
   160  	}
   161  	// write config back to .edge file
   162  	if err := WriteConfig(cfg); err != nil {
   163  		return nil, err
   164  	}
   165  	return cfg.ClusterContexts[name], nil
   166  }
   167  func (cfg *Config) UpdateBanner(name, bannerEdgeID, bannerName, username, tenantOrg, endpoint, token string) error {
   168  	editingBanner, ok := cfg.BannerContexts[name]
   169  	if !ok {
   170  		return fmt.Errorf("Banner '%v' does not exist", name)
   171  	}
   172  
   173  	if bannerEdgeID != "" {
   174  		editingBanner.BannerEdgeID = bannerEdgeID
   175  	}
   176  	if bannerName != "" {
   177  		editingBanner.BannerName = bannerName
   178  	}
   179  	if username != "" {
   180  		editingBanner.Username = username
   181  	}
   182  	if tenantOrg != "" {
   183  		editingBanner.TenantOrg = tenantOrg
   184  	}
   185  	if endpoint != "" {
   186  		editingBanner.Endpoint = endpoint
   187  	}
   188  	if token != "" {
   189  		editingBanner.Token = token
   190  	}
   191  
   192  	return WriteConfig(cfg)
   193  }
   194  
   195  // UpdateCluster adds new cluster to config, returns it, and writes to .edge
   196  func (cfg *Config) UpdateCluster(name, clusterEdgeID string) error {
   197  	editingCluster, ok := cfg.ClusterContexts[name]
   198  	if !ok {
   199  		return fmt.Errorf("Cluster '%v' does not exist", name)
   200  	}
   201  
   202  	if clusterEdgeID != "" {
   203  		editingCluster.ClusterEdgeID = clusterEdgeID
   204  	}
   205  
   206  	return WriteConfig(cfg)
   207  }
   208  
   209  func (cfg *Config) SetBanner(name string) error {
   210  	if _, ok := cfg.BannerContexts[name]; ok {
   211  		cfg.CurrentBannerContext = name
   212  	} else {
   213  		return fmt.Errorf("Banner '%v' does not exist", name)
   214  	}
   215  
   216  	if err := WriteConfig(cfg); err != nil {
   217  		return fmt.Errorf("Error writing to .edge file")
   218  	}
   219  
   220  	return nil
   221  }
   222  
   223  func (cfg *Config) SetCluster(name string) error {
   224  	if _, ok := cfg.ClusterContexts[name]; ok {
   225  		cfg.CurrentClusterContext = name
   226  	} else {
   227  		return fmt.Errorf("Cluster '%v' does not exist", name)
   228  	}
   229  
   230  	if err := WriteConfig(cfg); err != nil {
   231  		return fmt.Errorf("Error writing to .edge file")
   232  	}
   233  
   234  	return nil
   235  }
   236  
   237  func (cfg *Config) DeleteBanner(name string) error {
   238  	if _, ok := cfg.BannerContexts[name]; ok {
   239  		if cfg.CurrentBannerContext == name {
   240  			cfg.CurrentBannerContext = ""
   241  		}
   242  		delete(cfg.BannerContexts, name)
   243  	} else {
   244  		return fmt.Errorf("Banner '%v' does not exist", name)
   245  	}
   246  	return WriteConfig(cfg)
   247  }
   248  
   249  func (cfg *Config) DeleteCluster(name string) error {
   250  	if _, ok := cfg.ClusterContexts[name]; ok {
   251  		if cfg.CurrentClusterContext == name {
   252  			cfg.CurrentClusterContext = ""
   253  		}
   254  		delete(cfg.ClusterContexts, name)
   255  	} else {
   256  		return fmt.Errorf("Cluster '%v' does not exist", name)
   257  	}
   258  	return WriteConfig(cfg)
   259  }
   260  
   261  func (cfg *Config) CurrentString() string {
   262  	var b strings.Builder
   263  	fmt.Fprint(&b, "CURRENT CONTEXT\n")
   264  	fmt.Fprint(&b, "  Banner:  "+cfg.CurrentBannerContext+"\n")
   265  	fmt.Fprint(&b, "  Cluster: "+cfg.CurrentClusterContext+"\n")
   266  
   267  	return b.String()
   268  }
   269  
   270  func (cfg *Config) BannerContextsString(verbose bool) string {
   271  	var b strings.Builder
   272  	fmt.Fprint(&b, "BANNER CONTEXTS\n")
   273  	for bk := range cfg.BannerContexts {
   274  		if verbose {
   275  			fmt.Fprint(&b, "------\n")
   276  			fmt.Fprint(&b, cfg.BannerString(bk))
   277  		} else {
   278  			fmt.Fprintf(&b, "  %s\n", bk)
   279  		}
   280  	}
   281  
   282  	return b.String()
   283  }
   284  
   285  func (cfg *Config) ClusterContextsString(verbose bool) string {
   286  	var b strings.Builder
   287  	fmt.Fprint(&b, "CLUSTER CONTEXTS\n")
   288  	for ck := range cfg.ClusterContexts {
   289  		if verbose {
   290  			fmt.Fprint(&b, "------\n")
   291  			fmt.Fprint(&b, cfg.ClusterString(ck))
   292  		} else {
   293  			fmt.Fprintf(&b, "  %s\n", ck)
   294  		}
   295  	}
   296  
   297  	return b.String()
   298  }
   299  
   300  func (cfg *Config) BannerString(name string) string {
   301  	banner, exists := cfg.BannerContexts[name]
   302  	if !exists {
   303  		return ""
   304  	}
   305  
   306  	var b strings.Builder
   307  	fmt.Fprintf(&b, "  Name:       %s\n", name)
   308  	if banner.BannerEdgeID != "" {
   309  		fmt.Fprintf(&b, "  EdgeId:     %s\n", banner.BannerEdgeID)
   310  	}
   311  	if banner.TenantOrg != "" {
   312  		fmt.Fprintf(&b, "  Tenant Org: %s\n", banner.TenantOrg)
   313  	}
   314  	if banner.Username != "" {
   315  		fmt.Fprintf(&b, "  Username:   %s\n", banner.Username)
   316  	}
   317  	if banner.Token != "" {
   318  		fmt.Fprintf(&b, "  Token:      %s\n", banner.Token)
   319  	}
   320  	if banner.TokenTime != "" {
   321  		fmt.Fprintf(&b, "  Token Time: %s\n", banner.TokenTime)
   322  	}
   323  
   324  	return b.String()
   325  }
   326  
   327  func (cfg *Config) ClusterString(name string) string {
   328  	cluster, exists := cfg.ClusterContexts[name]
   329  	if !exists {
   330  		return ""
   331  	}
   332  
   333  	var b strings.Builder
   334  	fmt.Fprintf(&b, "  Name:       %s\n", name)
   335  	fmt.Fprintf(&b, "  EdgeId:     %s\n", cluster.ClusterEdgeID)
   336  
   337  	return b.String()
   338  }
   339  

View as plain text