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
36 func ReadConfig() (*Config, error) {
37 home, err := os.UserHomeDir()
38 if err != nil {
39 return &Config{}, err
40 }
41
42
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
65 func WriteConfig(cfg *Config) error {
66 home, err := os.UserHomeDir()
67 if err != nil {
68 return err
69 }
70
71
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
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
138 if err := WriteConfig(cfg); err != nil {
139 return nil, err
140 }
141 return cfg.BannerContexts[name], nil
142 }
143
144
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
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
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