Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update Rancher API integration to go-rancher client v2. #2291

Merged
merged 2 commits into from
Nov 5, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/configuration/backends/rancher.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ secretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
To enable Traefik to fetch information about the Environment it's deployed in only, you need to create an `Environment API Key`.
This can be found within the API Key advanced options.

Add these labels to traefik docker deployment to autogenerated these values:
```
io.rancher.container.agent.role: environment
io.rancher.container.create_agent: true
```

## Labels: overriding default behaviour

Labels can be used on task containers to override default behaviour:
Expand Down
10 changes: 5 additions & 5 deletions glide.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions glide.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,15 @@ import:
- package: github.com/golang/protobuf
version: 2bba0603135d7d7f5cb73b2125beeda19c09f4ef
- package: github.com/rancher/go-rancher
version: 5b8f6cc26b355ba03d7611fce3844155b7baf05b
version: 52e2f489534007ae843065468c5a1920d542afa4
- package: golang.org/x/oauth2
version: 7fdf09982454086d5570c7db3e11f360194830ca
subpackages:
- google
- package: golang.org/x/time
version: 8be79e1e0910c292df4e79c241bb7e8f7e725959
- package: github.com/rancher/go-rancher-metadata
version: 95d4962a8f0420be24fb49c2cb4f5491284c62f1
version: d2103caca5873119ff423d29cba09b4d03cd69b8
- package: github.com/googleapis/gax-go
version: 9af46dd5a1713e8b5cd71106287eba3cefdde50b
- package: google.golang.org/grpc
Expand Down
39 changes: 18 additions & 21 deletions provider/rancher/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
"github.com/containous/traefik/safe"
"github.com/containous/traefik/types"
"github.com/mitchellh/mapstructure"
rancher "github.com/rancher/go-rancher/client"
rancher "github.com/rancher/go-rancher/v2"
)

const (
Expand Down Expand Up @@ -72,11 +72,11 @@ func (p *Provider) apiProvide(configurationChan chan<- types.ConfigMessage, pool
}

ctx := context.Background()
var environments = listRancherEnvironments(rancherClient)
var stacks = listRancherStacks(rancherClient)
var services = listRancherServices(rancherClient)
var container = listRancherContainer(rancherClient)

var rancherData = parseAPISourcedRancherData(environments, services, container)
var rancherData = parseAPISourcedRancherData(stacks, services, container)

configuration := p.loadRancherConfig(rancherData)
configurationChan <- types.ConfigMessage{
Expand All @@ -93,11 +93,11 @@ func (p *Provider) apiProvide(configurationChan chan<- types.ConfigMessage, pool
case <-ticker.C:

log.Debugf("Refreshing new Data from Provider API")
var environments = listRancherEnvironments(rancherClient)
var stacks = listRancherStacks(rancherClient)
var services = listRancherServices(rancherClient)
var container = listRancherContainer(rancherClient)

rancherData := parseAPISourcedRancherData(environments, services, container)
rancherData := parseAPISourcedRancherData(stacks, services, container)

configuration := p.loadRancherConfig(rancherData)
if configuration != nil {
Expand Down Expand Up @@ -129,24 +129,21 @@ func (p *Provider) apiProvide(configurationChan chan<- types.ConfigMessage, pool
return nil
}

func listRancherEnvironments(client *rancher.RancherClient) []*rancher.Environment {
func listRancherStacks(client *rancher.RancherClient) []*rancher.Stack {

// Rancher Environment in frontend UI is actually a stack
// https://forums.rancher.com/t/api-key-for-all-environments/279/9
var stackList = []*rancher.Stack{}

var environmentList = []*rancher.Environment{}

environments, err := client.Environment.List(nil)
stacks, err := client.Stack.List(withoutPagination)

if err != nil {
log.Errorf("Cannot get Rancher Environments %+v", err)
log.Errorf("Cannot get Provider Stacks %+v", err)
}

for k := range environments.Data {
environmentList = append(environmentList, &environments.Data[k])
for k := range stacks.Data {
stackList = append(stackList, &stacks.Data[k])
}

return environmentList
return stackList
}

func listRancherServices(client *rancher.RancherClient) []*rancher.Service {
Expand Down Expand Up @@ -197,35 +194,35 @@ func listRancherContainer(client *rancher.RancherClient) []*rancher.Container {
return containerList
}

func parseAPISourcedRancherData(environments []*rancher.Environment, services []*rancher.Service, containers []*rancher.Container) []rancherData {
func parseAPISourcedRancherData(stacks []*rancher.Stack, services []*rancher.Service, containers []*rancher.Container) []rancherData {
var rancherDataList []rancherData

for _, environment := range environments {
for _, stack := range stacks {

for _, service := range services {

if service.EnvironmentId != environment.Id {
if service.StackId != stack.Id {
continue
}

rancherData := rancherData{
Name: environment.Name + "/" + service.Name,
Name: service.Name + "/" + stack.Name,
Health: service.HealthState,
State: service.State,
Labels: make(map[string]string),
Containers: []string{},
}

if service.LaunchConfig == nil || service.LaunchConfig.Labels == nil {
log.Warnf("Rancher Service Labels are missing. Environment: %s, service: %s", environment.Name, service.Name)
log.Warnf("Rancher Service Labels are missing. Stack: %s, service: %s", stack.Name, service.Name)
} else {
for key, value := range service.LaunchConfig.Labels {
rancherData.Labels[key] = value.(string)
}
}

for _, container := range containers {
if container.Labels[labelRancherStackServiceName] == rancherData.Name &&
if container.Labels[labelRancherStackServiceName] == stack.Name+"/"+service.Name &&
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this case, the order is different from <service_name>. <stack_name>, could you explain why?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because one thing is how system establish context hierarchy names for services stack/service set by container label io.rancher.stack_service.name

Another thing is the dns name for the servicesservice.stack.domain to set default traefik Host matcher.. All rancher dns external integrations and internal dns set by default dns entries as service.stack.domain . I think it's useful to make them match by default.

containerFilter(container.Name, container.HealthState, container.State) {

if container.NetworkMode == hostNetwork {
Expand Down
2 changes: 1 addition & 1 deletion provider/rancher/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ func parseMetadataSourcedRancherData(stacks []rancher.Stack) (rancherDataList []
}

rancherDataList = append(rancherDataList, rancherData{
Name: stack.Name + "/" + service.Name,
Name: service.Name + "/" + stack.Name,
State: service.State,
Labels: service.Labels,
Containers: containerIPAddresses,
Expand Down
15 changes: 15 additions & 0 deletions vendor/github.com/rancher/go-rancher-metadata/metadata/metadata.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 22 additions & 15 deletions vendor/github.com/rancher/go-rancher-metadata/metadata/types.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.