From 5f71a43758361e046d93fef1ab12c91dccce9223 Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Sat, 2 Dec 2017 19:28:38 +0100 Subject: [PATCH] refactor(eureka): rewrite configuration system. --- provider/eureka/config.go | 69 +++++++++++++++++++ .../eureka/{eureka_test.go => config_test.go} | 27 +++----- provider/eureka/eureka.go | 68 +----------------- 3 files changed, 81 insertions(+), 83 deletions(-) create mode 100644 provider/eureka/config.go rename provider/eureka/{eureka_test.go => config_test.go} (82%) diff --git a/provider/eureka/config.go b/provider/eureka/config.go new file mode 100644 index 000000000..933a19365 --- /dev/null +++ b/provider/eureka/config.go @@ -0,0 +1,69 @@ +package eureka + +import ( + "io/ioutil" + "strconv" + "text/template" + + "github.com/ArthurHlt/go-eureka-client/eureka" + "github.com/containous/traefik/log" + "github.com/containous/traefik/provider" + "github.com/containous/traefik/provider/label" + "github.com/containous/traefik/types" +) + +// Build the configuration from Provider server +func (p *Provider) buildConfiguration() (*types.Configuration, error) { + var EurekaFuncMap = template.FuncMap{ + "getPort": getPort, + "getProtocol": getProtocol, + "getWeight": getWeight, + "getInstanceID": getInstanceID, + } + + eureka.GetLogger().SetOutput(ioutil.Discard) + + client := eureka.NewClient([]string{ + p.Endpoint, + }) + + applications, err := client.GetApplications() + if err != nil { + return nil, err + } + + templateObjects := struct { + Applications []eureka.Application + }{ + applications.Applications, + } + + configuration, err := p.GetConfiguration("templates/eureka.tmpl", EurekaFuncMap, templateObjects) + if err != nil { + log.Error(err) + } + return configuration, nil +} + +func getInstanceID(instance eureka.InstanceInfo) string { + defaultID := provider.Normalize(instance.IpAddr) + "-" + getPort(instance) + return label.GetStringValue(instance.Metadata.Map, label.TraefikBackendID, defaultID) +} + +func getPort(instance eureka.InstanceInfo) string { + if instance.SecurePort.Enabled { + return strconv.Itoa(instance.SecurePort.Port) + } + return strconv.Itoa(instance.Port.Port) +} + +func getProtocol(instance eureka.InstanceInfo) string { + if instance.SecurePort.Enabled { + return "https" + } + return label.DefaultProtocol +} + +func getWeight(instance eureka.InstanceInfo) string { + return label.GetStringValue(instance.Metadata.Map, label.TraefikWeight, label.DefaultWeight) +} diff --git a/provider/eureka/eureka_test.go b/provider/eureka/config_test.go similarity index 82% rename from provider/eureka/eureka_test.go rename to provider/eureka/config_test.go index 80f718337..7d4d538fc 100644 --- a/provider/eureka/eureka_test.go +++ b/provider/eureka/config_test.go @@ -4,10 +4,10 @@ import ( "testing" "github.com/ArthurHlt/go-eureka-client/eureka" - "github.com/containous/traefik/types" + "github.com/containous/traefik/provider/label" ) -func TestEurekaGetPort(t *testing.T) { +func TestGetPort(t *testing.T) { cases := []struct { expectedPort string instanceInfo eureka.InstanceInfo @@ -36,16 +36,15 @@ func TestEurekaGetPort(t *testing.T) { }, } - eurekaProvider := &Provider{} for _, c := range cases { - port := eurekaProvider.getPort(c.instanceInfo) + port := getPort(c.instanceInfo) if port != c.expectedPort { t.Fatalf("Should have been %s, got %s", c.expectedPort, port) } } } -func TestEurekaGetProtocol(t *testing.T) { +func TestGetProtocol(t *testing.T) { cases := []struct { expectedProtocol string instanceInfo eureka.InstanceInfo @@ -73,17 +72,15 @@ func TestEurekaGetProtocol(t *testing.T) { }, }, } - - eurekaProvider := &Provider{} for _, c := range cases { - protocol := eurekaProvider.getProtocol(c.instanceInfo) + protocol := getProtocol(c.instanceInfo) if protocol != c.expectedProtocol { t.Fatalf("Should have been %s, got %s", c.expectedProtocol, protocol) } } } -func TestEurekaGetWeight(t *testing.T) { +func TestGetWeight(t *testing.T) { cases := []struct { expectedWeight string instanceInfo eureka.InstanceInfo @@ -107,23 +104,22 @@ func TestEurekaGetWeight(t *testing.T) { }, Metadata: &eureka.MetaData{ Map: map[string]string{ - types.LabelWeight: "10", + label.TraefikWeight: "10", }, }, }, }, } - eurekaProvider := &Provider{} for _, c := range cases { - weight := eurekaProvider.getWeight(c.instanceInfo) + weight := getWeight(c.instanceInfo) if weight != c.expectedWeight { t.Fatalf("Should have been %s, got %s", c.expectedWeight, weight) } } } -func TestEurekaGetInstanceId(t *testing.T) { +func TestGetInstanceId(t *testing.T) { cases := []struct { expectedID string instanceInfo eureka.InstanceInfo @@ -140,7 +136,7 @@ func TestEurekaGetInstanceId(t *testing.T) { }, Metadata: &eureka.MetaData{ Map: map[string]string{ - types.LabelBackendID: "MyInstanceId", + label.TraefikBackendID: "MyInstanceId", }, }, }, @@ -162,9 +158,8 @@ func TestEurekaGetInstanceId(t *testing.T) { }, } - eurekaProvider := &Provider{} for _, c := range cases { - id := eurekaProvider.getInstanceID(c.instanceInfo) + id := getInstanceID(c.instanceInfo) if id != c.expectedID { t.Fatalf("Should have been %s, got %s", c.expectedID, id) } diff --git a/provider/eureka/eureka.go b/provider/eureka/eureka.go index 0e00676ba..0329cf42b 100644 --- a/provider/eureka/eureka.go +++ b/provider/eureka/eureka.go @@ -1,13 +1,8 @@ package eureka import ( - "io/ioutil" - "strconv" - "strings" - "text/template" "time" - "github.com/ArthurHlt/go-eureka-client/eureka" "github.com/cenk/backoff" "github.com/containous/traefik/job" "github.com/containous/traefik/log" @@ -55,7 +50,7 @@ func (p *Provider) Provide(configurationChan chan<- types.ConfigMessage, pool *s safe.Go(func() { for t := range ticker.C { - log.Debug("Refreshing Provider " + t.String()) + log.Debugf("Refreshing Provider %s", t.String()) configuration, err := p.buildConfiguration() if err != nil { @@ -82,64 +77,3 @@ func (p *Provider) Provide(configurationChan chan<- types.ConfigMessage, pool *s } return nil } - -// Build the configuration from Provider server -func (p *Provider) buildConfiguration() (*types.Configuration, error) { - var EurekaFuncMap = template.FuncMap{ - "getPort": p.getPort, - "getProtocol": p.getProtocol, - "getWeight": p.getWeight, - "getInstanceID": p.getInstanceID, - } - - eureka.GetLogger().SetOutput(ioutil.Discard) - - client := eureka.NewClient([]string{ - p.Endpoint, - }) - - applications, err := client.GetApplications() - if err != nil { - return nil, err - } - - templateObjects := struct { - Applications []eureka.Application - }{ - applications.Applications, - } - - configuration, err := p.GetConfiguration("templates/eureka.tmpl", EurekaFuncMap, templateObjects) - if err != nil { - log.Error(err) - } - return configuration, nil -} - -func (p *Provider) getPort(instance eureka.InstanceInfo) string { - if instance.SecurePort.Enabled { - return strconv.Itoa(instance.SecurePort.Port) - } - return strconv.Itoa(instance.Port.Port) -} - -func (p *Provider) getProtocol(instance eureka.InstanceInfo) string { - if instance.SecurePort.Enabled { - return "https" - } - return "http" -} - -func (p *Provider) getWeight(instance eureka.InstanceInfo) string { - if val, ok := instance.Metadata.Map[types.LabelWeight]; ok { - return val - } - return "0" -} - -func (p *Provider) getInstanceID(instance eureka.InstanceInfo) string { - if val, ok := instance.Metadata.Map[types.LabelBackendID]; ok { - return val - } - return strings.Replace(instance.IpAddr, ".", "-", -1) + "-" + p.getPort(instance) -}