ECS provider refactoring
This commit is contained in:
parent
b0a0e16136
commit
9ce4f94818
4 changed files with 420 additions and 183 deletions
|
@ -1,13 +1,13 @@
|
|||
package ecs
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/service/ec2"
|
||||
"github.com/aws/aws-sdk-go/service/ecs"
|
||||
"github.com/containous/traefik/types"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func makeEcsInstance(containerDef *ecs.ContainerDefinition) ecsInstance {
|
||||
|
@ -58,171 +58,265 @@ func simpleEcsInstance(labels map[string]*string) ecsInstance {
|
|||
}
|
||||
|
||||
func TestEcsProtocol(t *testing.T) {
|
||||
cases := []struct {
|
||||
tests := []struct {
|
||||
desc string
|
||||
expected string
|
||||
instanceInfo ecsInstance
|
||||
provider *Provider
|
||||
}{
|
||||
{
|
||||
desc: "Protocol label is not set should return a string equals to http",
|
||||
expected: "http",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Protocol label is set to http should return a string equals to http",
|
||||
expected: "http",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelProtocol: aws.String("http"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Protocol label is set to https should return a string equals to https",
|
||||
expected: "https",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelProtocol: aws.String("https"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
}
|
||||
|
||||
for i, c := range cases {
|
||||
value := c.instanceInfo.Protocol()
|
||||
if value != c.expected {
|
||||
t.Fatalf("Should have been %v, got %v (case %d)", c.expected, value, i)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
actual := test.provider.getProtocol(test.instanceInfo)
|
||||
assert.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEcsHost(t *testing.T) {
|
||||
cases := []struct {
|
||||
tests := []struct {
|
||||
desc string
|
||||
expected string
|
||||
instanceInfo ecsInstance
|
||||
provider *Provider
|
||||
}{
|
||||
{
|
||||
desc: "Default host should be 10.0.0.0",
|
||||
expected: "10.0.0.0",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
}
|
||||
|
||||
for i, c := range cases {
|
||||
value := c.instanceInfo.Host()
|
||||
if value != c.expected {
|
||||
t.Fatalf("Should have been %v, got %v (case %d)", c.expected, value, i)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
actual := test.provider.getHost(test.instanceInfo)
|
||||
assert.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEcsPort(t *testing.T) {
|
||||
cases := []struct {
|
||||
tests := []struct {
|
||||
desc string
|
||||
expected string
|
||||
instanceInfo ecsInstance
|
||||
provider *Provider
|
||||
}{
|
||||
{
|
||||
desc: "Default port should be 80",
|
||||
expected: "80",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
}
|
||||
|
||||
for i, c := range cases {
|
||||
value := c.instanceInfo.Port()
|
||||
if value != c.expected {
|
||||
t.Fatalf("Should have been %v, got %v (case %d)", c.expected, value, i)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
actual := test.provider.getPort(test.instanceInfo)
|
||||
assert.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEcsWeight(t *testing.T) {
|
||||
cases := []struct {
|
||||
tests := []struct {
|
||||
desc string
|
||||
expected string
|
||||
instanceInfo ecsInstance
|
||||
provider *Provider
|
||||
}{
|
||||
{
|
||||
desc: "Weight label not set should return a string equals to 0",
|
||||
expected: "0",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Weight label set 0 should return a string equals to 0",
|
||||
expected: "0",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelWeight: aws.String("0"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Weight label set -1 should return a string equals to -1",
|
||||
expected: "-1",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelWeight: aws.String("-1"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Weight label set 10 should return a string equals to 10",
|
||||
expected: "10",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelWeight: aws.String("10"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
}
|
||||
|
||||
for i, c := range cases {
|
||||
value := c.instanceInfo.Weight()
|
||||
if value != c.expected {
|
||||
t.Fatalf("Should have been %v, got %v (case %d)", c.expected, value, i)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
actual := test.provider.getWeight(test.instanceInfo)
|
||||
assert.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEcsPassHostHeader(t *testing.T) {
|
||||
cases := []struct {
|
||||
tests := []struct {
|
||||
desc string
|
||||
expected string
|
||||
instanceInfo ecsInstance
|
||||
provider *Provider
|
||||
}{
|
||||
{
|
||||
desc: "Frontend pass host header label not set should return a string equals to true",
|
||||
expected: "true",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Frontend pass host header label set to false should return a string equals to false",
|
||||
expected: "false",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelFrontendPassHostHeader: aws.String("false"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Frontend pass host header label set to true should return a string equals to true",
|
||||
expected: "true",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelFrontendPassHostHeader: aws.String("true"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
}
|
||||
|
||||
for i, c := range cases {
|
||||
value := c.instanceInfo.PassHostHeader()
|
||||
if value != c.expected {
|
||||
t.Fatalf("Should have been %v, got %v (case %d)", c.expected, value, i)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
actual := test.provider.getPassHostHeader(test.instanceInfo)
|
||||
assert.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEcsPriority(t *testing.T) {
|
||||
cases := []struct {
|
||||
tests := []struct {
|
||||
desc string
|
||||
expected string
|
||||
instanceInfo ecsInstance
|
||||
provider *Provider
|
||||
}{
|
||||
{
|
||||
desc: "Frontend priority label not set should return a string equals to 0",
|
||||
expected: "0",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Frontend priority label set to 10 should return a string equals to 10",
|
||||
expected: "10",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelFrontendPriority: aws.String("10"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Frontend priority label set to -1 should return a string equals to -1",
|
||||
expected: "-1",
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelFrontendPriority: aws.String("-1"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
}
|
||||
|
||||
for i, c := range cases {
|
||||
value := c.instanceInfo.Priority()
|
||||
if value != c.expected {
|
||||
t.Fatalf("Should have been %v, got %v (case %d)", c.expected, value, i)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
actual := test.provider.getPriority(test.instanceInfo)
|
||||
assert.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEcsEntryPoints(t *testing.T) {
|
||||
cases := []struct {
|
||||
tests := []struct {
|
||||
desc string
|
||||
expected []string
|
||||
instanceInfo ecsInstance
|
||||
provider *Provider
|
||||
}{
|
||||
{
|
||||
desc: "Frontend entrypoints label not set should return empty array",
|
||||
expected: []string{},
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Frontend entrypoints label set to http should return a string array of 1 element",
|
||||
expected: []string{"http"},
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelFrontendEntryPoints: aws.String("http"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "Frontend entrypoints label set to http,https should return a string array of 2 elements",
|
||||
expected: []string{"http", "https"},
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelFrontendEntryPoints: aws.String("http,https"),
|
||||
}),
|
||||
provider: &Provider{},
|
||||
},
|
||||
}
|
||||
|
||||
for i, c := range cases {
|
||||
value := c.instanceInfo.EntryPoints()
|
||||
if !reflect.DeepEqual(value, c.expected) {
|
||||
t.Fatalf("Should have been %v, got %v (case %d)", c.expected, value, i)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
actual := test.provider.getEntryPoints(test.instanceInfo)
|
||||
assert.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -243,108 +337,187 @@ func TestFilterInstance(t *testing.T) {
|
|||
invalidMachineState := simpleEcsInstance(map[string]*string{})
|
||||
invalidMachineState.machine.State.Name = aws.String(ec2.InstanceStateNameStopped)
|
||||
|
||||
cases := []struct {
|
||||
expected bool
|
||||
exposedByDefault bool
|
||||
instanceInfo ecsInstance
|
||||
tests := []struct {
|
||||
desc string
|
||||
expected bool
|
||||
instanceInfo ecsInstance
|
||||
provider *Provider
|
||||
}{
|
||||
{
|
||||
expected: true,
|
||||
exposedByDefault: true,
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
desc: "Instance without enable label and exposed by default enabled should be not filtered",
|
||||
expected: true,
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{
|
||||
ExposedByDefault: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
expected: false,
|
||||
exposedByDefault: false,
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
desc: "Instance without enable label and exposed by default disabled should be filtered",
|
||||
expected: false,
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{}),
|
||||
provider: &Provider{
|
||||
ExposedByDefault: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
expected: false,
|
||||
exposedByDefault: true,
|
||||
desc: "Instance with enable label set to false and exposed by default enabled should be filtered",
|
||||
expected: false,
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelEnable: aws.String("false"),
|
||||
}),
|
||||
provider: &Provider{
|
||||
ExposedByDefault: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
expected: true,
|
||||
exposedByDefault: false,
|
||||
desc: "Instance with enable label set to true and exposed by default disabled should be not filtered",
|
||||
expected: true,
|
||||
instanceInfo: simpleEcsInstance(map[string]*string{
|
||||
types.LabelEnable: aws.String("true"),
|
||||
}),
|
||||
provider: &Provider{
|
||||
ExposedByDefault: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
expected: false,
|
||||
exposedByDefault: true,
|
||||
instanceInfo: nilPrivateIP,
|
||||
desc: "Instance with nil private ip and exposed by default enabled should be filtered",
|
||||
expected: false,
|
||||
instanceInfo: nilPrivateIP,
|
||||
provider: &Provider{
|
||||
ExposedByDefault: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
expected: false,
|
||||
exposedByDefault: true,
|
||||
instanceInfo: nilMachine,
|
||||
desc: "Instance with nil machine and exposed by default enabled should be filtered",
|
||||
expected: false,
|
||||
instanceInfo: nilMachine,
|
||||
provider: &Provider{
|
||||
ExposedByDefault: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
expected: false,
|
||||
exposedByDefault: true,
|
||||
instanceInfo: nilMachineState,
|
||||
desc: "Instance with nil machine state and exposed by default enabled should be filtered",
|
||||
expected: false,
|
||||
instanceInfo: nilMachineState,
|
||||
provider: &Provider{
|
||||
ExposedByDefault: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
expected: false,
|
||||
exposedByDefault: true,
|
||||
instanceInfo: nilMachineStateName,
|
||||
desc: "Instance with nil machine state name and exposed by default enabled should be filtered",
|
||||
expected: false,
|
||||
instanceInfo: nilMachineStateName,
|
||||
provider: &Provider{
|
||||
ExposedByDefault: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
expected: false,
|
||||
exposedByDefault: true,
|
||||
instanceInfo: invalidMachineState,
|
||||
desc: "Instance with invalid machine state and exposed by default enabled should be filtered",
|
||||
expected: false,
|
||||
instanceInfo: invalidMachineState,
|
||||
provider: &Provider{
|
||||
ExposedByDefault: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for i, c := range cases {
|
||||
provider := &Provider{
|
||||
ExposedByDefault: c.exposedByDefault,
|
||||
}
|
||||
value := provider.filterInstance(c.instanceInfo)
|
||||
if value != c.expected {
|
||||
t.Fatalf("Should have been %v, got %v (case %d)", c.expected, value, i)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
actual := test.provider.filterInstance(test.instanceInfo)
|
||||
assert.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestTaskChunking(t *testing.T) {
|
||||
provider := &Provider{}
|
||||
|
||||
testval := "a"
|
||||
cases := []struct {
|
||||
tests := []struct {
|
||||
desc string
|
||||
count int
|
||||
expectedLengths []int
|
||||
provider *Provider
|
||||
}{
|
||||
{0, []int(nil)},
|
||||
{1, []int{1}},
|
||||
{99, []int{99}},
|
||||
{100, []int{100}},
|
||||
{101, []int{100, 1}},
|
||||
{199, []int{100, 99}},
|
||||
{200, []int{100, 100}},
|
||||
{201, []int{100, 100, 1}},
|
||||
{555, []int{100, 100, 100, 100, 100, 55}},
|
||||
{1001, []int{100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 1}},
|
||||
{
|
||||
desc: "0 parameter should return nil",
|
||||
count: 0,
|
||||
expectedLengths: []int(nil),
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "1 parameter should return 1 array of 1 element",
|
||||
count: 1,
|
||||
expectedLengths: []int{1},
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "99 parameters should return 1 array of 99 elements",
|
||||
count: 99,
|
||||
expectedLengths: []int{99},
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "100 parameters should return 1 array of 100 elements",
|
||||
count: 100,
|
||||
expectedLengths: []int{100},
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "101 parameters should return 1 array of 100 elements and 1 array of 1 element",
|
||||
count: 101,
|
||||
expectedLengths: []int{100, 1},
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "199 parameters should return 1 array of 100 elements and 1 array of 99 elements",
|
||||
count: 199,
|
||||
expectedLengths: []int{100, 99},
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "200 parameters should return 2 arrays of 100 elements each",
|
||||
count: 200,
|
||||
expectedLengths: []int{100, 100},
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "201 parameters should return 2 arrays of 100 elements each and 1 array of 1 element",
|
||||
count: 201,
|
||||
expectedLengths: []int{100, 100, 1},
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "555 parameters should return 5 arrays of 100 elements each and 1 array of 55 elements",
|
||||
count: 555,
|
||||
expectedLengths: []int{100, 100, 100, 100, 100, 55},
|
||||
provider: &Provider{},
|
||||
},
|
||||
{
|
||||
desc: "1001 parameters should return 10 arrays of 100 elements each and 1 array of 1 element",
|
||||
count: 1001,
|
||||
expectedLengths: []int{100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 1},
|
||||
provider: &Provider{},
|
||||
},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
var tasks []*string
|
||||
for v := 0; v < c.count; v++ {
|
||||
tasks = append(tasks, &testval)
|
||||
}
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
var tasks []*string
|
||||
for v := 0; v < test.count; v++ {
|
||||
tasks = append(tasks, &testval)
|
||||
}
|
||||
|
||||
out := provider.chunkedTaskArns(tasks)
|
||||
var outCount []int
|
||||
out := test.provider.chunkedTaskArns(tasks)
|
||||
var outCount []int
|
||||
|
||||
for _, el := range out {
|
||||
outCount = append(outCount, len(el))
|
||||
}
|
||||
for _, el := range out {
|
||||
outCount = append(outCount, len(el))
|
||||
}
|
||||
|
||||
assert.Equal(t, test.expectedLengths, outCount, "Chunking %d elements", test.count)
|
||||
})
|
||||
|
||||
if !reflect.DeepEqual(outCount, c.expectedLengths) {
|
||||
t.Errorf("Chunking %d elements, expected %#v, got %#v", c.count, c.expectedLengths, outCount)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue