diff --git a/app/tree.go b/app/tree.go index b418bcb..3927539 100644 --- a/app/tree.go +++ b/app/tree.go @@ -19,7 +19,7 @@ func (a *Application) viewTree() *tview.TreeView { func (a *Application) renderTree() { root := tview.NewTreeNode("∎") - for _, credType := range credhub.CredentialTypes { + for _, credType := range credhub.CredentialTypeValues() { credentials := a.state.Credentials( state.TypeFilter(credType), state.SelfSignedFilter(), @@ -29,7 +29,7 @@ func (a *Application) renderTree() { continue } - typeNode := tview.NewTreeNode(string(credType)).Collapse() + typeNode := tview.NewTreeNode(credType.String()).Collapse() root.AddChild(typeNode) for _, credential := range credentials { diff --git a/cmd/flags.go b/cmd/flags.go new file mode 100644 index 0000000..4037fad --- /dev/null +++ b/cmd/flags.go @@ -0,0 +1,46 @@ +package cmd + +import ( + "github.com/spf13/pflag" + ccredhub "github.com/starkandwayne/carousel/credhub" + . "github.com/starkandwayne/carousel/state" +) + +type credentialFilters struct { + deployments []string + types []string + expiresWithin string +} + +var filters = credentialFilters{ + deployments: make([]string, 0), + expiresWithin: "", + types: make([]string, 0), +} + +func (f credentialFilters) Filters() []Filter { + out := make([]Filter, 0) + if len(f.deployments) != 0 { + out = append(out, DeploymentFilter(f.deployments...)) + } + if len(f.types) != 0 { + types := make([]ccredhub.CredentialType, 0) + for _, t := range f.types { + ct, err := ccredhub.CredentialTypeString(t) + if err != nil { + logger.Fatalf("Invalid credential type: %s got: %s", t, err) + } + types = append(types, ct) + } + out = append(out, TypeFilter(types...)) + } + return out +} + +func addFilterFlags(set *pflag.FlagSet) { + set.StringSliceVarP(&filters.types, "types", "t", ccredhub.CredentialTypeStringValues(), + "filter by credential type (comma sperated)") + set.StringSliceVarP(&filters.deployments, "deployments", "d", nil, + "filter by deployment names (comma sperated)") + +} diff --git a/cmd/list.go b/cmd/list.go index 17055fe..0edce1f 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -25,18 +25,15 @@ import ( // listCmd represents the list command var listCmd = &cobra.Command{ Use: "list", - Short: "A brief description of your command", - Long: `A longer description that spans multiple lines and likely contains examples -and usage of using your command. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, + Short: "Display a list of credentials", + Long: `List CredHub credentials augmented with information from the BOSH director: +* update_mode: looked up from runtime configs and deployment manifest 'variables:' sections +* deployments: list of deployment names which use this version of the credential`, Run: func(cmd *cobra.Command, args []string) { initialize() refresh() - out, err := json.Marshal(state.Credentials()) + out, err := json.Marshal(state.Credentials(filters.Filters()...)) if err != nil { logger.Fatalf("failed to mashal: %s", err) } @@ -47,14 +44,5 @@ to quickly create a Cobra application.`, func init() { rootCmd.AddCommand(listCmd) - - // Here you will define your flags and configuration settings. - - // Cobra supports Persistent Flags which will work for this command - // and all subcommands, e.g.: - // listCmd.PersistentFlags().String("foo", "", "A help for foo") - - // Cobra supports local flags which will only run when this command - // is called directly, e.g.: - // listCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") + addFilterFlags(listCmd.Flags()) } diff --git a/credhub/credentialtype_enumer.go b/credhub/credentialtype_enumer.go new file mode 100644 index 0000000..23a65bc --- /dev/null +++ b/credhub/credentialtype_enumer.go @@ -0,0 +1,73 @@ +// Code generated by "enumer -type=CredentialType -json -transform=snake"; DO NOT EDIT. + +// +package credhub + +import ( + "encoding/json" + "fmt" +) + +const _CredentialTypeName = "certificatesshrsapassworduservaluejson" + +var _CredentialTypeIndex = [...]uint8{0, 11, 14, 17, 25, 29, 34, 38} + +func (i CredentialType) String() string { + if i < 0 || i >= CredentialType(len(_CredentialTypeIndex)-1) { + return fmt.Sprintf("CredentialType(%d)", i) + } + return _CredentialTypeName[_CredentialTypeIndex[i]:_CredentialTypeIndex[i+1]] +} + +var _CredentialTypeValues = []CredentialType{0, 1, 2, 3, 4, 5, 6} + +var _CredentialTypeNameToValueMap = map[string]CredentialType{ + _CredentialTypeName[0:11]: 0, + _CredentialTypeName[11:14]: 1, + _CredentialTypeName[14:17]: 2, + _CredentialTypeName[17:25]: 3, + _CredentialTypeName[25:29]: 4, + _CredentialTypeName[29:34]: 5, + _CredentialTypeName[34:38]: 6, +} + +// CredentialTypeString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func CredentialTypeString(s string) (CredentialType, error) { + if val, ok := _CredentialTypeNameToValueMap[s]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to CredentialType values", s) +} + +// CredentialTypeValues returns all values of the enum +func CredentialTypeValues() []CredentialType { + return _CredentialTypeValues +} + +// IsACredentialType returns "true" if the value is listed in the enum definition. "false" otherwise +func (i CredentialType) IsACredentialType() bool { + for _, v := range _CredentialTypeValues { + if i == v { + return true + } + } + return false +} + +// MarshalJSON implements the json.Marshaler interface for CredentialType +func (i CredentialType) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for CredentialType +func (i *CredentialType) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return fmt.Errorf("CredentialType should be a string, got %s", data) + } + + var err error + *i, err = CredentialTypeString(s) + return err +} diff --git a/credhub/credhub.go b/credhub/credhub.go index 538f43d..0a7886b 100644 --- a/credhub/credhub.go +++ b/credhub/credhub.go @@ -82,11 +82,10 @@ func (ch *credhub) UpdateTransitional(c *Credential) error { func (ch *credhub) getAllVersions(path string) ([]*Credential, error) { resp, err := ch.client.Request(http.MethodGet, "/api/v1/data", url.Values{"name": []string{path}}, nil, true) - defer resp.Body.Close() - if err != nil { return nil, fmt.Errorf("failed request got: %s", err) } + defer resp.Body.Close() result := struct { Data []*Credential `json:"data"` diff --git a/credhub/types.go b/credhub/types.go index 5bb9a3b..e50ab38 100644 --- a/credhub/types.go +++ b/credhub/types.go @@ -7,15 +7,27 @@ import ( "time" ) -type CredentialType string +// +//go:generate go run github.com/alvaroloes/enumer -type=CredentialType -json -transform=snake + +type CredentialType int const ( - Certificate, SSH, RSA, Password, User, Value, JSON CredentialType = "certificate", - "ssh", "rsa", "password", "user", "value", "json" + Certificate CredentialType = iota + SSH + RSA + Password + User + Value + JSON ) -var CredentialTypes = []CredentialType{ - Certificate, SSH, RSA, Password, User, Value, JSON, +func CredentialTypeStringValues() []string { + out := make([]string, 0) + for _, c := range CredentialTypeValues() { + out = append(out, c.String()) + } + return out } type Credential struct { diff --git a/go.mod b/go.mod index 37b2da9..19dc83e 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,11 @@ require ( code.cloudfoundry.org/clock v1.0.0 // indirect code.cloudfoundry.org/credhub-cli v0.0.0-20210201140144-df587bb71e95 code.cloudfoundry.org/tlsconfig v0.0.0-20200131000646-bbe0f8da39b3 // indirect + github.com/alvaroloes/enumer v1.1.2 // indirect github.com/cloudfoundry/bosh-cli v6.4.1+incompatible github.com/cloudfoundry/bosh-utils v0.0.0-20210130100352-ab14c90ad9f2 github.com/cppforlife/go-semi-semantic v0.0.0-20160921010311-576b6af77ae4 // indirect + github.com/diegommm/tools v0.0.0-20200615184803-3999d51ad988 // indirect github.com/dustin/go-humanize v1.0.0 github.com/emirpasic/gods v1.12.0 github.com/gdamore/tcell/v2 v2.1.0 @@ -21,6 +23,7 @@ require ( github.com/pivotal-cf/paraphernalia v0.0.0-20180203224945-a64ae2051c20 // indirect github.com/rivo/tview v0.0.0-20201215042513-a8048787f0c8 github.com/spf13/cobra v1.1.3 + github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.0 github.com/tedsuo/ifrit v0.0.0-20191009134036-9a97d0632f00 // indirect gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index 8b8582f..97137a8 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= +github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -61,6 +63,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/diegommm/tools v0.0.0-20200615184803-3999d51ad988 h1:/WTsN6sF46E8/ZqEiFm4LaVvuo+vtQMm9REp+31uZ8M= +github.com/diegommm/tools v0.0.0-20200615184803-3999d51ad988/go.mod h1:t3WG9U2dFVTYkY69rGu2JKawOdHzE/5bcwz2GLLSg0g= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= @@ -218,6 +222,8 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U= github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= +github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pivotal-cf/paraphernalia v0.0.0-20180203224945-a64ae2051c20 h1:DR5eMfe2+6GzLkVyWytdtgUxgbPiOfvKDuqityTV3y8= @@ -281,6 +287,7 @@ github.com/tedsuo/ifrit v0.0.0-20191009134036-9a97d0632f00/go.mod h1:eyZnKCc955u github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/urfave/cli v1.21.0/go.mod h1:lxDj6qX9Q6lWQxIrbrT0nwecwUtRnhVZAJjJZrVUZZQ= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -293,6 +300,7 @@ golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -314,6 +322,9 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -329,6 +340,7 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= @@ -336,11 +348,13 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/review v0.0.0-20200515044942-a2b90d2f6e29/go.mod h1:Lde/Je62VzQK/kgLx+EC/D1nPfgc3yUMsw44MI8TBPA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -394,14 +408,20 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200612220849-54c614fe050c h1:g6oFfz6Cmw68izP3xsdud3Oxu145IPkeFzyRg58AKHM= +golang.org/x/tools v0.0.0-20200612220849-54c614fe050c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/state/credentials.go b/state/credentials.go index 4b79d1a..87bbda2 100644 --- a/state/credentials.go +++ b/state/credentials.go @@ -1,6 +1,6 @@ package state -func (s *state) Credentials(filters ...filter) []*Credential { +func (s *state) Credentials(filters ...Filter) []*Credential { certs := s.credentials.Select(func(_, v interface{}) bool { for _, fn := range filters { if !fn(v.(*Credential)) { diff --git a/state/filters.go b/state/filters.go index 37df6b5..65f3f7f 100644 --- a/state/filters.go +++ b/state/filters.go @@ -4,28 +4,40 @@ import ( "github.com/starkandwayne/carousel/credhub" ) -type filter func(*Credential) bool +type Filter func(*Credential) bool -func SelfSignedFilter() filter { +func SelfSignedFilter() Filter { return func(c *Credential) bool { return c.SignedBy == nil } } -func LatestFilter() filter { +func LatestFilter() Filter { return func(c *Credential) bool { return c.Latest } } -func TypeFilter(types ...credhub.CredentialType) filter { +func TypeFilter(types ...credhub.CredentialType) Filter { return func(c *Credential) bool { - match := false for _, t := range types { if c.Type == t { - match = true + return true } } - return match + return false + } +} + +func DeploymentFilter(deployments ...string) Filter { + return func(c *Credential) bool { + for _, name := range deployments { + for _, d := range c.Deployments { + if d.Name == name { + return true + } + } + } + return false } } diff --git a/state/state.go b/state/state.go index c6c480a..549c4c9 100644 --- a/state/state.go +++ b/state/state.go @@ -9,7 +9,7 @@ import ( type State interface { Update([]*credhub.Credential, []*bosh.Variable) error - Credentials(...filter) []*Credential + Credentials(...Filter) []*Credential } func NewState() State { diff --git a/state/types.go b/state/types.go index a4986af..2b4a812 100644 --- a/state/types.go +++ b/state/types.go @@ -39,6 +39,7 @@ func (c *Credential) MarshalJSON() ([]byte, error) { updateMode = c.Path.VariableDefinition.UpdateMode } + c.RawValue = nil // don't leak raw value type Alias Credential return json.Marshal(&struct { *Alias diff --git a/tools/tools.go b/tools/tools.go new file mode 100644 index 0000000..f69e63a --- /dev/null +++ b/tools/tools.go @@ -0,0 +1,8 @@ +// +build tools + +package tools + +import ( + _ "github.com/alvaroloes/enumer" + _ "github.com/maxbrunsfeld/counterfeiter/v6" +)