2017-07-17 14:42:48 +03:00
package marathon
2017-08-18 04:08:03 +03:00
import (
2017-08-21 11:46:03 +03:00
"strings"
2017-08-18 04:08:03 +03:00
"time"
2017-12-02 21:27:47 +03:00
"github.com/containous/traefik/provider/label"
2017-08-18 04:08:03 +03:00
"github.com/gambol99/go-marathon"
)
2017-12-02 21:27:47 +03:00
const testTaskName = "taskID"
2017-07-17 14:42:48 +03:00
// Functions related to building applications.
2017-08-18 04:08:03 +03:00
func application ( ops ... func ( * marathon . Application ) ) marathon . Application {
2017-07-17 14:42:48 +03:00
app := marathon . Application { }
app . EmptyLabels ( )
2017-08-18 04:08:03 +03:00
app . Deployments = [ ] map [ string ] string { }
app . ReadinessChecks = & [ ] marathon . ReadinessCheck { }
app . ReadinessCheckResults = & [ ] marathon . ReadinessCheckResult { }
2017-07-17 14:42:48 +03:00
for _ , op := range ops {
op ( & app )
}
return app
}
func appID ( name string ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
app . Name ( name )
}
}
func appPorts ( ports ... int ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
app . Ports = append ( app . Ports , ports ... )
}
}
2017-12-02 21:27:47 +03:00
func withLabel ( key , value string ) func ( * marathon . Application ) {
2017-07-17 14:42:48 +03:00
return func ( app * marathon . Application ) {
app . AddLabel ( key , value )
}
}
2017-11-21 12:48:04 +03:00
func constraint ( value string ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
app . AddConstraint ( strings . Split ( value , ":" ) ... )
}
}
2017-08-21 11:46:03 +03:00
func labelWithService ( key , value string , serviceName string ) func ( * marathon . Application ) {
if len ( serviceName ) == 0 {
panic ( "serviceName can not be empty" )
}
2017-12-02 21:27:47 +03:00
property := strings . TrimPrefix ( key , label . Prefix )
2017-08-21 11:46:03 +03:00
return func ( app * marathon . Application ) {
2017-12-02 21:27:47 +03:00
app . AddLabel ( label . Prefix + serviceName + "." + property , value )
2017-08-21 11:46:03 +03:00
}
}
2017-07-17 14:42:48 +03:00
func healthChecks ( checks ... * marathon . HealthCheck ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
for _ , check := range checks {
app . AddHealthCheck ( * check )
}
}
}
func portDefinition ( port int ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
app . AddPortDefinition ( marathon . PortDefinition {
Port : & port ,
} )
}
}
func ipAddrPerTask ( port int ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
p := marathon . Port {
Number : port ,
Name : "port" ,
}
disc := marathon . Discovery { }
disc . AddPort ( p )
ipAddr := marathon . IPAddressPerTask { }
ipAddr . SetDiscovery ( disc )
app . SetIPAddressPerTask ( ipAddr )
}
}
2017-08-18 04:08:03 +03:00
func deployments ( ids ... string ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
for _ , id := range ids {
app . Deployments = append ( app . Deployments , map [ string ] string {
"ID" : id ,
} )
}
}
}
func readinessCheck ( timeout time . Duration ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
app . ReadinessChecks = & [ ] marathon . ReadinessCheck {
{
Path : "/ready" ,
TimeoutSeconds : int ( timeout . Seconds ( ) ) ,
} ,
}
}
}
func readinessCheckResult ( taskID string , ready bool ) func ( * marathon . Application ) {
return func ( app * marathon . Application ) {
* app . ReadinessCheckResults = append ( * app . ReadinessCheckResults , marathon . ReadinessCheckResult {
TaskID : taskID ,
Ready : ready ,
} )
}
}
2017-07-17 14:42:48 +03:00
// Functions related to building tasks.
2017-08-18 04:08:03 +03:00
func task ( ops ... func ( * marathon . Task ) ) marathon . Task {
2017-07-17 14:42:48 +03:00
t := marathon . Task {
2017-08-18 04:08:03 +03:00
ID : testTaskName ,
2017-07-17 14:42:48 +03:00
// The vast majority of tests expect the task state to be TASK_RUNNING.
State : string ( taskStateRunning ) ,
}
for _ , op := range ops {
op ( & t )
}
return t
}
2017-08-18 04:08:03 +03:00
func localhostTask ( ops ... func ( * marathon . Task ) ) marathon . Task {
t := task (
2017-07-17 14:42:48 +03:00
host ( "localhost" ) ,
ipAddresses ( "127.0.0.1" ) ,
)
for _ , op := range ops {
op ( & t )
}
return t
}
func taskPorts ( ports ... int ) func ( * marathon . Task ) {
return func ( t * marathon . Task ) {
t . Ports = append ( t . Ports , ports ... )
}
}
func host ( h string ) func ( * marathon . Task ) {
return func ( t * marathon . Task ) {
t . Host = h
}
}
func ipAddresses ( addresses ... string ) func ( * marathon . Task ) {
return func ( t * marathon . Task ) {
for _ , addr := range addresses {
t . IPAddresses = append ( t . IPAddresses , & marathon . IPAddress {
IPAddress : addr ,
Protocol : "tcp" ,
} )
}
}
}
func state ( s TaskState ) func ( * marathon . Task ) {
return func ( t * marathon . Task ) {
t . State = string ( s )
}
}
func healthCheckResultLiveness ( alive ... bool ) func ( * marathon . Task ) {
return func ( t * marathon . Task ) {
for _ , a := range alive {
t . HealthCheckResults = append ( t . HealthCheckResults , & marathon . HealthCheckResult {
Alive : a ,
} )
}
}
}
2017-08-18 04:08:03 +03:00
func startedAt ( timestamp string ) func ( * marathon . Task ) {
return func ( t * marathon . Task ) {
t . StartedAt = timestamp
}
}
func startedAtFromNow ( offset time . Duration ) func ( * marathon . Task ) {
return func ( t * marathon . Task ) {
t . StartedAt = time . Now ( ) . Add ( - offset ) . Format ( time . RFC3339 )
}
}