From 75e05ca14282d3e7462e80fea07e6c5c32b0080e Mon Sep 17 00:00:00 2001 From: Foivos Filippopoulos <35731697+ffilippopoulos@users.noreply.github.com> Date: Tue, 29 Jan 2019 15:46:09 +0000 Subject: [PATCH] Check for dynamic tls updates on configuration preload --- provider/file/file.go | 22 ++++++++++++++++++++-- provider/file/file_test.go | 22 ++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/provider/file/file.go b/provider/file/file.go index 1fccce96e..522fc801e 100644 --- a/provider/file/file.go +++ b/provider/file/file.go @@ -181,11 +181,29 @@ func (p *Provider) loadFileConfig(filename string, parseTemplate bool) (*config. } else { configuration, err = p.DecodeConfiguration(fileContent) } - if err != nil { return nil, err } + var tlsConfigs []*tls.Configuration + for _, conf := range configuration.TLS { + bytes, err := conf.Certificate.CertFile.Read() + if err != nil { + log.Error(err) + continue + } + conf.Certificate.CertFile = tls.FileOrContent(string(bytes)) + + bytes, err = conf.Certificate.KeyFile.Read() + if err != nil { + log.Error(err) + continue + } + conf.Certificate.KeyFile = tls.FileOrContent(string(bytes)) + tlsConfigs = append(tlsConfigs, conf) + } + configuration.TLS = tlsConfigs + if configuration == nil || configuration.Routers == nil && configuration.Middlewares == nil && configuration.Services == nil && configuration.TLS == nil { configuration = &config.Configuration{ Routers: make(map[string]*config.Router), @@ -193,7 +211,7 @@ func (p *Provider) loadFileConfig(filename string, parseTemplate bool) (*config. Services: make(map[string]*config.Service), } } - return configuration, err + return configuration, nil } func (p *Provider) loadFileConfigFromDirectory(ctx context.Context, directory string, configuration *config.Configuration) (*config.Configuration, error) { diff --git a/provider/file/file_test.go b/provider/file/file_test.go index c38eb61ea..7f002654c 100644 --- a/provider/file/file_test.go +++ b/provider/file/file_test.go @@ -12,6 +12,7 @@ import ( "github.com/containous/traefik/config" "github.com/containous/traefik/safe" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type ProvideTestCase struct { @@ -336,3 +337,24 @@ func createTLS(n int) string { } return conf } + +func TestTLSContent(t *testing.T) { + tempDir := createTempDir(t, "testdir") + defer os.Remove(tempDir) + + fileTLS := createRandomFile(t, tempDir, "CONTENT") + fileConfig := createRandomFile(t, tempDir, ` +[[tls]] +entryPoints = ["https"] + [tls.certificate] + certFile = "`+fileTLS.Name()+`" + keyFile = "`+fileTLS.Name()+`" +`) + + provider := &Provider{} + configuration, err := provider.loadFileConfig(fileConfig.Name(), true) + require.NoError(t, err) + + require.Equal(t, "CONTENT", configuration.TLS[0].Certificate.CertFile.String()) + require.Equal(t, "CONTENT", configuration.TLS[0].Certificate.KeyFile.String()) +}