2018-01-25 14:00:05 +03:00
package integration
import (
"net/http"
"os"
"time"
"github.com/containous/traefik/integration/try"
"github.com/go-check/check"
checker "github.com/vdemeester/shakers"
)
type TracingSuite struct {
BaseSuite
WhoAmiIP string
WhoAmiPort int
ZipkinIP string
TracingBackend string
}
type TracingTemplate struct {
WhoAmiIP string
WhoAmiPort int
ZipkinIP string
TracingBackend string
}
func ( s * TracingSuite ) SetUpSuite ( c * check . C ) {
s . createComposeProject ( c , "tracing" )
s . composeProject . Start ( c , "whoami" )
s . WhoAmiIP = s . composeProject . Container ( c , "whoami" ) . NetworkSettings . IPAddress
s . WhoAmiPort = 80
}
func ( s * TracingSuite ) startZipkin ( c * check . C ) {
s . composeProject . Start ( c , "zipkin" )
s . ZipkinIP = s . composeProject . Container ( c , "zipkin" ) . NetworkSettings . IPAddress
s . TracingBackend = "zipkin"
// Wait for Zipkin to turn ready.
err := try . GetRequest ( "http://" + s . ZipkinIP + ":9411/api/v2/services" , 20 * time . Second , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
}
func ( s * TracingSuite ) TestZipkinRateLimit ( c * check . C ) {
s . startZipkin ( c )
file := s . adaptFile ( c , "fixtures/tracing/simple.toml" , TracingTemplate {
WhoAmiIP : s . WhoAmiIP ,
WhoAmiPort : s . WhoAmiPort ,
ZipkinIP : s . ZipkinIP ,
TracingBackend : s . TracingBackend ,
} )
defer os . Remove ( file )
cmd , display := s . traefikCmd ( withConfigFile ( file ) )
defer display ( c )
err := cmd . Start ( )
c . Assert ( err , checker . IsNil )
defer cmd . Process . Kill ( )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusTooManyRequests ) )
c . Assert ( err , checker . IsNil )
// sleep for 4 seconds to be certain the configured time period has elapsed
// then test another request and verify a 200 status code
time . Sleep ( 4 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
// continue requests at 3 second intervals to test the other rate limit time period
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusTooManyRequests ) )
c . Assert ( err , checker . IsNil )
2019-01-15 16:28:04 +03:00
err = try . GetRequest ( "http://" + s . ZipkinIP + ":9411/api/v2/spans?serviceName=tracing" , 20 * time . Second , try . BodyContains ( "forward service1/file.router1" , "file.ratelimit" ) )
2018-01-25 14:00:05 +03:00
c . Assert ( err , checker . IsNil )
}
func ( s * TracingSuite ) TestZipkinRetry ( c * check . C ) {
s . startZipkin ( c )
file := s . adaptFile ( c , "fixtures/tracing/simple.toml" , TracingTemplate {
WhoAmiIP : s . WhoAmiIP ,
WhoAmiPort : 81 ,
ZipkinIP : s . ZipkinIP ,
TracingBackend : s . TracingBackend ,
} )
defer os . Remove ( file )
cmd , display := s . traefikCmd ( withConfigFile ( file ) )
defer display ( c )
err := cmd . Start ( )
c . Assert ( err , checker . IsNil )
defer cmd . Process . Kill ( )
err = try . GetRequest ( "http://127.0.0.1:8000/retry" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusBadGateway ) )
c . Assert ( err , checker . IsNil )
2019-01-15 16:28:04 +03:00
err = try . GetRequest ( "http://" + s . ZipkinIP + ":9411/api/v2/spans?serviceName=tracing" , 20 * time . Second , try . BodyContains ( "forward service2/file.router2" , "file.retry" ) )
2018-01-25 14:00:05 +03:00
c . Assert ( err , checker . IsNil )
}
func ( s * TracingSuite ) TestZipkinAuth ( c * check . C ) {
s . startZipkin ( c )
file := s . adaptFile ( c , "fixtures/tracing/simple.toml" , TracingTemplate {
WhoAmiIP : s . WhoAmiIP ,
WhoAmiPort : s . WhoAmiPort ,
ZipkinIP : s . ZipkinIP ,
TracingBackend : s . TracingBackend ,
} )
defer os . Remove ( file )
cmd , display := s . traefikCmd ( withConfigFile ( file ) )
defer display ( c )
err := cmd . Start ( )
c . Assert ( err , checker . IsNil )
defer cmd . Process . Kill ( )
err = try . GetRequest ( "http://127.0.0.1:8000/auth" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusUnauthorized ) )
c . Assert ( err , checker . IsNil )
2019-01-15 16:28:04 +03:00
err = try . GetRequest ( "http://" + s . ZipkinIP + ":9411/api/v2/spans?serviceName=tracing" , 20 * time . Second , try . BodyContains ( "entrypoint http" , "file.basic-auth" ) )
2018-01-25 14:00:05 +03:00
c . Assert ( err , checker . IsNil )
}