Merge pull request #277 from ericchiang/cmd_stdin

*: allow dexctl set-connector-configs to read from stdin
This commit is contained in:
bobbyrullo 2016-01-19 09:34:33 -08:00
commit 67c1bd6aee
4 changed files with 39 additions and 28 deletions

View file

@ -2,6 +2,8 @@ package main
import ( import (
"fmt" "fmt"
"io"
"os"
"github.com/coreos/dex/connector" "github.com/coreos/dex/connector"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -18,8 +20,8 @@ var (
cmdSetConnectorConfigs = &cobra.Command{ cmdSetConnectorConfigs = &cobra.Command{
Use: "set-connector-configs", Use: "set-connector-configs",
Short: "Overwrite the current IdP connector configs with those from a local file.", Short: "Overwrite the current IdP connector configs with those from a local file. Provide the argument '-' to read from stdin.",
Long: "Overwrite the current IdP connector configs with those from a local file.", Long: "Overwrite the current IdP connector configs with those from a local file. Provide the argument '-' to read from stdin.",
Example: ` dexctl set-connector-configs --db-url=${DB_URL} ./static/conn_conf.json`, Example: ` dexctl set-connector-configs --db-url=${DB_URL} ./static/conn_conf.json`,
Run: wrapRun(runSetConnectorConfigs), Run: wrapRun(runSetConnectorConfigs),
} }
@ -36,15 +38,22 @@ func runSetConnectorConfigs(cmd *cobra.Command, args []string) int {
return 2 return 2
} }
rf, err := connector.NewConnectorConfigRepoFromFile(args[0]) var r io.Reader
if err != nil { if from := args[0]; from == "-" {
stderr("Unable to retrieve connector configs from file: %v", err) r = os.Stdin
return 1 } else {
f, err := os.Open(from)
if err != nil {
stderr("Unable to open specified file: %v", err)
return 1
}
defer f.Close()
r = f
} }
cfgs, err := rf.All() cfgs, err := connector.ReadConfigs(r)
if err != nil { if err != nil {
stderr("Unable to retrieve connector configs from file: %v", err) stderr("Unable to decode connector configs: %v", err)
return 1 return 1
} }
@ -54,7 +63,6 @@ func runSetConnectorConfigs(cmd *cobra.Command, args []string) int {
} }
fmt.Printf("Saved %d connector config(s)\n", len(cfgs)) fmt.Printf("Saved %d connector config(s)\n", len(cfgs))
return 0 return 0
} }

View file

@ -3,12 +3,11 @@ package connector
import ( import (
"encoding/json" "encoding/json"
"io" "io"
"os"
"github.com/coreos/dex/repo" "github.com/coreos/dex/repo"
) )
func newConnectorConfigsFromReader(r io.Reader) ([]ConnectorConfig, error) { func ReadConfigs(r io.Reader) ([]ConnectorConfig, error) {
var ms []map[string]interface{} var ms []map[string]interface{}
if err := json.NewDecoder(r).Decode(&ms); err != nil { if err := json.NewDecoder(r).Decode(&ms); err != nil {
return nil, err return nil, err
@ -24,21 +23,6 @@ func newConnectorConfigsFromReader(r io.Reader) ([]ConnectorConfig, error) {
return cfgs, nil return cfgs, nil
} }
func NewConnectorConfigRepoFromFile(loc string) (ConnectorConfigRepo, error) {
cf, err := os.Open(loc)
if err != nil {
return nil, err
}
defer cf.Close()
cfgs, err := newConnectorConfigsFromReader(cf)
if err != nil {
return nil, err
}
return &memConnectorConfigRepo{configs: cfgs}, nil
}
type memConnectorConfigRepo struct { type memConnectorConfigRepo struct {
configs []ConnectorConfig configs []ConnectorConfig
} }

View file

@ -1,6 +1,8 @@
package functional package functional
import ( import (
"bytes"
"io"
"io/ioutil" "io/ioutil"
"os" "os"
"os/exec" "os/exec"
@ -42,6 +44,7 @@ func TestDexctlCommands(t *testing.T) {
args []string args []string
env []string env []string
expErr bool expErr bool
stdin io.Reader
}{ }{
{ {
args: []string{"new-client", "https://example.com/callback"}, args: []string{"new-client", "https://example.com/callback"},
@ -57,10 +60,20 @@ func TestDexctlCommands(t *testing.T) {
{ {
args: []string{"set-connector-configs", "--db-url", dsn, connConfig}, args: []string{"set-connector-configs", "--db-url", dsn, connConfig},
}, },
{
args: []string{"set-connector-configs", "--db-url", dsn, "-"},
stdin: bytes.NewReader(connConfigExample),
},
{
args: []string{"set-connector-configs", "-"},
env: []string{"DEXCTL_DB_URL=" + dsn},
stdin: bytes.NewReader(connConfigExample),
},
} }
for _, tt := range tests { for _, tt := range tests {
cmd := exec.Command("../bin/dexctl", tt.args...) cmd := exec.Command("../bin/dexctl", tt.args...)
cmd.Stdin = tt.stdin
cmd.Env = tt.env cmd.Env = tt.env
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if !tt.expErr && err != nil { if !tt.expErr && err != nil {

View file

@ -115,10 +115,16 @@ func (cfg *SingleServerConfig) Configure(srv *Server) error {
return fmt.Errorf("unable to read client identities from file %s: %v", cfg.ClientsFile, err) return fmt.Errorf("unable to read client identities from file %s: %v", cfg.ClientsFile, err)
} }
cfgRepo, err := connector.NewConnectorConfigRepoFromFile(cfg.ConnectorsFile) f, err := os.Open(cfg.ConnectorsFile)
if err != nil { if err != nil {
return fmt.Errorf("unable to create ConnectorConfigRepo: %v", err) return fmt.Errorf("opening connectors file: %v", err)
} }
defer f.Close()
cfgs, err := connector.ReadConfigs(f)
if err != nil {
return fmt.Errorf("decoding connector configs: %v", err)
}
cfgRepo := connector.NewConnectorConfigRepoFromConfigs(cfgs)
sRepo := session.NewSessionRepo() sRepo := session.NewSessionRepo()
skRepo := session.NewSessionKeyRepo() skRepo := session.NewSessionKeyRepo()