2017-04-17 12:50:02 +02:00
package rancher
2017-01-29 00:01:56 +01:00
import (
2017-02-06 16:28:12 +01:00
"fmt"
2017-02-20 20:41:28 +01:00
2017-02-05 22:54:24 +01:00
"github.com/containous/traefik/log"
2017-04-17 12:50:02 +02:00
"github.com/containous/traefik/provider"
2017-02-05 22:54:24 +01:00
"github.com/containous/traefik/safe"
"github.com/containous/traefik/types"
2017-04-18 12:01:11 +10:00
)
2017-12-02 19:29:09 +01:00
const (
// Health
healthy = "healthy"
updatingHealthy = "updating-healthy"
// State
active = "active"
running = "running"
upgraded = "upgraded"
2018-03-15 22:22:03 +01:00
upgrading = "upgrading"
2017-12-02 19:29:09 +01:00
updatingActive = "updating-active"
updatingRunning = "updating-running"
)
2017-04-17 12:50:02 +02:00
var _ provider . Provider = ( * Provider ) ( nil )
2017-01-29 00:01:56 +01:00
2017-04-17 12:50:02 +02:00
// Provider holds configurations of the provider.
type Provider struct {
2017-10-02 10:32:02 +02:00
provider . BaseProvider ` mapstructure:",squash" export:"true" `
APIConfiguration ` mapstructure:",squash" export:"true" ` // Provide backwards compatibility
API * APIConfiguration ` description:"Enable the Rancher API provider" export:"true" `
Metadata * MetadataConfiguration ` description:"Enable the Rancher metadata service provider" export:"true" `
Domain string ` description:"Default domain used" `
RefreshSeconds int ` description:"Polling interval (in seconds)" export:"true" `
ExposedByDefault bool ` description:"Expose services by default" export:"true" `
EnableServiceHealthFilter bool ` description:"Filter services with unhealthy states and inactive states" export:"true" `
2017-01-29 00:01:56 +01:00
}
type rancherData struct {
2017-02-05 22:54:24 +01:00
Name string
Labels map [ string ] string // List of labels set to container or service
Containers [ ] string
Health string
2017-04-29 15:37:54 -04:00
State string
2017-01-29 00:01:56 +01:00
}
2017-02-05 22:54:24 +01:00
func ( r rancherData ) String ( ) string {
2017-04-29 15:37:54 -04:00
return fmt . Sprintf ( "{name:%s, labels:%v, containers: %v, health: %s, state: %s}" , r . Name , r . Labels , r . Containers , r . Health , r . State )
2017-01-29 00:01:56 +01:00
}
2017-05-08 11:20:38 +10:00
// Provide allows either the Rancher API or metadata service provider to
// seed configuration into Traefik using the given configuration channel.
2017-04-17 12:50:02 +02:00
func ( p * Provider ) Provide ( configurationChan chan <- types . ConfigMessage , pool * safe . Pool , constraints types . Constraints ) error {
2017-05-08 11:20:38 +10:00
if p . Metadata == nil {
return p . apiProvide ( configurationChan , pool , constraints )
2017-01-29 00:01:56 +01:00
}
2017-05-08 11:20:38 +10:00
return p . metadataProvide ( configurationChan , pool , constraints )
2017-01-29 00:01:56 +01:00
}
2017-05-08 11:20:38 +10:00
func containerFilter ( name , healthState , state string ) bool {
2017-12-02 19:29:09 +01:00
if healthState != "" && healthState != healthy && healthState != updatingHealthy {
2017-05-08 11:20:38 +10:00
log . Debugf ( "Filtering container %s with healthState of %s" , name , healthState )
2017-04-29 15:37:54 -04:00
return false
}
2018-03-15 22:22:03 +01:00
if state != "" && state != running && state != updatingRunning && state != upgraded {
2017-05-08 11:20:38 +10:00
log . Debugf ( "Filtering container %s with state of %s" , name , state )
2017-04-29 15:37:54 -04:00
return false
}
return true
}