Clean shutdown of statefulset integration tests

This commit is contained in:
Wojciech Tyczyński 2022-05-21 11:12:04 +02:00
parent aee829abf4
commit 5073506aa7
2 changed files with 29 additions and 33 deletions

View File

@ -37,6 +37,7 @@ import (
apiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" apiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
podutil "k8s.io/kubernetes/pkg/api/v1/pod" podutil "k8s.io/kubernetes/pkg/api/v1/pod"
"k8s.io/kubernetes/pkg/controller/statefulset" "k8s.io/kubernetes/pkg/controller/statefulset"
"k8s.io/kubernetes/pkg/controlplane"
"k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/test/integration/framework" "k8s.io/kubernetes/test/integration/framework"
) )
@ -49,10 +50,7 @@ const (
// TestVolumeTemplateNoopUpdate ensures embedded StatefulSet objects with embedded PersistentVolumes can be updated // TestVolumeTemplateNoopUpdate ensures embedded StatefulSet objects with embedded PersistentVolumes can be updated
func TestVolumeTemplateNoopUpdate(t *testing.T) { func TestVolumeTemplateNoopUpdate(t *testing.T) {
// Start the server with default storage setup // Start the server with default storage setup
server, err := apiservertesting.StartTestServer(t, apiservertesting.NewDefaultTestServerOptions(), nil, framework.SharedEtcd()) server := apiservertesting.StartTestServerOrDie(t, nil, nil, framework.SharedEtcd())
if err != nil {
t.Fatal(err)
}
defer server.TearDownFn() defer server.TearDownFn()
c, err := dynamic.NewForConfig(server.ClientConfig) c, err := dynamic.NewForConfig(server.ClientConfig)
@ -125,8 +123,8 @@ func TestVolumeTemplateNoopUpdate(t *testing.T) {
func TestSpecReplicasChange(t *testing.T) { func TestSpecReplicasChange(t *testing.T) {
closeFn, rm, informers, c := scSetup(t) closeFn, rm, informers, c := scSetup(t)
defer closeFn() defer closeFn()
ns := framework.CreateTestingNamespace("test-spec-replicas-change", t) ns := framework.CreateNamespaceOrDie(c, "test-spec-replicas-change", t)
defer framework.DeleteTestingNamespace(ns, t) defer framework.DeleteNamespaceOrDie(c, ns, t)
cancel := runControllerAndInformers(rm, informers) cancel := runControllerAndInformers(rm, informers)
defer cancel() defer cancel()
@ -168,8 +166,8 @@ func TestSpecReplicasChange(t *testing.T) {
func TestDeletingAndFailedPods(t *testing.T) { func TestDeletingAndFailedPods(t *testing.T) {
closeFn, rm, informers, c := scSetup(t) closeFn, rm, informers, c := scSetup(t)
defer closeFn() defer closeFn()
ns := framework.CreateTestingNamespace("test-deleting-and-failed-pods", t) ns := framework.CreateNamespaceOrDie(c, "test-deleting-and-failed-pods", t)
defer framework.DeleteTestingNamespace(ns, t) defer framework.DeleteNamespaceOrDie(c, ns, t)
cancel := runControllerAndInformers(rm, informers) cancel := runControllerAndInformers(rm, informers)
defer cancel() defer cancel()
@ -269,8 +267,8 @@ func TestStatefulSetAvailable(t *testing.T) {
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.StatefulSetMinReadySeconds, test.enabled)() defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.StatefulSetMinReadySeconds, test.enabled)()
closeFn, rm, informers, c := scSetup(t) closeFn, rm, informers, c := scSetup(t)
defer closeFn() defer closeFn()
ns := framework.CreateTestingNamespace("test-available-pods", t) ns := framework.CreateNamespaceOrDie(c, "test-available-pods", t)
defer framework.DeleteTestingNamespace(ns, t) defer framework.DeleteNamespaceOrDie(c, ns, t)
cancel := runControllerAndInformers(rm, informers) cancel := runControllerAndInformers(rm, informers)
defer cancel() defer cancel()
@ -358,31 +356,28 @@ func setPodsReadyCondition(t *testing.T, clientSet clientset.Interface, pods *v1
// add for issue: https://github.com/kubernetes/kubernetes/issues/108837 // add for issue: https://github.com/kubernetes/kubernetes/issues/108837
func TestStatefulSetStatusWithPodFail(t *testing.T) { func TestStatefulSetStatusWithPodFail(t *testing.T) {
limitedPodNumber := 2 limitedPodNumber := 2
controlPlaneConfig := framework.NewIntegrationTestControlPlaneConfig() c, config, closeFn := framework.StartTestServer(t, framework.TestServerSetup{
controlPlaneConfig.GenericConfig.AdmissionControl = &fakePodFailAdmission{ ModifyServerConfig: func(config *controlplane.Config) {
limitedPodNumber: limitedPodNumber, config.GenericConfig.AdmissionControl = &fakePodFailAdmission{
} limitedPodNumber: limitedPodNumber,
_, s, closeFn := framework.RunAnAPIServer(controlPlaneConfig) }
},
})
defer closeFn() defer closeFn()
config := restclient.Config{Host: s.URL}
c, err := clientset.NewForConfig(&config)
if err != nil {
t.Fatalf("Could not create clientset: %v", err)
}
resyncPeriod := 12 * time.Hour resyncPeriod := 12 * time.Hour
informers := informers.NewSharedInformerFactory(clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "statefulset-informers")), resyncPeriod) informers := informers.NewSharedInformerFactory(clientset.NewForConfigOrDie(restclient.AddUserAgent(config, "statefulset-informers")), resyncPeriod)
ssc := statefulset.NewStatefulSetController( ssc := statefulset.NewStatefulSetController(
informers.Core().V1().Pods(), informers.Core().V1().Pods(),
informers.Apps().V1().StatefulSets(), informers.Apps().V1().StatefulSets(),
informers.Core().V1().PersistentVolumeClaims(), informers.Core().V1().PersistentVolumeClaims(),
informers.Apps().V1().ControllerRevisions(), informers.Apps().V1().ControllerRevisions(),
clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "statefulset-controller")), clientset.NewForConfigOrDie(restclient.AddUserAgent(config, "statefulset-controller")),
) )
ns := framework.CreateTestingNamespace("test-pod-fail", t) ns := framework.CreateNamespaceOrDie(c, "test-pod-fail", t)
defer framework.DeleteTestingNamespace(ns, t) defer framework.DeleteNamespaceOrDie(c, ns, t)
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
@ -390,7 +385,7 @@ func TestStatefulSetStatusWithPodFail(t *testing.T) {
go ssc.Run(ctx, 5) go ssc.Run(ctx, 5)
sts := newSTS("sts", ns.Name, 4) sts := newSTS("sts", ns.Name, 4)
_, err = c.AppsV1().StatefulSets(sts.Namespace).Create(context.TODO(), sts, metav1.CreateOptions{}) _, err := c.AppsV1().StatefulSets(sts.Namespace).Create(context.TODO(), sts, metav1.CreateOptions{})
if err != nil { if err != nil {
t.Fatalf("Could not create statefuleSet %s: %v", sts.Name, err) t.Fatalf("Could not create statefuleSet %s: %v", sts.Name, err)
} }

View File

@ -35,6 +35,7 @@ import (
typedv1 "k8s.io/client-go/kubernetes/typed/core/v1" typedv1 "k8s.io/client-go/kubernetes/typed/core/v1"
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
"k8s.io/client-go/util/retry" "k8s.io/client-go/util/retry"
kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
//svc "k8s.io/kubernetes/pkg/api/v1/service" //svc "k8s.io/kubernetes/pkg/api/v1/service"
@ -159,27 +160,27 @@ func newStatefulSetPVC(name string) v1.PersistentVolumeClaim {
} }
// scSetup sets up necessities for Statefulset integration test, including control plane, apiserver, informers, and clientset // scSetup sets up necessities for Statefulset integration test, including control plane, apiserver, informers, and clientset
func scSetup(t *testing.T) (framework.CloseFunc, *statefulset.StatefulSetController, informers.SharedInformerFactory, clientset.Interface) { func scSetup(t *testing.T) (kubeapiservertesting.TearDownFunc, *statefulset.StatefulSetController, informers.SharedInformerFactory, clientset.Interface) {
controlPlaneConfig := framework.NewIntegrationTestControlPlaneConfig() // Disable ServiceAccount admission plugin as we don't have serviceaccount controller running.
_, s, closeFn := framework.RunAnAPIServer(controlPlaneConfig) server := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins=ServiceAccount"}, framework.SharedEtcd())
config := restclient.Config{Host: s.URL} config := restclient.CopyConfig(server.ClientConfig)
clientSet, err := clientset.NewForConfig(&config) clientSet, err := clientset.NewForConfig(config)
if err != nil { if err != nil {
t.Fatalf("error in create clientset: %v", err) t.Fatalf("error in create clientset: %v", err)
} }
resyncPeriod := 12 * time.Hour resyncPeriod := 12 * time.Hour
informers := informers.NewSharedInformerFactory(clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "statefulset-informers")), resyncPeriod) informers := informers.NewSharedInformerFactory(clientset.NewForConfigOrDie(restclient.AddUserAgent(config, "statefulset-informers")), resyncPeriod)
sc := statefulset.NewStatefulSetController( sc := statefulset.NewStatefulSetController(
informers.Core().V1().Pods(), informers.Core().V1().Pods(),
informers.Apps().V1().StatefulSets(), informers.Apps().V1().StatefulSets(),
informers.Core().V1().PersistentVolumeClaims(), informers.Core().V1().PersistentVolumeClaims(),
informers.Apps().V1().ControllerRevisions(), informers.Apps().V1().ControllerRevisions(),
clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "statefulset-controller")), clientset.NewForConfigOrDie(restclient.AddUserAgent(config, "statefulset-controller")),
) )
return closeFn, sc, informers, clientSet return server.TearDownFn, sc, informers, clientSet
} }
// Run STS controller and informers // Run STS controller and informers