Add federated service delete unit testcase
This commit is contained in:
@@ -27,12 +27,14 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
"k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
||||||
fakefedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/fake"
|
fakefedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/fake"
|
||||||
fedutil "k8s.io/kubernetes/federation/pkg/federation-controller/util"
|
fedutil "k8s.io/kubernetes/federation/pkg/federation-controller/util"
|
||||||
|
"k8s.io/kubernetes/federation/pkg/federation-controller/util/deletionhelper"
|
||||||
. "k8s.io/kubernetes/federation/pkg/federation-controller/util/test"
|
. "k8s.io/kubernetes/federation/pkg/federation-controller/util/test"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
||||||
@@ -70,6 +72,7 @@ func TestServiceController(t *testing.T) {
|
|||||||
RegisterFakeOnUpdate(clusters, &fedClient.Fake, fedclusterWatch)
|
RegisterFakeOnUpdate(clusters, &fedClient.Fake, fedclusterWatch)
|
||||||
RegisterFakeOnCreate(services, &fedClient.Fake, fedServiceWatch)
|
RegisterFakeOnCreate(services, &fedClient.Fake, fedServiceWatch)
|
||||||
RegisterFakeOnUpdate(services, &fedClient.Fake, fedServiceWatch)
|
RegisterFakeOnUpdate(services, &fedClient.Fake, fedServiceWatch)
|
||||||
|
RegisterFakeOnDelete(services, &fedClient.Fake, fedServiceWatch, serviceObjectGetter)
|
||||||
|
|
||||||
cluster1Client := &fakekubeclientset.Clientset{}
|
cluster1Client := &fakekubeclientset.Clientset{}
|
||||||
RegisterFakeList(services, &cluster1Client.Fake, &v1.ServiceList{Items: []v1.Service{}})
|
RegisterFakeList(services, &cluster1Client.Fake, &v1.ServiceList{Items: []v1.Service{}})
|
||||||
@@ -78,6 +81,7 @@ func TestServiceController(t *testing.T) {
|
|||||||
c1EndpointWatch := RegisterFakeWatch(endpoints, &cluster1Client.Fake)
|
c1EndpointWatch := RegisterFakeWatch(endpoints, &cluster1Client.Fake)
|
||||||
RegisterFakeOnCreate(services, &cluster1Client.Fake, c1ServiceWatch)
|
RegisterFakeOnCreate(services, &cluster1Client.Fake, c1ServiceWatch)
|
||||||
RegisterFakeOnUpdate(services, &cluster1Client.Fake, c1ServiceWatch)
|
RegisterFakeOnUpdate(services, &cluster1Client.Fake, c1ServiceWatch)
|
||||||
|
RegisterFakeOnDelete(services, &cluster1Client.Fake, c1ServiceWatch, serviceObjectGetter)
|
||||||
RegisterFakeOnCreate(endpoints, &cluster1Client.Fake, c1EndpointWatch)
|
RegisterFakeOnCreate(endpoints, &cluster1Client.Fake, c1EndpointWatch)
|
||||||
RegisterFakeOnUpdate(endpoints, &cluster1Client.Fake, c1EndpointWatch)
|
RegisterFakeOnUpdate(endpoints, &cluster1Client.Fake, c1EndpointWatch)
|
||||||
|
|
||||||
@@ -88,6 +92,7 @@ func TestServiceController(t *testing.T) {
|
|||||||
c2EndpointWatch := RegisterFakeWatch(endpoints, &cluster2Client.Fake)
|
c2EndpointWatch := RegisterFakeWatch(endpoints, &cluster2Client.Fake)
|
||||||
RegisterFakeOnCreate(services, &cluster2Client.Fake, c2ServiceWatch)
|
RegisterFakeOnCreate(services, &cluster2Client.Fake, c2ServiceWatch)
|
||||||
RegisterFakeOnUpdate(services, &cluster2Client.Fake, c2ServiceWatch)
|
RegisterFakeOnUpdate(services, &cluster2Client.Fake, c2ServiceWatch)
|
||||||
|
RegisterFakeOnDelete(services, &cluster2Client.Fake, c2ServiceWatch, serviceObjectGetter)
|
||||||
RegisterFakeOnCreate(endpoints, &cluster2Client.Fake, c2EndpointWatch)
|
RegisterFakeOnCreate(endpoints, &cluster2Client.Fake, c2EndpointWatch)
|
||||||
RegisterFakeOnUpdate(endpoints, &cluster2Client.Fake, c2EndpointWatch)
|
RegisterFakeOnUpdate(endpoints, &cluster2Client.Fake, c2EndpointWatch)
|
||||||
|
|
||||||
@@ -118,7 +123,6 @@ func TestServiceController(t *testing.T) {
|
|||||||
|
|
||||||
service := NewService("test-service-1", 80)
|
service := NewService("test-service-1", 80)
|
||||||
|
|
||||||
// Test add federated service.
|
|
||||||
glog.Infof("Adding federated service")
|
glog.Infof("Adding federated service")
|
||||||
fedServiceWatch.Add(service)
|
fedServiceWatch.Add(service)
|
||||||
key := types.NamespacedName{Namespace: service.Namespace, Name: service.Name}.String()
|
key := types.NamespacedName{Namespace: service.Namespace, Name: service.Name}.String()
|
||||||
@@ -193,19 +197,28 @@ func TestServiceController(t *testing.T) {
|
|||||||
require.NoError(t, WaitForFederatedServiceUpdate(t, sc.serviceStore,
|
require.NoError(t, WaitForFederatedServiceUpdate(t, sc.serviceStore,
|
||||||
key, desiredService, serviceIngressCompare, wait.ForeverTestTimeout))
|
key, desiredService, serviceIngressCompare, wait.ForeverTestTimeout))
|
||||||
|
|
||||||
// Test update federated service.
|
|
||||||
glog.Infof("Test modifying federated service by changing the port")
|
glog.Infof("Test modifying federated service by changing the port")
|
||||||
service.Spec.Ports[0].Port = 9090
|
service.Spec.Ports[0].Port = 9090
|
||||||
fedServiceWatch.Modify(service)
|
fedServiceWatch.Modify(service)
|
||||||
require.NoError(t, WaitForClusterService(t, sc.federatedInformer.GetTargetStore(), cluster1.Name,
|
require.NoError(t, WaitForClusterService(t, sc.federatedInformer.GetTargetStore(), cluster1.Name,
|
||||||
key, service, wait.ForeverTestTimeout))
|
key, service, wait.ForeverTestTimeout))
|
||||||
|
|
||||||
// Test cluster service is recreated when deleted.
|
|
||||||
glog.Infof("Test cluster service is recreated when deleted")
|
glog.Infof("Test cluster service is recreated when deleted")
|
||||||
c1ServiceWatch.Delete(service)
|
c1Service := NewService("test-service-1", 80)
|
||||||
|
c1Service.DeletionTimestamp = &metav1.Time{Time: time.Now()}
|
||||||
|
c1ServiceWatch.Delete(c1Service)
|
||||||
require.NoError(t, WaitForClusterService(t, sc.federatedInformer.GetTargetStore(), cluster1.Name,
|
require.NoError(t, WaitForClusterService(t, sc.federatedInformer.GetTargetStore(), cluster1.Name,
|
||||||
key, service, wait.ForeverTestTimeout))
|
key, service, wait.ForeverTestTimeout))
|
||||||
|
|
||||||
|
glog.Infof("Test cluster services are deleted when federated service is deleted")
|
||||||
|
service.ObjectMeta.Finalizers = append(service.ObjectMeta.Finalizers, deletionhelper.FinalizerDeleteFromUnderlyingClusters)
|
||||||
|
service.DeletionTimestamp = &metav1.Time{Time: time.Now()}
|
||||||
|
fedServiceWatch.Modify(service)
|
||||||
|
require.NoError(t, WaitForClusterServiceDelete(t, sc.federatedInformer.GetTargetStore(), cluster1.Name,
|
||||||
|
key, wait.ForeverTestTimeout))
|
||||||
|
require.NoError(t, WaitForClusterServiceDelete(t, sc.federatedInformer.GetTargetStore(), cluster2.Name,
|
||||||
|
key, wait.ForeverTestTimeout))
|
||||||
|
|
||||||
close(stop)
|
close(stop)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,6 +269,15 @@ func TestGetOperationsToPerformOnCluster(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// serviceObjectGetter gives dummy service objects to use with RegisterFakeOnDelete
|
||||||
|
// This is just so that federated informer can be tested for delete scenarios.
|
||||||
|
func serviceObjectGetter(name, namespace string) runtime.Object {
|
||||||
|
service := new(v1.Service)
|
||||||
|
service.Namespace = namespace
|
||||||
|
service.Name = name
|
||||||
|
return service
|
||||||
|
}
|
||||||
|
|
||||||
func NewService(name string, port int32) *v1.Service {
|
func NewService(name string, port int32) *v1.Service {
|
||||||
return &v1.Service{
|
return &v1.Service{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
@@ -313,6 +335,18 @@ func WaitForClusterService(t *testing.T, store fedutil.FederatedReadOnlyStore, c
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WaitForClusterServiceDelete waits for the cluster service to be deleted.
|
||||||
|
func WaitForClusterServiceDelete(t *testing.T, store fedutil.FederatedReadOnlyStore, clusterName, key string, timeout time.Duration) error {
|
||||||
|
err := wait.PollImmediate(retryInterval, timeout, func() (bool, error) {
|
||||||
|
_, found, _ := store.GetByKey(clusterName, key)
|
||||||
|
if !found {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
type serviceCompare func(current, desired *v1.Service) (match bool)
|
type serviceCompare func(current, desired *v1.Service) (match bool)
|
||||||
|
|
||||||
func serviceStatusCompare(current, desired *v1.Service) bool {
|
func serviceStatusCompare(current, desired *v1.Service) bool {
|
||||||
|
Reference in New Issue
Block a user