diff --git a/provider/provider.go b/provider/provider.go index b06511b6e..90287fe40 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -11,6 +11,7 @@ import ( "crypto/x509" "fmt" "github.com/BurntSushi/toml" + log "github.com/Sirupsen/logrus" "github.com/containous/traefik/autogen" "github.com/containous/traefik/safe" "github.com/containous/traefik/types" @@ -109,6 +110,10 @@ type ClientTLS struct { // CreateTLSConfig creates a TLS config from ClientTLS structures func (clientTLS *ClientTLS) CreateTLSConfig() (*tls.Config, error) { var err error + if clientTLS == nil { + log.Warnf("clientTLS is nil") + return nil, nil + } caPool := x509.NewCertPool() if clientTLS.CA != "" { var ca []byte diff --git a/provider/provider_test.go b/provider/provider_test.go index 7b7e487d9..d14d971a1 100644 --- a/provider/provider_test.go +++ b/provider/provider_test.go @@ -12,6 +12,7 @@ import ( type myProvider struct { BaseProvider + TLS *ClientTLS } func (p *myProvider) Foo() string { @@ -54,6 +55,7 @@ func TestConfigurationErrors(t *testing.T) { BaseProvider{ Filename: "/non/existent/template.tmpl", }, + nil, }, expectedError: "open /non/existent/template.tmpl: no such file or directory", }, @@ -67,6 +69,7 @@ func TestConfigurationErrors(t *testing.T) { BaseProvider{ Filename: templateErrorFile.Name(), }, + nil, }, expectedError: `function "Bar" not defined`, }, @@ -75,6 +78,7 @@ func TestConfigurationErrors(t *testing.T) { BaseProvider{ Filename: templateInvalidTOMLFile.Name(), }, + nil, }, expectedError: "Near line 1 (last key parsed 'Hello'): Expected key separator '=', but got '<' instead", funcMap: template.FuncMap{ @@ -130,6 +134,7 @@ func TestGetConfiguration(t *testing.T) { BaseProvider{ Filename: templateFile.Name(), }, + nil, } configuration, err := provider.getConfiguration(templateFile.Name(), nil, nil) if err != nil { @@ -191,6 +196,7 @@ func TestGetConfigurationReturnsCorrectMaxConnConfiguration(t *testing.T) { BaseProvider{ Filename: templateFile.Name(), }, + nil, } configuration, err := provider.getConfiguration(templateFile.Name(), nil, nil) if err != nil { @@ -209,6 +215,19 @@ func TestGetConfigurationReturnsCorrectMaxConnConfiguration(t *testing.T) { } } +func TestNilClientTLS(t *testing.T) { + provider := &myProvider{ + BaseProvider{ + Filename: "", + }, + nil, + } + _, err := provider.TLS.CreateTLSConfig() + if err != nil { + t.Fatalf("CreateTLSConfig should assume that consumer does not want a TLS configuration if input is nil") + } +} + func TestMatchingConstraints(t *testing.T) { cases := []struct { constraints []types.Constraint @@ -298,10 +317,11 @@ func TestMatchingConstraints(t *testing.T) { BaseProvider{ Constraints: c.constraints, }, + nil, } actual, _ := provider.MatchConstraints(c.tags) if actual != c.expected { - t.Fatalf("test #%v: expected %q, got %q, for %q", i, c.expected, actual, c.constraints) + t.Fatalf("test #%v: expected %t, got %t, for %#v", i, c.expected, actual, c.constraints) } } }