cmd/dex: add config options for gRPC

This commit is contained in:
Eric Chiang 2016-10-04 00:27:50 -07:00
parent 8b079168be
commit 4550b95dfd
3 changed files with 45 additions and 6 deletions

View File

@ -22,6 +22,7 @@ type Config struct {
Connectors []Connector `yaml:"connectors"` Connectors []Connector `yaml:"connectors"`
Web Web `yaml:"web"` Web Web `yaml:"web"`
OAuth2 OAuth2 `yaml:"oauth2"` OAuth2 OAuth2 `yaml:"oauth2"`
GRPC GRPC `yaml:"grpc"`
Templates server.TemplateConfig `yaml:"templates"` Templates server.TemplateConfig `yaml:"templates"`
@ -41,6 +42,14 @@ type Web struct {
TLSKey string `yaml:"tlsKey"` TLSKey string `yaml:"tlsKey"`
} }
// GRPC is the config for the gRPC API.
type GRPC struct {
// The port to listen on.
Addr string `yaml:"addr"`
TLSCert string `yaml:"tlsCert"`
TLSKey string `yaml:"tlsKey"`
}
// Storage holds app's storage configuration. // Storage holds app's storage configuration.
type Storage struct { type Storage struct {
Type string `yaml:"type"` Type string `yaml:"type"`

View File

@ -1 +0,0 @@
package main

View File

@ -5,11 +5,15 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log" "log"
"net"
"net/http" "net/http"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
yaml "gopkg.in/yaml.v2" yaml "gopkg.in/yaml.v2"
"github.com/coreos/dex/api"
"github.com/coreos/dex/server" "github.com/coreos/dex/server"
"github.com/coreos/dex/storage" "github.com/coreos/dex/storage"
) )
@ -19,7 +23,7 @@ func commandServe() *cobra.Command {
Use: "serve [ config file ]", Use: "serve [ config file ]",
Short: "Connect to the storage and begin serving requests.", Short: "Connect to the storage and begin serving requests.",
Long: ``, Long: ``,
Example: "dex serve c.yaml", Example: "dex serve config.yaml",
RunE: serve, RunE: serve,
} }
} }
@ -56,6 +60,9 @@ func serve(cmd *cobra.Command, args []string) error {
{c.Web.HTTP == "" && c.Web.HTTPS == "", "must supply a HTTP/HTTPS address to listen on"}, {c.Web.HTTP == "" && c.Web.HTTPS == "", "must supply a HTTP/HTTPS address to listen on"},
{c.Web.HTTPS != "" && c.Web.TLSCert == "", "no cert specified for HTTPS"}, {c.Web.HTTPS != "" && c.Web.TLSCert == "", "no cert specified for HTTPS"},
{c.Web.HTTPS != "" && c.Web.TLSKey == "", "no private key specified for HTTPS"}, {c.Web.HTTPS != "" && c.Web.TLSKey == "", "no private key specified for HTTPS"},
{c.GRPC.TLSCert != "" && c.GRPC.Addr == "", "no address specified for gRPC"},
{c.GRPC.TLSKey != "" && c.GRPC.Addr == "", "no address specified for gRPC"},
{(c.GRPC.TLSCert == "") != (c.GRPC.TLSKey == ""), "must specific both a gRPC TLS cert and key"},
} }
for _, check := range checks { for _, check := range checks {
@ -64,6 +71,15 @@ func serve(cmd *cobra.Command, args []string) error {
} }
} }
var grpcOptions []grpc.ServerOption
if c.GRPC.TLSCert != "" {
opt, err := credentials.NewServerTLSFromFile(c.GRPC.TLSCert, c.GRPC.TLSKey)
if err != nil {
return fmt.Errorf("load grpc certs: %v", err)
}
grpcOptions = append(grpcOptions, grpc.Creds(opt))
}
connectors := make([]server.Connector, len(c.Connectors)) connectors := make([]server.Connector, len(c.Connectors))
for i, conn := range c.Connectors { for i, conn := range c.Connectors {
if conn.Config == nil { if conn.Config == nil {
@ -96,22 +112,37 @@ func serve(cmd *cobra.Command, args []string) error {
TemplateConfig: c.Templates, TemplateConfig: c.Templates,
} }
serv, err := server.New(serverConfig) serv, err := server.NewServer(serverConfig)
if err != nil { if err != nil {
return fmt.Errorf("initializing server: %v", err) return fmt.Errorf("initializing server: %v", err)
} }
errc := make(chan error, 2) errc := make(chan error, 3)
if c.Web.HTTP != "" { if c.Web.HTTP != "" {
log.Printf("listening (http) on %s", c.Web.HTTP)
go func() { go func() {
log.Printf("listening on %s", c.Web.HTTP)
errc <- http.ListenAndServe(c.Web.HTTP, serv) errc <- http.ListenAndServe(c.Web.HTTP, serv)
}() }()
} }
if c.Web.HTTPS != "" { if c.Web.HTTPS != "" {
log.Printf("listening (https) on %s", c.Web.HTTPS)
go func() { go func() {
log.Printf("listening on %s", c.Web.HTTPS)
errc <- http.ListenAndServeTLS(c.Web.HTTPS, c.Web.TLSCert, c.Web.TLSKey, serv) errc <- http.ListenAndServeTLS(c.Web.HTTPS, c.Web.TLSCert, c.Web.TLSKey, serv)
}() }()
} }
if c.GRPC.Addr != "" {
log.Printf("listening (grpc) on %s", c.GRPC.Addr)
go func() {
errc <- func() error {
list, err := net.Listen("tcp", c.GRPC.Addr)
if err != nil {
return fmt.Errorf("listen grpc: %v", err)
}
s := grpc.NewServer(grpcOptions...)
api.RegisterDexServer(s, server.NewAPI(serverConfig.Storage))
return s.Serve(list)
}()
}()
}
return <-errc return <-errc
} }