ceph-csi/vendor/k8s.io/kubernetes/pkg/master/controller_test.go

963 lines
31 KiB
Go
Raw Normal View History

2018-01-09 18:57:14 +00:00
/*
Copyright 2014 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package master
import (
"net"
"reflect"
"testing"
2018-11-26 18:23:56 +00:00
corev1 "k8s.io/api/core/v1"
2018-01-09 18:57:14 +00:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
2018-11-26 18:23:56 +00:00
"k8s.io/client-go/kubernetes/fake"
2018-01-09 18:57:14 +00:00
core "k8s.io/client-go/testing"
"k8s.io/kubernetes/pkg/master/reconcilers"
)
func TestReconcileEndpoints(t *testing.T) {
ns := metav1.NamespaceDefault
om := func(name string) metav1.ObjectMeta {
return metav1.ObjectMeta{Namespace: ns, Name: name}
}
reconcile_tests := []struct {
testName string
serviceName string
ip string
2018-11-26 18:23:56 +00:00
endpointPorts []corev1.EndpointPort
2018-01-09 18:57:14 +00:00
additionalMasters int
2018-11-26 18:23:56 +00:00
endpoints *corev1.EndpointsList
expectUpdate *corev1.Endpoints // nil means none expected
expectCreate *corev1.Endpoints // nil means none expected
2018-01-09 18:57:14 +00:00
}{
{
testName: "no existing endpoints",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
endpoints: nil,
2018-11-26 18:23:56 +00:00
expectCreate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints satisfy",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
},
{
testName: "existing endpoints satisfy but too many",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}, {IP: "4.3.2.1"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints satisfy but too many + extra masters",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
additionalMasters: 3,
2018-11-26 18:23:56 +00:00
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{
2018-01-09 18:57:14 +00:00
{IP: "1.2.3.4"},
{IP: "4.3.2.1"},
{IP: "4.3.2.2"},
{IP: "4.3.2.3"},
{IP: "4.3.2.4"},
},
2018-11-26 18:23:56 +00:00
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{
2018-01-09 18:57:14 +00:00
{IP: "1.2.3.4"},
{IP: "4.3.2.2"},
{IP: "4.3.2.3"},
{IP: "4.3.2.4"},
},
2018-11-26 18:23:56 +00:00
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints satisfy but too many + extra masters + delete first",
serviceName: "foo",
ip: "4.3.2.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
additionalMasters: 3,
2018-11-26 18:23:56 +00:00
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{
2018-01-09 18:57:14 +00:00
{IP: "1.2.3.4"},
{IP: "4.3.2.1"},
{IP: "4.3.2.2"},
{IP: "4.3.2.3"},
{IP: "4.3.2.4"},
},
2018-11-26 18:23:56 +00:00
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{
2018-01-09 18:57:14 +00:00
{IP: "4.3.2.1"},
{IP: "4.3.2.2"},
{IP: "4.3.2.3"},
{IP: "4.3.2.4"},
},
2018-11-26 18:23:56 +00:00
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints satisfy and endpoint addresses length less than master count",
serviceName: "foo",
ip: "4.3.2.2",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
additionalMasters: 3,
2018-11-26 18:23:56 +00:00
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{
2018-01-09 18:57:14 +00:00
{IP: "4.3.2.1"},
{IP: "4.3.2.2"},
},
2018-11-26 18:23:56 +00:00
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
expectUpdate: nil,
},
{
testName: "existing endpoints current IP missing and address length less than master count",
serviceName: "foo",
ip: "4.3.2.2",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
additionalMasters: 3,
2018-11-26 18:23:56 +00:00
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{
2018-01-09 18:57:14 +00:00
{IP: "4.3.2.1"},
},
2018-11-26 18:23:56 +00:00
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{
2018-01-09 18:57:14 +00:00
{IP: "4.3.2.1"},
{IP: "4.3.2.2"},
},
2018-11-26 18:23:56 +00:00
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints wrong name",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("bar"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectCreate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints wrong IP",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "4.3.2.1"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints wrong port",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 9090, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints wrong protocol",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "UDP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints wrong port name",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "baz", Port: 8080, Protocol: "TCP"}},
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "baz", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "existing endpoints extra service ports satisfy",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP"},
{Name: "bar", Port: 1000, Protocol: "TCP"},
{Name: "baz", Port: 1010, Protocol: "TCP"},
},
2018-11-26 18:23:56 +00:00
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP"},
{Name: "bar", Port: 1000, Protocol: "TCP"},
{Name: "baz", Port: 1010, Protocol: "TCP"},
},
}},
}},
},
},
{
testName: "existing endpoints extra service ports missing port",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP"},
{Name: "bar", Port: 1000, Protocol: "TCP"},
},
2018-11-26 18:23:56 +00:00
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP"},
{Name: "bar", Port: 1000, Protocol: "TCP"},
},
}},
},
},
2018-11-26 18:23:56 +00:00
{
testName: "no existing sctp endpoints",
serviceName: "boo",
ip: "1.2.3.4",
endpointPorts: []corev1.EndpointPort{{Name: "boo", Port: 7777, Protocol: "SCTP"}},
endpoints: nil,
expectCreate: &corev1.Endpoints{
ObjectMeta: om("boo"),
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "boo", Port: 7777, Protocol: "SCTP"}},
}},
},
},
2018-01-09 18:57:14 +00:00
}
for _, test := range reconcile_tests {
fakeClient := fake.NewSimpleClientset()
if test.endpoints != nil {
fakeClient = fake.NewSimpleClientset(test.endpoints)
}
reconciler := reconcilers.NewMasterCountEndpointReconciler(test.additionalMasters+1, fakeClient.Core())
err := reconciler.ReconcileEndpoints(test.serviceName, net.ParseIP(test.ip), test.endpointPorts, true)
if err != nil {
t.Errorf("case %q: unexpected error: %v", test.testName, err)
}
updates := []core.UpdateAction{}
for _, action := range fakeClient.Actions() {
if action.GetVerb() != "update" {
continue
}
updates = append(updates, action.(core.UpdateAction))
}
if test.expectUpdate != nil {
if len(updates) != 1 {
t.Errorf("case %q: unexpected updates: %v", test.testName, updates)
} else if e, a := test.expectUpdate, updates[0].GetObject(); !reflect.DeepEqual(e, a) {
t.Errorf("case %q: expected update:\n%#v\ngot:\n%#v\n", test.testName, e, a)
}
}
if test.expectUpdate == nil && len(updates) > 0 {
t.Errorf("case %q: no update expected, yet saw: %v", test.testName, updates)
}
creates := []core.CreateAction{}
for _, action := range fakeClient.Actions() {
if action.GetVerb() != "create" {
continue
}
creates = append(creates, action.(core.CreateAction))
}
if test.expectCreate != nil {
if len(creates) != 1 {
t.Errorf("case %q: unexpected creates: %v", test.testName, creates)
} else if e, a := test.expectCreate, creates[0].GetObject(); !reflect.DeepEqual(e, a) {
t.Errorf("case %q: expected create:\n%#v\ngot:\n%#v\n", test.testName, e, a)
}
}
if test.expectCreate == nil && len(creates) > 0 {
t.Errorf("case %q: no create expected, yet saw: %v", test.testName, creates)
}
}
non_reconcile_tests := []struct {
testName string
serviceName string
ip string
2018-11-26 18:23:56 +00:00
endpointPorts []corev1.EndpointPort
2018-01-09 18:57:14 +00:00
additionalMasters int
2018-11-26 18:23:56 +00:00
endpoints *corev1.EndpointsList
expectUpdate *corev1.Endpoints // nil means none expected
expectCreate *corev1.Endpoints // nil means none expected
2018-01-09 18:57:14 +00:00
}{
{
testName: "existing endpoints extra service ports missing port no update",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP"},
{Name: "bar", Port: 1000, Protocol: "TCP"},
},
2018-11-26 18:23:56 +00:00
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
expectUpdate: nil,
},
{
testName: "existing endpoints extra service ports, wrong ports, wrong IP",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP"},
{Name: "bar", Port: 1000, Protocol: "TCP"},
},
2018-11-26 18:23:56 +00:00
endpoints: &corev1.EndpointsList{
Items: []corev1.Endpoints{{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "4.3.2.1"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
}},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
{
testName: "no existing endpoints",
serviceName: "foo",
ip: "1.2.3.4",
2018-11-26 18:23:56 +00:00
endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
endpoints: nil,
2018-11-26 18:23:56 +00:00
expectCreate: &corev1.Endpoints{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Subsets: []corev1.EndpointSubset{{
Addresses: []corev1.EndpointAddress{{IP: "1.2.3.4"}},
Ports: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}},
2018-01-09 18:57:14 +00:00
}},
},
},
}
for _, test := range non_reconcile_tests {
fakeClient := fake.NewSimpleClientset()
if test.endpoints != nil {
fakeClient = fake.NewSimpleClientset(test.endpoints)
}
reconciler := reconcilers.NewMasterCountEndpointReconciler(test.additionalMasters+1, fakeClient.Core())
err := reconciler.ReconcileEndpoints(test.serviceName, net.ParseIP(test.ip), test.endpointPorts, false)
if err != nil {
t.Errorf("case %q: unexpected error: %v", test.testName, err)
}
updates := []core.UpdateAction{}
for _, action := range fakeClient.Actions() {
if action.GetVerb() != "update" {
continue
}
updates = append(updates, action.(core.UpdateAction))
}
if test.expectUpdate != nil {
if len(updates) != 1 {
t.Errorf("case %q: unexpected updates: %v", test.testName, updates)
} else if e, a := test.expectUpdate, updates[0].GetObject(); !reflect.DeepEqual(e, a) {
t.Errorf("case %q: expected update:\n%#v\ngot:\n%#v\n", test.testName, e, a)
}
}
if test.expectUpdate == nil && len(updates) > 0 {
t.Errorf("case %q: no update expected, yet saw: %v", test.testName, updates)
}
creates := []core.CreateAction{}
for _, action := range fakeClient.Actions() {
if action.GetVerb() != "create" {
continue
}
creates = append(creates, action.(core.CreateAction))
}
if test.expectCreate != nil {
if len(creates) != 1 {
t.Errorf("case %q: unexpected creates: %v", test.testName, creates)
} else if e, a := test.expectCreate, creates[0].GetObject(); !reflect.DeepEqual(e, a) {
t.Errorf("case %q: expected create:\n%#v\ngot:\n%#v\n", test.testName, e, a)
}
}
if test.expectCreate == nil && len(creates) > 0 {
t.Errorf("case %q: no create expected, yet saw: %v", test.testName, creates)
}
}
}
func TestCreateOrUpdateMasterService(t *testing.T) {
ns := metav1.NamespaceDefault
om := func(name string) metav1.ObjectMeta {
return metav1.ObjectMeta{Namespace: ns, Name: name}
}
create_tests := []struct {
testName string
serviceName string
2018-11-26 18:23:56 +00:00
servicePorts []corev1.ServicePort
serviceType corev1.ServiceType
expectCreate *corev1.Service // nil means none expected
2018-01-09 18:57:14 +00:00
}{
{
testName: "service does not exist",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
expectCreate: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
},
}
for _, test := range create_tests {
master := Controller{}
fakeClient := fake.NewSimpleClientset()
master.ServiceClient = fakeClient.Core()
master.CreateOrUpdateMasterServiceIfNeeded(test.serviceName, net.ParseIP("1.2.3.4"), test.servicePorts, test.serviceType, false)
creates := []core.CreateAction{}
for _, action := range fakeClient.Actions() {
if action.GetVerb() == "create" {
creates = append(creates, action.(core.CreateAction))
}
}
if test.expectCreate != nil {
if len(creates) != 1 {
t.Errorf("case %q: unexpected creations: %v", test.testName, creates)
} else {
obj := creates[0].GetObject()
2018-11-26 18:23:56 +00:00
if e, a := test.expectCreate.Spec, obj.(*corev1.Service).Spec; !reflect.DeepEqual(e, a) {
2018-01-09 18:57:14 +00:00
t.Errorf("case %q: expected create:\n%#v\ngot:\n%#v\n", test.testName, e, a)
}
}
}
if test.expectCreate == nil && len(creates) > 1 {
t.Errorf("case %q: no create expected, yet saw: %v", test.testName, creates)
}
}
reconcile_tests := []struct {
testName string
serviceName string
2018-11-26 18:23:56 +00:00
servicePorts []corev1.ServicePort
serviceType corev1.ServiceType
service *corev1.Service
expectUpdate *corev1.Service // nil means none expected
2018-01-09 18:57:14 +00:00
}{
{
testName: "service definition wrong port",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8000, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
},
{
testName: "service definition missing port",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
{Name: "baz", Port: 1000, Protocol: "TCP", TargetPort: intstr.FromInt(1000)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
{Name: "baz", Port: 1000, Protocol: "TCP", TargetPort: intstr.FromInt(1000)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
},
{
testName: "service definition incorrect port",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "bar", Port: 1000, Protocol: "UDP", TargetPort: intstr.FromInt(1000)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
},
{
testName: "service definition incorrect port name",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 1000, Protocol: "UDP", TargetPort: intstr.FromInt(1000)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
},
{
testName: "service definition incorrect target port",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(1000)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
},
{
testName: "service definition incorrect protocol",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "UDP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
},
{
testName: "service definition has incorrect type",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeNodePort,
2018-01-09 18:57:14 +00:00
},
},
2018-11-26 18:23:56 +00:00
expectUpdate: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
},
{
testName: "service definition satisfies",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
expectUpdate: nil,
},
}
for _, test := range reconcile_tests {
master := Controller{}
fakeClient := fake.NewSimpleClientset(test.service)
master.ServiceClient = fakeClient.Core()
err := master.CreateOrUpdateMasterServiceIfNeeded(test.serviceName, net.ParseIP("1.2.3.4"), test.servicePorts, test.serviceType, true)
if err != nil {
t.Errorf("case %q: unexpected error: %v", test.testName, err)
}
updates := []core.UpdateAction{}
for _, action := range fakeClient.Actions() {
if action.GetVerb() == "update" {
updates = append(updates, action.(core.UpdateAction))
}
}
if test.expectUpdate != nil {
if len(updates) != 1 {
t.Errorf("case %q: unexpected updates: %v", test.testName, updates)
} else {
obj := updates[0].GetObject()
2018-11-26 18:23:56 +00:00
if e, a := test.expectUpdate.Spec, obj.(*corev1.Service).Spec; !reflect.DeepEqual(e, a) {
2018-01-09 18:57:14 +00:00
t.Errorf("case %q: expected update:\n%#v\ngot:\n%#v\n", test.testName, e, a)
}
}
}
if test.expectUpdate == nil && len(updates) > 0 {
t.Errorf("case %q: no update expected, yet saw: %v", test.testName, updates)
}
}
non_reconcile_tests := []struct {
testName string
serviceName string
2018-11-26 18:23:56 +00:00
servicePorts []corev1.ServicePort
serviceType corev1.ServiceType
service *corev1.Service
expectUpdate *corev1.Service // nil means none expected
2018-01-09 18:57:14 +00:00
}{
{
testName: "service definition wrong port, no expected update",
serviceName: "foo",
2018-11-26 18:23:56 +00:00
servicePorts: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 8080, Protocol: "TCP", TargetPort: intstr.FromInt(8080)},
},
2018-11-26 18:23:56 +00:00
serviceType: corev1.ServiceTypeClusterIP,
service: &corev1.Service{
2018-01-09 18:57:14 +00:00
ObjectMeta: om("foo"),
2018-11-26 18:23:56 +00:00
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{
2018-01-09 18:57:14 +00:00
{Name: "foo", Port: 1000, Protocol: "TCP", TargetPort: intstr.FromInt(1000)},
},
Selector: nil,
ClusterIP: "1.2.3.4",
2018-11-26 18:23:56 +00:00
SessionAffinity: corev1.ServiceAffinityNone,
Type: corev1.ServiceTypeClusterIP,
2018-01-09 18:57:14 +00:00
},
},
expectUpdate: nil,
},
}
for _, test := range non_reconcile_tests {
master := Controller{}
fakeClient := fake.NewSimpleClientset(test.service)
master.ServiceClient = fakeClient.Core()
err := master.CreateOrUpdateMasterServiceIfNeeded(test.serviceName, net.ParseIP("1.2.3.4"), test.servicePorts, test.serviceType, false)
if err != nil {
t.Errorf("case %q: unexpected error: %v", test.testName, err)
}
updates := []core.UpdateAction{}
for _, action := range fakeClient.Actions() {
if action.GetVerb() == "update" {
updates = append(updates, action.(core.UpdateAction))
}
}
if test.expectUpdate != nil {
if len(updates) != 1 {
t.Errorf("case %q: unexpected updates: %v", test.testName, updates)
} else {
obj := updates[0].GetObject()
2018-11-26 18:23:56 +00:00
if e, a := test.expectUpdate.Spec, obj.(*corev1.Service).Spec; !reflect.DeepEqual(e, a) {
2018-01-09 18:57:14 +00:00
t.Errorf("case %q: expected update:\n%#v\ngot:\n%#v\n", test.testName, e, a)
}
}
}
if test.expectUpdate == nil && len(updates) > 0 {
t.Errorf("case %q: no update expected, yet saw: %v", test.testName, updates)
}
}
}