github.com/koron/hk@v0.0.0-20150303213137-b8aeaa3ab34c/drains.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "text/tabwriter" 8 9 "github.com/heroku/hk/Godeps/_workspace/src/github.com/bgentry/heroku-go" 10 ) 11 12 var cmdDrains = &Command{ 13 Run: runDrains, 14 Usage: "drains", 15 NeedsApp: true, 16 Category: "app", 17 Short: "list log drains" + extra, 18 Long: ` 19 Lists log drains on an app. Shows the drain's ID, as well as its 20 Add-on name (if it's from an Add-on) or its URL. 21 22 Example: 23 24 $ hk drains 25 6af8b744-c513-4217-9f7c-1234567890ab logging-addon:jumbo 26 7f89b6bb-08af-4343-b0b4-d0415dd81712 syslog://my.log.host 27 23fcdb8a-3095-46f5-abc2-c5f293c54cf1 syslog://my.other.log.host 28 `, 29 } 30 31 func runDrains(cmd *Command, args []string) { 32 if len(args) != 0 { 33 cmd.PrintUsage() 34 os.Exit(2) 35 } 36 appname := mustApp() 37 38 // fetch app's addons concurrently in case we need to resolve addon names 39 addonsch := make(chan []heroku.Addon, 1) 40 errch := make(chan error, 1) 41 go func(appname string) { 42 if addons, err := client.AddonList(appname, nil); err != nil { 43 errch <- err 44 } else { 45 addonsch <- addons 46 } 47 }(appname) 48 49 drains, err := client.LogDrainList(appname, nil) 50 must(err) 51 52 hasAddonDrains := false 53 merged := make([]*mergedLogDrain, len(drains)) 54 for i := range drains { 55 if !hasAddonDrains && drains[i].Addon != nil { 56 hasAddonDrains = true 57 } 58 merged[i] = &mergedLogDrain{drain: drains[i], hasAddon: drains[i].Addon != nil} 59 } 60 61 if hasAddonDrains { 62 // resolve addon names, use those instead of URLs 63 select { 64 case _ = <-errch: 65 // couldn't resolve addons, just move on 66 case addons := <-addonsch: 67 mergeDrainAddonInfo(merged, addons) 68 } 69 } 70 71 w := tabwriter.NewWriter(os.Stdout, 1, 2, 2, ' ', 0) 72 defer w.Flush() 73 74 for _, m := range merged { 75 listRec(w, m.drain.Id, m.addonNameOrURL()) 76 } 77 } 78 79 type mergedLogDrain struct { 80 drain heroku.LogDrain 81 hasAddon bool 82 addon *heroku.Addon 83 } 84 85 func (m *mergedLogDrain) addonNameOrURL() string { 86 switch { 87 case m.hasAddon && m.addon != nil: 88 return m.addon.Plan.Name 89 case m.hasAddon: 90 return "unknown" 91 default: 92 return m.drain.URL 93 } 94 } 95 96 // merge addon info into log drains 97 func mergeDrainAddonInfo(merged []*mergedLogDrain, addons []heroku.Addon) { 98 for i := range merged { 99 if merged[i].hasAddon { 100 for j := range addons { 101 if merged[i].drain.Addon.Id == addons[j].Id { 102 merged[i].addon = &addons[j] 103 break 104 } 105 } 106 } 107 } 108 } 109 110 var cmdDrainInfo = &Command{ 111 Run: runDrainInfo, 112 Usage: "drain-info <id or url>", 113 NeedsApp: true, 114 Category: "app", 115 Short: "show info for a log drain" + extra, 116 Long: ` 117 Shows detailed info for a log drain. 118 119 Example: 120 121 $ hk drain-info syslog://my.other.log.host 122 Id: 7f89b6bb-08af-4343-b0b4-d0415dd81712 123 Token: d.a9dc787f-e0a8-43f3-a2c8-1fbf937fd47c 124 Addon: none 125 URL: syslog://my.log.host 126 127 $ hk drain-info 23fcdb8a-3095-46f5-abc2-c5f293c54cf1 128 ... 129 `, 130 } 131 132 func runDrainInfo(cmd *Command, args []string) { 133 if len(args) != 1 { 134 cmd.PrintUsage() 135 os.Exit(2) 136 } 137 appname := mustApp() 138 drainIdOrURL := args[0] 139 drain, err := client.LogDrainInfo(appname, drainIdOrURL) 140 must(err) 141 142 addonName := "none" 143 if drain.Addon != nil { 144 addon, err := client.AddonInfo(appname, drain.Addon.Id) 145 if err != nil { 146 addonName = "unknown" 147 } else { 148 addonName = addon.Name 149 } 150 } 151 152 fmt.Printf("Id: %s\n", drain.Id) 153 fmt.Printf("Token: %s\n", drain.Token) 154 fmt.Printf("Addon: %s\n", addonName) 155 fmt.Printf("URL: %s\n", drain.URL) 156 } 157 158 var cmdDrainAdd = &Command{ 159 Run: runDrainAdd, 160 Usage: "drain-add <url>", 161 NeedsApp: true, 162 Category: "app", 163 Short: "add a log drain" + extra, 164 Long: ` 165 Adds a log drain to an app. 166 167 Example: 168 169 $ hk drain-add syslog://my.log.host 170 Added log drain to myapp. 171 `, 172 } 173 174 func runDrainAdd(cmd *Command, args []string) { 175 if len(args) != 1 { 176 cmd.PrintUsage() 177 os.Exit(2) 178 } 179 180 url := args[0] 181 _, err := client.LogDrainCreate(mustApp(), url) 182 must(err) 183 log.Printf("Added log drain to %s.", mustApp()) 184 } 185 186 var cmdDrainRemove = &Command{ 187 Run: runDrainRemove, 188 Usage: "drain-remove <id or url>", 189 NeedsApp: true, 190 Category: "app", 191 Short: "remove a log drain" + extra, 192 Long: ` 193 Removes a log drain from an app. 194 195 Example: 196 197 $ hk drain-remove 7f89b6bb-08af-4343-b0b4-d0415dd81712 198 Removed log drain from myapp. 199 200 $ hk drain-remove syslog://my.log.host 201 Removed log drain from myapp. 202 `, 203 } 204 205 func runDrainRemove(cmd *Command, args []string) { 206 if len(args) != 1 { 207 cmd.PrintUsage() 208 os.Exit(2) 209 } 210 211 drainId := args[0] 212 must(client.LogDrainDelete(mustApp(), drainId)) 213 log.Printf("Removed log drain from %s.", mustApp()) 214 }