diff --git a/pkg/master/controller_test.go b/pkg/master/controller_test.go index 99a4ff02345..2b6a05f43dd 100644 --- a/pkg/master/controller_test.go +++ b/pkg/master/controller_test.go @@ -558,6 +558,32 @@ func TestReconcileEndpoints(t *testing.T) { } +func TestEmptySubsets(t *testing.T) { + ns := metav1.NamespaceDefault + om := func(name string) metav1.ObjectMeta { + return metav1.ObjectMeta{Namespace: ns, Name: name} + } + endpoints := &corev1.EndpointsList{ + Items: []corev1.Endpoints{{ + ObjectMeta: om("foo"), + Subsets: nil, + }}, + } + fakeClient := fake.NewSimpleClientset() + if endpoints != nil { + fakeClient = fake.NewSimpleClientset(endpoints) + } + epAdapter := reconcilers.NewEndpointsAdapter(fakeClient.CoreV1(), nil) + reconciler := reconcilers.NewMasterCountEndpointReconciler(1, epAdapter) + endpointPorts := []corev1.EndpointPort{ + {Name: "foo", Port: 8080, Protocol: "TCP"}, + } + err := reconciler.RemoveEndpoints("foo", net.ParseIP("1.2.3.4"), endpointPorts) + if err != nil { + t.Errorf("unexpected error: %v", err) + } +} + func TestCreateOrUpdateMasterService(t *testing.T) { ns := metav1.NamespaceDefault om := func(name string) metav1.ObjectMeta { diff --git a/pkg/master/reconcilers/lease.go b/pkg/master/reconcilers/lease.go index 9295dcc436c..735e97bf723 100644 --- a/pkg/master/reconcilers/lease.go +++ b/pkg/master/reconcilers/lease.go @@ -67,9 +67,11 @@ func (s *storageLeases) ListLeases() ([]string, error) { return nil, err } - ipList := make([]string, len(ipInfoList.Items)) - for i, ip := range ipInfoList.Items { - ipList[i] = ip.Subsets[0].Addresses[0].IP + ipList := make([]string, 0, len(ipInfoList.Items)) + for _, ip := range ipInfoList.Items { + if len(ip.Subsets) > 0 && len(ip.Subsets[0].Addresses) > 0 && len(ip.Subsets[0].Addresses[0].IP) > 0 { + ipList = append(ipList, ip.Subsets[0].Addresses[0].IP) + } } klog.V(6).Infof("Current master IPs listed in storage are %v", ipList) diff --git a/pkg/master/reconcilers/lease_test.go b/pkg/master/reconcilers/lease_test.go index b202b0f31b0..4bc6c49db9a 100644 --- a/pkg/master/reconcilers/lease_test.go +++ b/pkg/master/reconcilers/lease_test.go @@ -617,6 +617,19 @@ func TestLeaseRemoveEndpoints(t *testing.T) { }}, }, }, + { + testName: "endpoint with no subset", + serviceName: "foo", + ip: "5.6.7.8", + endpointPorts: []corev1.EndpointPort{{Name: "foo", Port: 8080, Protocol: "TCP"}}, + endpointKeys: []string{"1.2.3.4", "4.3.2.2", "4.3.2.3", "4.3.2.4"}, + endpoints: &corev1.EndpointsList{ + Items: []corev1.Endpoints{{ + ObjectMeta: om("foo"), + Subsets: nil, + }}, + }, + }, } for _, test := range stopTests { t.Run(test.testName, func(t *testing.T) { diff --git a/pkg/master/reconcilers/mastercount.go b/pkg/master/reconcilers/mastercount.go index afbbece2b4f..2d37df3e2a6 100644 --- a/pkg/master/reconcilers/mastercount.go +++ b/pkg/master/reconcilers/mastercount.go @@ -149,6 +149,10 @@ func (r *masterCountEndpointReconciler) RemoveEndpoints(serviceName string, ip n return err } + if len(e.Subsets) == 0 { + // no action is needed to remove the endpoint + return nil + } // Remove our IP from the list of addresses new := []corev1.EndpointAddress{} for _, addr := range e.Subsets[0].Addresses {