Ignore server for container with empty IP address.
This commit is contained in:
parent
5924a40222
commit
7ef8d6fa10
4 changed files with 145 additions and 2 deletions
|
@ -196,7 +196,6 @@ func (p *Provider) getFrontendRule(container dockerData, segmentLabels map[strin
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Provider) getIPAddress(container dockerData) string {
|
func (p Provider) getIPAddress(container dockerData) string {
|
||||||
|
|
||||||
if value := label.GetStringValue(container.Labels, labelDockerNetwork, ""); value != "" {
|
if value := label.GetStringValue(container.Labels, labelDockerNetwork, ""); value != "" {
|
||||||
networkSettings := container.NetworkSettings
|
networkSettings := container.NetworkSettings
|
||||||
if networkSettings.Networks != nil {
|
if networkSettings.Networks != nil {
|
||||||
|
@ -248,6 +247,8 @@ func (p Provider) getIPAddress(container dockerData) string {
|
||||||
for _, network := range container.NetworkSettings.Networks {
|
for _, network := range container.NetworkSettings.Networks {
|
||||||
return network.Addr
|
return network.Addr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Warnf("Unable to find the IP address for the container %q.", container.Name)
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,12 +317,17 @@ func (p *Provider) getServers(containers []dockerData) map[string]types.Server {
|
||||||
var servers map[string]types.Server
|
var servers map[string]types.Server
|
||||||
|
|
||||||
for i, container := range containers {
|
for i, container := range containers {
|
||||||
|
ip := p.getIPAddress(container)
|
||||||
|
if len(ip) == 0 {
|
||||||
|
log.Warnf("Unable to find the IP address for the container %q: the server is ignored.", container.Name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if servers == nil {
|
if servers == nil {
|
||||||
servers = make(map[string]types.Server)
|
servers = make(map[string]types.Server)
|
||||||
}
|
}
|
||||||
|
|
||||||
protocol := label.GetStringValue(container.SegmentLabels, label.TraefikProtocol, label.DefaultProtocol)
|
protocol := label.GetStringValue(container.SegmentLabels, label.TraefikProtocol, label.DefaultProtocol)
|
||||||
ip := p.getIPAddress(container)
|
|
||||||
port := getPort(container)
|
port := getPort(container)
|
||||||
|
|
||||||
serverName := "server-" + container.SegmentName + "-" + container.Name
|
serverName := "server-" + container.SegmentName + "-" + container.Name
|
||||||
|
|
|
@ -399,6 +399,7 @@ func TestDockerBuildConfiguration(t *testing.T) {
|
||||||
test := test
|
test := test
|
||||||
t.Run(test.desc, func(t *testing.T) {
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
var dockerDataList []dockerData
|
var dockerDataList []dockerData
|
||||||
for _, cont := range test.containers {
|
for _, cont := range test.containers {
|
||||||
dData := parseContainer(cont)
|
dData := parseContainer(cont)
|
||||||
|
@ -1019,3 +1020,122 @@ func TestDockerGetPort(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDockerGetServers(t *testing.T) {
|
||||||
|
p := &Provider{}
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
desc string
|
||||||
|
containers []docker.ContainerJSON
|
||||||
|
expected map[string]types.Server
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "no container",
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "with a simple container",
|
||||||
|
containers: []docker.ContainerJSON{
|
||||||
|
containerJSON(
|
||||||
|
name("test1"),
|
||||||
|
withNetwork("testnet", ipv4("10.10.10.10")),
|
||||||
|
ports(nat.PortMap{
|
||||||
|
"80/tcp": {},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
expected: map[string]types.Server{
|
||||||
|
"server-test1": {
|
||||||
|
URL: "http://10.10.10.10:80",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "with several containers",
|
||||||
|
containers: []docker.ContainerJSON{
|
||||||
|
containerJSON(
|
||||||
|
name("test1"),
|
||||||
|
withNetwork("testnet", ipv4("10.10.10.11")),
|
||||||
|
ports(nat.PortMap{
|
||||||
|
"80/tcp": {},
|
||||||
|
})),
|
||||||
|
containerJSON(
|
||||||
|
name("test2"),
|
||||||
|
withNetwork("testnet", ipv4("10.10.10.12")),
|
||||||
|
ports(nat.PortMap{
|
||||||
|
"81/tcp": {},
|
||||||
|
})),
|
||||||
|
containerJSON(
|
||||||
|
name("test3"),
|
||||||
|
withNetwork("testnet", ipv4("10.10.10.13")),
|
||||||
|
ports(nat.PortMap{
|
||||||
|
"82/tcp": {},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
expected: map[string]types.Server{
|
||||||
|
"server-test1": {
|
||||||
|
URL: "http://10.10.10.11:80",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
"server-test2": {
|
||||||
|
URL: "http://10.10.10.12:81",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
"server-test3": {
|
||||||
|
URL: "http://10.10.10.13:82",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "ignore one container because no ip address",
|
||||||
|
containers: []docker.ContainerJSON{
|
||||||
|
containerJSON(
|
||||||
|
name("test1"),
|
||||||
|
withNetwork("testnet", ipv4("")),
|
||||||
|
ports(nat.PortMap{
|
||||||
|
"80/tcp": {},
|
||||||
|
})),
|
||||||
|
containerJSON(
|
||||||
|
name("test2"),
|
||||||
|
withNetwork("testnet", ipv4("10.10.10.12")),
|
||||||
|
ports(nat.PortMap{
|
||||||
|
"81/tcp": {},
|
||||||
|
})),
|
||||||
|
containerJSON(
|
||||||
|
name("test3"),
|
||||||
|
withNetwork("testnet", ipv4("10.10.10.13")),
|
||||||
|
ports(nat.PortMap{
|
||||||
|
"82/tcp": {},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
expected: map[string]types.Server{
|
||||||
|
"server-test2": {
|
||||||
|
URL: "http://10.10.10.12:81",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
"server-test3": {
|
||||||
|
URL: "http://10.10.10.13:82",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
test := test
|
||||||
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
var dockerDataList []dockerData
|
||||||
|
for _, cont := range test.containers {
|
||||||
|
dData := parseContainer(cont)
|
||||||
|
dockerDataList = append(dockerDataList, dData)
|
||||||
|
}
|
||||||
|
|
||||||
|
servers := p.getServers(dockerDataList)
|
||||||
|
|
||||||
|
assert.Equal(t, test.expected, servers)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -166,6 +166,11 @@ func getServers(service rancherData) map[string]types.Server {
|
||||||
var servers map[string]types.Server
|
var servers map[string]types.Server
|
||||||
|
|
||||||
for index, ip := range service.Containers {
|
for index, ip := range service.Containers {
|
||||||
|
if len(ip) == 0 {
|
||||||
|
log.Warnf("Unable to find the IP address for a container in the service %q: this container is ignored.", service.Name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if servers == nil {
|
if servers == nil {
|
||||||
servers = make(map[string]types.Server)
|
servers = make(map[string]types.Server)
|
||||||
}
|
}
|
||||||
|
|
|
@ -832,6 +832,18 @@ func TestGetServers(t *testing.T) {
|
||||||
},
|
},
|
||||||
expected: nil,
|
expected: nil,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "should return nil when no server IPs",
|
||||||
|
service: rancherData{
|
||||||
|
Labels: map[string]string{
|
||||||
|
label.TraefikWeight: "7",
|
||||||
|
},
|
||||||
|
Containers: []string{""},
|
||||||
|
Health: "healthy",
|
||||||
|
State: "active",
|
||||||
|
},
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
desc: "should use default weight when invalid weight value",
|
desc: "should use default weight when invalid weight value",
|
||||||
service: rancherData{
|
service: rancherData{
|
||||||
|
|
Loading…
Reference in a new issue