Skip to content

Commit

Permalink
Bump to kingpin-v3
Browse files Browse the repository at this point in the history
  • Loading branch information
carlpett committed Dec 17, 2017
1 parent 6f7279c commit 056c8d9
Show file tree
Hide file tree
Showing 33 changed files with 5,722 additions and 67 deletions.
2 changes: 1 addition & 1 deletion cli/alert.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func flattenAlertOverview(overview []*alertGroup) []*dispatch.APIAlert {
return alerts
}

func queryAlerts(ctx *kingpin.ParseContext) error {
func queryAlerts(element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
var filterString = ""
if len(*alertQuery) == 1 {
// If we only have one argument then it's possible that the user wants me to assume alertname=<arg>
Expand Down
2 changes: 1 addition & 1 deletion cli/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func fetchConfig() (Config, error) {
return configResponse.Data, nil
}

func queryConfig(ctx *kingpin.ParseContext) error {
func queryConfig(element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
config, err := fetchConfig()
if err != nil {
return err
Expand Down
92 changes: 30 additions & 62 deletions cli/root.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package cli

import (
"fmt"
"io/ioutil"
"os"

Expand All @@ -17,74 +16,45 @@ var (
output = app.Flag("output", "Output formatter (simple, extended, json)").Default("simple").Enum("simple", "extended", "json")
)

func Load(s string) (map[string]interface{}, error) {
cfg := make(map[string]interface{})
err := yaml.Unmarshal([]byte(s), cfg)
if err != nil {
return nil, err
}
return cfg, nil
type amtoolConfigResolver struct {
configData []map[string]string
}

func LoadFile(filename string) (map[string]interface{}, error) {
content, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
cfg, err := Load(string(content))
if err != nil {
return nil, err
func newConfigResolver() amtoolConfigResolver {
files := []string{
os.ExpandEnv("$HOME/.config/amtool/config.yml"),
"/etc/amtool/config.yml",
}

return cfg, nil
}

func configToFlags(config map[string]interface{}) []string {
flags := []string{}
for k, v := range config {
flag := k
values := []string{}
switch value := v.(type) {
case bool:
if !value {
flag = "no-" + flag
}
flags = append(flags, "--"+flag)
continue
case string:
values = append(values, v.(string))
case float64:
values = append(values, fmt.Sprintf("%v", v))
case []string:
for _, e := range v.([]string) {
values = append(values, e)
resolver := amtoolConfigResolver{
configData: make([]map[string]string, 0),
}
for _, f := range files {
b, err := ioutil.ReadFile(f)
if err != nil {
if os.IsNotExist(err) {
continue
}
panic(err)
}

for _, value := range values {
flags = append(flags, "--"+flag+"="+value)
var config map[string]string
err = yaml.Unmarshal(b, &config)
if err != nil {
panic(err)
}
resolver.configData = append(resolver.configData, config)
}

return flags
return resolver
}

func getConfigFileFlags() []string {
files := []string{os.ExpandEnv("${HOME}/.config/amtool/config.yml"), "/etc/amtool/config.yml"}
for _, f := range files {
config, err := LoadFile(f)
if err != nil {
if os.IsNotExist(err) {
continue
} else {
fmt.Printf("Error reading config file %s: %s\nAttempting to continue without parsing.", f, err)
continue
}
} else {
return configToFlags(config)
func (r amtoolConfigResolver) Resolve(key string, context *kingpin.ParseContext) ([]string, error) {
for _, c := range r.configData {
if v, ok := c[key]; ok {
return []string{v}, nil
}
}
return []string{}
return nil, nil
}

/*
Expand Down Expand Up @@ -117,13 +87,11 @@ The accepted config options are as follows:
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
app.Version(version.Print("amtool"))
app.HelpFlag.Short('h')

flags := getConfigFileFlags()
flags = append(flags, os.Args[1:]...)
app.GetFlag("help").Short('h')

_, err := app.Parse(flags)
app.Resolver(newConfigResolver())
_, err := app.Parse(os.Args[1:])
if err != nil {
kingpin.FatalUsage("Error: %v\n", err)
kingpin.FatalUsage("%v\n", err)
}
}
2 changes: 1 addition & 1 deletion cli/silence_add.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ Add a new alertmanager silence
can be used in combination with a direct match.
*/

func add(ctx *kingpin.ParseContext) error {
func add(element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
var err error

matchers, err := parseMatchers(*addArgs)
Expand Down
2 changes: 1 addition & 1 deletion cli/silence_expire.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func init() {
expireCmd.Action(expire)
}

func expire(ctx *kingpin.ParseContext) error {
func expire(element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
if len(*expireIds) < 1 {
return errors.New("No silence IDs specified")
}
Expand Down
2 changes: 1 addition & 1 deletion cli/silence_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func fetchSilences(filter string) ([]types.Silence, error) {
return silenceResponse.Data, nil
}

func query(ctx *kingpin.ParseContext) error {
func query(element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
var filterString = ""
if len(*silenceQuery) == 1 {
// If we only have one argument then it's possible that the user wants me to assume alertname=<arg>
Expand Down
19 changes: 19 additions & 0 deletions vendor/github.com/alecthomas/kingpin/COPYING

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 056c8d9

Please sign in to comment.