2017-04-17 13:50:02 +03:00
package rancher
2017-01-29 02:01:56 +03:00
import (
2017-02-06 18:28:12 +03:00
"fmt"
2017-02-20 22:41:28 +03:00
2017-02-06 00:54:24 +03:00
"github.com/containous/traefik/log"
2017-04-17 13:50:02 +03:00
"github.com/containous/traefik/provider"
2017-02-06 00:54:24 +03:00
"github.com/containous/traefik/safe"
"github.com/containous/traefik/types"
2017-04-18 05:01:11 +03:00
)
2017-12-02 21:29:09 +03:00
const (
// Health
healthy = "healthy"
updatingHealthy = "updating-healthy"
// State
active = "active"
running = "running"
upgraded = "upgraded"
2018-03-16 00:22:03 +03:00
upgrading = "upgrading"
2017-12-02 21:29:09 +03:00
updatingActive = "updating-active"
updatingRunning = "updating-running"
)
2017-04-17 13:50:02 +03:00
var _ provider . Provider = ( * Provider ) ( nil )
2017-01-29 02:01:56 +03:00
2017-04-17 13:50:02 +03:00
// Provider holds configurations of the provider.
type Provider struct {
2017-10-02 11:32:02 +03: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 02:01:56 +03:00
}
type rancherData struct {
2018-03-26 16:32:04 +03:00
Name string
Labels map [ string ] string // List of labels set to container or service
Containers [ ] string
Health string
State string
SegmentLabels map [ string ] string
SegmentName string
2017-01-29 02:01:56 +03:00
}
2017-02-06 00:54:24 +03:00
func ( r rancherData ) String ( ) string {
2017-04-29 22:37:54 +03: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 02:01:56 +03:00
}
2018-07-11 10:08:03 +03:00
// Init the provider
func ( p * Provider ) Init ( constraints types . Constraints ) error {
return p . BaseProvider . Init ( constraints )
}
2017-05-08 04:20:38 +03:00
// Provide allows either the Rancher API or metadata service provider to
// seed configuration into Traefik using the given configuration channel.
2018-07-11 10:08:03 +03:00
func ( p * Provider ) Provide ( configurationChan chan <- types . ConfigMessage , pool * safe . Pool ) error {
2017-05-08 04:20:38 +03:00
if p . Metadata == nil {
2018-07-11 10:08:03 +03:00
return p . apiProvide ( configurationChan , pool )
2017-01-29 02:01:56 +03:00
}
2018-07-11 10:08:03 +03:00
return p . metadataProvide ( configurationChan , pool )
2017-01-29 02:01:56 +03:00
}
2017-05-08 04:20:38 +03:00
func containerFilter ( name , healthState , state string ) bool {
2017-12-02 21:29:09 +03:00
if healthState != "" && healthState != healthy && healthState != updatingHealthy {
2017-05-08 04:20:38 +03:00
log . Debugf ( "Filtering container %s with healthState of %s" , name , healthState )
2017-04-29 22:37:54 +03:00
return false
}
2018-03-16 00:22:03 +03:00
if state != "" && state != running && state != updatingRunning && state != upgraded {
2017-05-08 04:20:38 +03:00
log . Debugf ( "Filtering container %s with state of %s" , name , state )
2017-04-29 22:37:54 +03:00
return false
}
return true
}