Merge v1.0.1

Signed-off-by: Emile Vauge <emile@vauge.com>
This commit is contained in:
Emile Vauge 2016-07-28 19:32:12 +02:00
commit e62cca1e7c
No known key found for this signature in database
GPG key ID: D808B4C167352E59
13 changed files with 97 additions and 46 deletions

View file

@ -1,5 +1,32 @@
# Change Log # Change Log
## [v1.0.1](https://github.com/containous/traefik/tree/v1.0.1) (2016-07-19)
[Full Changelog](https://github.com/containous/traefik/compare/v1.0.0...v1.0.1)
**Implemented enhancements:**
- Error with -consulcatalog and missing load balance method on 1.0.0 [\#524](https://github.com/containous/traefik/issues/524)
- Kubernetes provider: should allow the master url to be override [\#501](https://github.com/containous/traefik/issues/501)
**Fixed bugs:**
- Flag --etcd.endpoint default [\#508](https://github.com/containous/traefik/issues/508)
- Conditional ACME on demand generation [\#505](https://github.com/containous/traefik/issues/505)
- Important delay with streams \(Mozilla EventSource\) [\#503](https://github.com/containous/traefik/issues/503)
**Closed issues:**
- Can I use Traefik without a domain name? [\#539](https://github.com/containous/traefik/issues/539)
- Priortities in 1.0.0 not behaving [\#506](https://github.com/containous/traefik/issues/506)
- Route by path [\#500](https://github.com/containous/traefik/issues/500)
**Merged pull requests:**
- Update server.go [\#531](https://github.com/containous/traefik/pull/531) ([Jsewill](https://github.com/Jsewill))
- Add sse support [\#527](https://github.com/containous/traefik/pull/527) ([emilevauge](https://github.com/emilevauge))
- Fix acme checkOnDemandDomain [\#512](https://github.com/containous/traefik/pull/512) ([emilevauge](https://github.com/emilevauge))
- Fix default etcd port [\#511](https://github.com/containous/traefik/pull/511) ([errm](https://github.com/errm))
## [v1.0.0](https://github.com/containous/traefik/tree/v1.0.0) (2016-07-05) ## [v1.0.0](https://github.com/containous/traefik/tree/v1.0.0) (2016-07-05)
[Full Changelog](https://github.com/containous/traefik/compare/v1.0.0-rc3...v1.0.0) [Full Changelog](https://github.com/containous/traefik/compare/v1.0.0-rc3...v1.0.0)

View file

@ -22,7 +22,7 @@ type TraefikConfiguration struct {
// GlobalConfiguration holds global configuration (with providers, etc.). // GlobalConfiguration holds global configuration (with providers, etc.).
// It's populated from the traefik configuration file passed as an argument to the binary. // It's populated from the traefik configuration file passed as an argument to the binary.
type GlobalConfiguration struct { type GlobalConfiguration struct {
GraceTimeOut int64 `short:"g" description:"Configuration file to use (TOML)."` GraceTimeOut int64 `short:"g" description:"Duration to give active requests a chance to finish during hot-reload"`
Debug bool `short:"d" description:"Enable debug mode"` Debug bool `short:"d" description:"Enable debug mode"`
AccessLogsFile string `description:"Access logs file"` AccessLogsFile string `description:"Access logs file"`
TraefikLogsFile string `description:"Traefik logs file"` TraefikLogsFile string `description:"Traefik logs file"`
@ -300,7 +300,7 @@ func NewTraefikDefaultPointersConfiguration() *TraefikConfiguration {
// default Etcd // default Etcd
var defaultEtcd provider.Etcd var defaultEtcd provider.Etcd
defaultEtcd.Watch = true defaultEtcd.Watch = true
defaultEtcd.Endpoint = "127.0.0.1:400" defaultEtcd.Endpoint = "127.0.0.1:2379"
defaultEtcd.Prefix = "/traefik" defaultEtcd.Prefix = "/traefik"
defaultEtcd.Constraints = []types.Constraint{} defaultEtcd.Constraints = []types.Constraint{}

View file

@ -97,24 +97,24 @@ Here is an example of frontends definition:
[frontends.frontend1] [frontends.frontend1]
backend = "backend2" backend = "backend2"
[frontends.frontend1.routes.test_1] [frontends.frontend1.routes.test_1]
rule = "Host: test.localhost, test2.localhost" rule = "Host:test.localhost,test2.localhost"
[frontends.frontend2] [frontends.frontend2]
backend = "backend1" backend = "backend1"
passHostHeader = true passHostHeader = true
priority = 10 priority = 10
entrypoints = ["https"] # overrides defaultEntryPoints entrypoints = ["https"] # overrides defaultEntryPoints
[frontends.frontend2.routes.test_1] [frontends.frontend2.routes.test_1]
rule = "Host: localhost, {subdomain:[a-z]+}.localhost" rule = "Host:localhost,{subdomain:[a-z]+}.localhost"
[frontends.frontend3] [frontends.frontend3]
backend = "backend2" backend = "backend2"
[frontends.frontend3.routes.test_1] [frontends.frontend3.routes.test_1]
rule = "Host: test3.localhost;Path:/test" rule = "Host:test3.localhost;Path:/test"
``` ```
- Three frontends are defined: `frontend1`, `frontend2` and `frontend3` - Three frontends are defined: `frontend1`, `frontend2` and `frontend3`
- `frontend1` will forward the traffic to the `backend2` if the rule `Host: test.localhost, test2.localhost` is matched - `frontend1` will forward the traffic to the `backend2` if the rule `Host:test.localhost,test2.localhost` is matched
- `frontend2` will forward the traffic to the `backend1` if the rule `Host: localhost, {subdomain:[a-z]+}.localhost` is matched (forwarding client `Host` header to the backend) - `frontend2` will forward the traffic to the `backend1` if the rule `Host:localhost,{subdomain:[a-z]+}.localhost` is matched (forwarding client `Host` header to the backend)
- `frontend3` will forward the traffic to the `backend2` if the rules `Host: test3.localhost` **and** `Path:/test` are matched - `frontend3` will forward the traffic to the `backend2` if the rules `Host:test3.localhost` **AND** `Path:/test` are matched
### Combining multiple rules ### Combining multiple rules
@ -125,19 +125,19 @@ In TOML file, you can use multiple routes:
[frontends.frontend3] [frontends.frontend3]
backend = "backend2" backend = "backend2"
[frontends.frontend3.routes.test_1] [frontends.frontend3.routes.test_1]
rule = "Host: test3.localhost" rule = "Host:test3.localhost"
[frontends.frontend3.routes.test_2] [frontends.frontend3.routes.test_2]
rule = "Host: Path:/test" rule = "Host:Path:/test"
``` ```
Here `frontend3` will forward the traffic to the `backend2` if the rules `Host: test3.localhost` **and** `Path:/test` are matched. Here `frontend3` will forward the traffic to the `backend2` if the rules `Host:test3.localhost` **AND** `Path:/test` are matched.
You can also use the notation using a `;` separator: You can also use the notation using a `;` separator, same result:
```toml ```toml
[frontends.frontend3] [frontends.frontend3]
backend = "backend2" backend = "backend2"
[frontends.frontend3.routes.test_1] [frontends.frontend3.routes.test_1]
rule = "Host: test3.localhost;Path:/test" rule = "Host:test3.localhost;Path:/test"
``` ```
Finally, you can create a rule to bind multiple domains or Path to a frontend, using the `,` separator: Finally, you can create a rule to bind multiple domains or Path to a frontend, using the `,` separator:
@ -145,7 +145,7 @@ Finally, you can create a rule to bind multiple domains or Path to a frontend, u
```toml ```toml
[frontends.frontend2] [frontends.frontend2]
[frontends.frontend2.routes.test_1] [frontends.frontend2.routes.test_1]
rule = "Host: test1.localhost,Host: test2.localhost" rule = "Host:test1.localhost,test2.localhost"
[frontends.frontend3] [frontends.frontend3]
backend = "backend2" backend = "backend2"
[frontends.frontend3.routes.test_1] [frontends.frontend3.routes.test_1]
@ -154,7 +154,7 @@ Finally, you can create a rule to bind multiple domains or Path to a frontend, u
### Priorities ### Priorities
By default, routes will be sorted using rules length (to avoid path overlap): By default, routes will be sorted (in descending order) using rules length (to avoid path overlap):
`PathPrefix:/12345` will be matched before `PathPrefix:/1234` that will be matched before `PathPrefix:/1`. `PathPrefix:/12345` will be matched before `PathPrefix:/1234` that will be matched before `PathPrefix:/1`.
You can customize priority by frontend: You can customize priority by frontend:
@ -175,6 +175,8 @@ You can customize priority by frontend:
rule = "PathPrefix:/toto" rule = "PathPrefix:/toto"
``` ```
Here, `frontend1` will be matched before `frontend2` (`10 > 5`).
## Backends ## Backends
A backend is responsible to load-balance the traffic coming from one or more frontends to a set of http servers. A backend is responsible to load-balance the traffic coming from one or more frontends to a set of http servers.

View file

@ -842,7 +842,7 @@ Træfɪk can be configured to use Etcd as a backend configuration:
# #
# Required # Required
# #
endpoint = "127.0.0.1:4001" endpoint = "127.0.0.1:2379"
# Enable watch Etcd changes # Enable watch Etcd changes
# #

View file

@ -1,4 +1,4 @@
etcd: etcd:
image: gcr.io/google_containers/etcd:2.2.1 image: gcr.io/google_containers/etcd:2.2.1
net: host net: host
command: ['/usr/local/bin/etcd', '--addr=127.0.0.1:4001', '--bind-addr=0.0.0.0:4001', '--data-dir=/var/etcd/data'] command: ['/usr/local/bin/etcd', '--addr=127.0.0.1:2379', '--bind-addr=0.0.0.0:2379', '--data-dir=/var/etcd/data']

View file

@ -1,25 +1,25 @@
#!/bin/sh #!/bin/sh
# backend 1 # backend 1
curl -i -H "Accept: application/json" -X PUT -d value="NetworkErrorRatio() > 0.5" http://localhost:4001/v2/keys/traefik/backends/backend1/circuitbreaker/expression curl -i -H "Accept: application/json" -X PUT -d value="NetworkErrorRatio() > 0.5" http://localhost:2379/v2/keys/traefik/backends/backend1/circuitbreaker/expression
curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.2:80" http://localhost:4001/v2/keys/traefik/backends/backend1/servers/server1/url curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.2:80" http://localhost:2379/v2/keys/traefik/backends/backend1/servers/server1/url
curl -i -H "Accept: application/json" -X PUT -d value="10" http://localhost:4001/v2/keys/traefik/backends/backend1/servers/server1/weight curl -i -H "Accept: application/json" -X PUT -d value="10" http://localhost:2379/v2/keys/traefik/backends/backend1/servers/server1/weight
curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.3:80" http://localhost:4001/v2/keys/traefik/backends/backend1/servers/server2/url curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.3:80" http://localhost:2379/v2/keys/traefik/backends/backend1/servers/server2/url
curl -i -H "Accept: application/json" -X PUT -d value="1" http://localhost:4001/v2/keys/traefik/backends/backend1/servers/server2/weight curl -i -H "Accept: application/json" -X PUT -d value="1" http://localhost:2379/v2/keys/traefik/backends/backend1/servers/server2/weight
# backend 2 # backend 2
curl -i -H "Accept: application/json" -X PUT -d value="drr" http://localhost:4001/v2/keys/traefik/backends/backend2/loadbalancer/method curl -i -H "Accept: application/json" -X PUT -d value="drr" http://localhost:2379/v2/keys/traefik/backends/backend2/loadbalancer/method
curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.4:80" http://localhost:4001/v2/keys/traefik/backends/backend2/servers/server1/url curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.4:80" http://localhost:2379/v2/keys/traefik/backends/backend2/servers/server1/url
curl -i -H "Accept: application/json" -X PUT -d value="1" http://localhost:4001/v2/keys/traefik/backends/backend2/servers/server1/weight curl -i -H "Accept: application/json" -X PUT -d value="1" http://localhost:2379/v2/keys/traefik/backends/backend2/servers/server1/weight
curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.5:80" http://localhost:4001/v2/keys/traefik/backends/backend2/servers/server2/url curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.5:80" http://localhost:2379/v2/keys/traefik/backends/backend2/servers/server2/url
curl -i -H "Accept: application/json" -X PUT -d value="2" http://localhost:4001/v2/keys/traefik/backends/backend2/servers/server2/weight curl -i -H "Accept: application/json" -X PUT -d value="2" http://localhost:2379/v2/keys/traefik/backends/backend2/servers/server2/weight
# frontend 1 # frontend 1
curl -i -H "Accept: application/json" -X PUT -d value="backend2" http://localhost:4001/v2/keys/traefik/frontends/frontend1/backend curl -i -H "Accept: application/json" -X PUT -d value="backend2" http://localhost:2379/v2/keys/traefik/frontends/frontend1/backend
curl -i -H "Accept: application/json" -X PUT -d value="http" http://localhost:4001/v2/keys/traefik/frontends/frontend1/entrypoints curl -i -H "Accept: application/json" -X PUT -d value="http" http://localhost:2379/v2/keys/traefik/frontends/frontend1/entrypoints
curl -i -H "Accept: application/json" -X PUT -d value="Host:test.localhost" http://localhost:4001/v2/keys/traefik/frontends/frontend1/routes/test_1/rule curl -i -H "Accept: application/json" -X PUT -d value="Host:test.localhost" http://localhost:2379/v2/keys/traefik/frontends/frontend1/routes/test_1/rule
# frontend 2 # frontend 2
curl -i -H "Accept: application/json" -X PUT -d value="backend1" http://localhost:4001/v2/keys/traefik/frontends/frontend2/backend curl -i -H "Accept: application/json" -X PUT -d value="backend1" http://localhost:2379/v2/keys/traefik/frontends/frontend2/backend
curl -i -H "Accept: application/json" -X PUT -d value="http" http://localhost:4001/v2/keys/traefik/frontends/frontend2/entrypoints curl -i -H "Accept: application/json" -X PUT -d value="http" http://localhost:2379/v2/keys/traefik/frontends/frontend2/entrypoints
curl -i -H "Accept: application/json" -X PUT -d value="Path:/test" http://localhost:4001/v2/keys/traefik/frontends/frontend2/routes/test_2/rule curl -i -H "Accept: application/json" -X PUT -d value="Path:/test" http://localhost:2379/v2/keys/traefik/frontends/frontend2/routes/test_2/rule

6
glide.lock generated
View file

@ -1,5 +1,5 @@
hash: 5cb432175705882247ac2cbf708c879fad8b287afe9e1e18f06dbce1e956acd2 hash: cc5b40d58d36a83c1bef13c0d269d7126c7d639ed5f7135160b9f3b9c624c7c9
updated: 2016-07-28T18:20:42.864416381+02:00 updated: 2016-07-28T19:30:16.497440179+02:00
imports: imports:
- name: github.com/abbot/go-http-auth - name: github.com/abbot/go-http-auth
version: cb4372376e1e00e9f6ab9ec142e029302c9e7140 version: cb4372376e1e00e9f6ab9ec142e029302c9e7140
@ -267,7 +267,7 @@ imports:
- name: github.com/vdemeester/shakers - name: github.com/vdemeester/shakers
version: 24d7f1d6a71aa5d9cbe7390e4afb66b7eef9e1b3 version: 24d7f1d6a71aa5d9cbe7390e4afb66b7eef9e1b3
- name: github.com/vulcand/oxy - name: github.com/vulcand/oxy
version: 8d476862d38b9be356eaa83b5712cad561be08a1 version: ab7796d7036b425fbc945853cd1b7e7adf43b0d6
repo: https://github.com/containous/oxy.git repo: https://github.com/containous/oxy.git
vcs: git vcs: git
subpackages: subpackages:

View file

@ -10,7 +10,7 @@ import:
- package: github.com/containous/flaeg - package: github.com/containous/flaeg
version: da9515902135a2c9071c7464a1ae660b8b24d994 version: da9515902135a2c9071c7464a1ae660b8b24d994
- package: github.com/vulcand/oxy - package: github.com/vulcand/oxy
version: 8d476862d38b9be356eaa83b5712cad561be08a1 version: ab7796d7036b425fbc945853cd1b7e7adf43b0d6
repo: https://github.com/containous/oxy.git repo: https://github.com/containous/oxy.git
vcs: git vcs: git
subpackages: subpackages:

View file

@ -31,7 +31,7 @@ func (s *EtcdSuite) SetUpTest(c *check.C) {
s.composeProject.Start(c) s.composeProject.Start(c)
etcd.Register() etcd.Register()
url := s.composeProject.Container(c, "etcd").NetworkSettings.IPAddress + ":4001" url := s.composeProject.Container(c, "etcd").NetworkSettings.IPAddress + ":2379"
kv, err := libkv.NewStore( kv, err := libkv.NewStore(
store.ETCD, store.ETCD,
[]string{url}, []string{url},

View file

@ -8,9 +8,9 @@ logLevel = "DEBUG"
[etcd] [etcd]
endpoint = "{{.EtcdHost}}:4001" endpoint = "{{.EtcdHost}}:2379"
prefix = "/traefik" prefix = "/traefik"
watch = true watch = true
[web] [web]
address = ":8081" address = ":8081"

View file

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
if ([ "$TRAVIS_BRANCH" = "master" ] && [ -z "$TRAVIS_TAG" ]) && [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$DOCKER_VERSION" = "1.10.1" ]; then if ([ -z "$TRAVIS_TAG" ]) && [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$DOCKER_VERSION" = "1.10.1" ]; then
echo "Deploying PR..." echo "Deploying PR..."
else else
echo "Skipping deploy PR" echo "Skipping deploy PR"

View file

@ -8,6 +8,7 @@ import (
"crypto/x509" "crypto/x509"
"encoding/json" "encoding/json"
"errors" "errors"
"golang.org/x/net/context"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/url" "net/url"
@ -99,20 +100,38 @@ func (server *Server) Start() {
// Stop stops the server // Stop stops the server
func (server *Server) Stop() { func (server *Server) Stop() {
for _, serverEntryPoint := range server.serverEntryPoints { for serverEntryPointName, serverEntryPoint := range server.serverEntryPoints {
serverEntryPoint.httpServer.BlockingClose() ctx, cancel := context.WithTimeout(context.Background(), time.Duration(server.globalConfiguration.GraceTimeOut)*time.Second)
go func() {
log.Debugf("Waiting %d seconds before killing connections on entrypoint %s...", 30, serverEntryPointName)
serverEntryPoint.httpServer.BlockingClose()
cancel()
}()
<-ctx.Done()
} }
server.stopChan <- true server.stopChan <- true
} }
// Close destroys the server // Close destroys the server
func (server *Server) Close() { func (server *Server) Close() {
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(server.globalConfiguration.GraceTimeOut)*time.Second)
go func(ctx context.Context) {
<-ctx.Done()
if ctx.Err() == context.Canceled {
return
} else if ctx.Err() == context.DeadlineExceeded {
log.Debugf("I love you all :'( ✝")
os.Exit(1)
}
}(ctx)
server.routinesPool.Stop() server.routinesPool.Stop()
close(server.configurationChan) close(server.configurationChan)
close(server.configurationValidatedChan) close(server.configurationValidatedChan)
signal.Stop(server.signals)
close(server.signals) close(server.signals)
close(server.stopChan) close(server.stopChan)
server.loggerMiddleware.Close() server.loggerMiddleware.Close()
cancel()
} }
func (server *Server) startHTTPServers() { func (server *Server) startHTTPServers() {
@ -194,7 +213,7 @@ func (server *Server) defaultConfigurationValues(configuration *types.Configurat
for backendName, backend := range configuration.Backends { for backendName, backend := range configuration.Backends {
_, err := types.NewLoadBalancerMethod(backend.LoadBalancer) _, err := types.NewLoadBalancerMethod(backend.LoadBalancer)
if err != nil { if err != nil {
log.Warnf("Error loading load balancer method '%+v' for backend %s: %v. Using default wrr.", backend.LoadBalancer, backendName, err) log.Debugf("Error loading load balancer method '%+v' for backend %s: %v. Using default wrr.", backend.LoadBalancer, backendName, err)
backend.LoadBalancer = &types.LoadBalancer{Method: "wrr"} backend.LoadBalancer = &types.LoadBalancer{Method: "wrr"}
} }
} }
@ -323,7 +342,10 @@ func (server *Server) createTLSConfig(entryPointName string, tlsOption *TLS, rou
if _, ok := server.serverEntryPoints[server.globalConfiguration.ACME.EntryPoint]; ok { if _, ok := server.serverEntryPoints[server.globalConfiguration.ACME.EntryPoint]; ok {
if entryPointName == server.globalConfiguration.ACME.EntryPoint { if entryPointName == server.globalConfiguration.ACME.EntryPoint {
checkOnDemandDomain := func(domain string) bool { checkOnDemandDomain := func(domain string) bool {
if router.GetHandler().Match(&http.Request{URL: &url.URL{}, Host: domain}, &mux.RouteMatch{}) { routeMatch := &mux.RouteMatch{}
router := router.GetHandler()
match := router.Match(&http.Request{URL: &url.URL{}, Host: domain}, routeMatch)
if match && routeMatch.Route != nil {
return true return true
} }
return false return false

View file

@ -505,7 +505,7 @@
# #
# Required # Required
# #
# endpoint = "127.0.0.1:4001" # endpoint = "127.0.0.1:2379"
# Enable watch Etcd changes # Enable watch Etcd changes
# #