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  }