github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/tags.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/drycc/controller-sdk-go/api" 8 "github.com/drycc/controller-sdk-go/config" 9 ) 10 11 // TagsList lists an app's tags. 12 func (d *DryccCmd) TagsList(appID string) error { 13 s, appID, err := load(d.ConfigFile, appID) 14 15 if err != nil { 16 return err 17 } 18 19 config, err := config.List(s.Client, appID) 20 if d.checkAPICompatibility(s.Client, err) != nil { 21 return err 22 } 23 if len(config.Tags) == 0 { 24 d.Println(fmt.Sprintf("No tags found in %s app.", appID)) 25 } else { 26 table := d.getDefaultFormatTable([]string{"UUID", "OWNER", "PTYPE", "TAG"}) 27 for _, key := range *sortKeys(config.Tags) { 28 table.Append([]string{ 29 config.UUID, 30 config.Owner, 31 key, 32 fmt.Sprintf("%v", config.Tags[key]), 33 }) 34 } 35 table.Render() 36 } 37 return nil 38 } 39 40 // TagsSet sets an app's tags. 41 func (d *DryccCmd) TagsSet(appID string, tags []string) error { 42 s, appID, err := load(d.ConfigFile, appID) 43 44 if err != nil { 45 return err 46 } 47 48 tagsMap, err := parseTags(tags) 49 if err != nil { 50 return err 51 } 52 53 d.Print("Applying tags... ") 54 55 quit := progress(d.WOut) 56 configObj := api.Config{} 57 configObj.Tags = tagsMap 58 59 _, err = config.Set(s.Client, appID, configObj) 60 quit <- true 61 <-quit 62 if d.checkAPICompatibility(s.Client, err) != nil { 63 return err 64 } 65 66 d.Print("done\n\n") 67 68 return d.TagsList(appID) 69 } 70 71 // TagsUnset removes an app's tags. 72 func (d *DryccCmd) TagsUnset(appID string, tags []string) error { 73 s, appID, err := load(d.ConfigFile, appID) 74 75 if err != nil { 76 return err 77 } 78 79 d.Print("Applying tags... ") 80 81 quit := progress(d.WOut) 82 83 configObj := api.Config{} 84 85 tagsMap := make(map[string]interface{}) 86 87 for _, tag := range tags { 88 tagsMap[tag] = nil 89 } 90 91 configObj.Tags = tagsMap 92 93 _, err = config.Set(s.Client, appID, configObj) 94 quit <- true 95 <-quit 96 if d.checkAPICompatibility(s.Client, err) != nil { 97 return err 98 } 99 100 d.Print("done\n\n") 101 102 return d.TagsList(appID) 103 } 104 105 func parseTags(tags []string) (map[string]interface{}, error) { 106 tagMap := make(map[string]interface{}) 107 108 for _, tag := range tags { 109 key, value, err := parseTag(tag) 110 111 if err != nil { 112 return nil, err 113 } 114 115 tagMap[key] = value 116 } 117 118 return tagMap, nil 119 } 120 121 func parseTag(tag string) (string, string, error) { 122 parts := strings.Split(tag, "=") 123 124 if len(parts) != 2 || parts[0] == "" || parts[1] == "" { 125 return "", "", fmt.Errorf(`%s is invalid, Must be in format key=value 126 Examples: rack=1 evironment=production`, tag) 127 } 128 129 return parts[0], parts[1], nil 130 }