use apps/v1 APIs in integration tests

This commit is contained in:
Jordan Liggitt 2019-01-08 14:14:37 -05:00
parent 0210c0d869
commit 4fc63fd014
5 changed files with 36 additions and 42 deletions

View File

@ -20,8 +20,6 @@ go_test(
], ],
deps = [ deps = [
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/api/testapi:go_default_library",
"//pkg/apis/core:go_default_library",
"//pkg/kubectl/cmd/util:go_default_library", "//pkg/kubectl/cmd/util:go_default_library",
"//pkg/master:go_default_library", "//pkg/master:go_default_library",
"//pkg/printers:go_default_library", "//pkg/printers:go_default_library",

View File

@ -23,6 +23,7 @@ import (
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"path"
"reflect" "reflect"
"testing" "testing"
@ -39,8 +40,6 @@ import (
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
"k8s.io/client-go/tools/pager" "k8s.io/client-go/tools/pager"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/kubernetes/pkg/api/testapi"
api "k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/master" "k8s.io/kubernetes/pkg/master"
"k8s.io/kubernetes/test/integration/framework" "k8s.io/kubernetes/test/integration/framework"
) )
@ -82,10 +81,6 @@ func verifyStatusCode(t *testing.T, verb, URL, body string, expectedStatusCode i
} }
} }
func path(resource, namespace, name string) string {
return testapi.Extensions.ResourcePath(resource, namespace, name)
}
func newRS(namespace string) *apps.ReplicaSet { func newRS(namespace string) *apps.ReplicaSet {
return &apps.ReplicaSet{ return &apps.ReplicaSet{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
@ -118,7 +113,7 @@ func newRS(namespace string) *apps.ReplicaSet {
var cascDel = ` var cascDel = `
{ {
"kind": "DeleteOptions", "kind": "DeleteOptions",
"apiVersion": "` + testapi.Groups[api.GroupName].GroupVersion().String() + `", "apiVersion": "v1",
"orphanDependents": false "orphanDependents": false
} }
` `
@ -139,7 +134,7 @@ func Test202StatusCode(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Failed to create rs: %v", err) t.Fatalf("Failed to create rs: %v", err)
} }
verifyStatusCode(t, "DELETE", s.URL+path("replicasets", ns.Name, rs.Name), "", 200) verifyStatusCode(t, "DELETE", s.URL+path.Join("/apis/apps/v1/namespaces", ns.Name, "replicasets", rs.Name), "", 200)
// 2. Create the resource with a finalizer so that the resource is not immediately deleted and then delete it without setting DeleteOptions. // 2. Create the resource with a finalizer so that the resource is not immediately deleted and then delete it without setting DeleteOptions.
// Verify that the apiserver still returns 200 since DeleteOptions.OrphanDependents is not set. // Verify that the apiserver still returns 200 since DeleteOptions.OrphanDependents is not set.
@ -149,7 +144,7 @@ func Test202StatusCode(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Failed to create rs: %v", err) t.Fatalf("Failed to create rs: %v", err)
} }
verifyStatusCode(t, "DELETE", s.URL+path("replicasets", ns.Name, rs.Name), "", 200) verifyStatusCode(t, "DELETE", s.URL+path.Join("/apis/apps/v1/namespaces", ns.Name, "replicasets", rs.Name), "", 200)
// 3. Create the resource and then delete it with DeleteOptions.OrphanDependents=false. // 3. Create the resource and then delete it with DeleteOptions.OrphanDependents=false.
// Verify that the server still returns 200 since the resource is immediately deleted. // Verify that the server still returns 200 since the resource is immediately deleted.
@ -158,7 +153,7 @@ func Test202StatusCode(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Failed to create rs: %v", err) t.Fatalf("Failed to create rs: %v", err)
} }
verifyStatusCode(t, "DELETE", s.URL+path("replicasets", ns.Name, rs.Name), cascDel, 200) verifyStatusCode(t, "DELETE", s.URL+path.Join("/apis/apps/v1/namespaces", ns.Name, "replicasets", rs.Name), cascDel, 200)
// 4. Create the resource with a finalizer so that the resource is not immediately deleted and then delete it with DeleteOptions.OrphanDependents=false. // 4. Create the resource with a finalizer so that the resource is not immediately deleted and then delete it with DeleteOptions.OrphanDependents=false.
// Verify that the server returns 202 in this case. // Verify that the server returns 202 in this case.
@ -168,7 +163,7 @@ func Test202StatusCode(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Failed to create rs: %v", err) t.Fatalf("Failed to create rs: %v", err)
} }
verifyStatusCode(t, "DELETE", s.URL+path("replicasets", ns.Name, rs.Name), cascDel, 202) verifyStatusCode(t, "DELETE", s.URL+path.Join("/apis/apps/v1/namespaces", ns.Name, "replicasets", rs.Name), cascDel, 202)
} }
func TestAPIListChunking(t *testing.T) { func TestAPIListChunking(t *testing.T) {

View File

@ -8,7 +8,7 @@ go_library(
deps = [ deps = [
#"//pkg/api:go_default_library", #"//pkg/api:go_default_library",
"//pkg/controller/statefulset:go_default_library", "//pkg/controller/statefulset:go_default_library",
"//staging/src/k8s.io/api/apps/v1beta1:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
@ -16,7 +16,7 @@ go_library(
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//staging/src/k8s.io/client-go/informers:go_default_library", "//staging/src/k8s.io/client-go/informers:go_default_library",
"//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library",
"//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library",
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
"//staging/src/k8s.io/client-go/rest:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library",
"//staging/src/k8s.io/client-go/util/retry:go_default_library", "//staging/src/k8s.io/client-go/util/retry:go_default_library",
@ -34,7 +34,7 @@ go_test(
embed = [":go_default_library"], embed = [":go_default_library"],
tags = ["integration"], tags = ["integration"],
deps = [ deps = [
"//staging/src/k8s.io/api/apps/v1beta1:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",

View File

@ -20,7 +20,7 @@ import (
"fmt" "fmt"
"testing" "testing"
"k8s.io/api/apps/v1beta1" appsv1 "k8s.io/api/apps/v1"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
@ -37,7 +37,7 @@ func TestSpecReplicasChange(t *testing.T) {
createHeadlessService(t, c, newHeadlessService(ns.Name)) createHeadlessService(t, c, newHeadlessService(ns.Name))
sts := newSTS("sts", ns.Name, 2) sts := newSTS("sts", ns.Name, 2)
stss, _ := createSTSsPods(t, c, []*v1beta1.StatefulSet{sts}, []*v1.Pod{}) stss, _ := createSTSsPods(t, c, []*appsv1.StatefulSet{sts}, []*v1.Pod{})
sts = stss[0] sts = stss[0]
waitSTSStable(t, c, sts) waitSTSStable(t, c, sts)
@ -48,9 +48,9 @@ func TestSpecReplicasChange(t *testing.T) {
// Add a template annotation change to test STS's status does update // Add a template annotation change to test STS's status does update
// without .Spec.Replicas change // without .Spec.Replicas change
stsClient := c.AppsV1beta1().StatefulSets(ns.Name) stsClient := c.AppsV1().StatefulSets(ns.Name)
var oldGeneration int64 var oldGeneration int64
newSTS := updateSTS(t, stsClient, sts.Name, func(sts *v1beta1.StatefulSet) { newSTS := updateSTS(t, stsClient, sts.Name, func(sts *appsv1.StatefulSet) {
oldGeneration = sts.Generation oldGeneration = sts.Generation
sts.Spec.Template.Annotations = map[string]string{"test": "annotation"} sts.Spec.Template.Annotations = map[string]string{"test": "annotation"}
}) })
@ -64,7 +64,7 @@ func TestSpecReplicasChange(t *testing.T) {
if err != nil { if err != nil {
return false, err return false, err
} }
return *newSTS.Status.ObservedGeneration >= savedGeneration, nil return newSTS.Status.ObservedGeneration >= savedGeneration, nil
}); err != nil { }); err != nil {
t.Fatalf("failed to verify .Status.ObservedGeneration has incremented for sts %s: %v", sts.Name, err) t.Fatalf("failed to verify .Status.ObservedGeneration has incremented for sts %s: %v", sts.Name, err)
} }
@ -80,7 +80,7 @@ func TestDeletingAndFailedPods(t *testing.T) {
labelMap := labelMap() labelMap := labelMap()
sts := newSTS("sts", ns.Name, 2) sts := newSTS("sts", ns.Name, 2)
stss, _ := createSTSsPods(t, c, []*v1beta1.StatefulSet{sts}, []*v1.Pod{}) stss, _ := createSTSsPods(t, c, []*appsv1.StatefulSet{sts}, []*v1.Pod{})
sts = stss[0] sts = stss[0]
waitSTSStable(t, c, sts) waitSTSStable(t, c, sts)

View File

@ -22,7 +22,7 @@ import (
"testing" "testing"
"time" "time"
"k8s.io/api/apps/v1beta1" appsv1 "k8s.io/api/apps/v1"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -30,10 +30,11 @@ import (
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
typedv1beta1 "k8s.io/client-go/kubernetes/typed/apps/v1beta1" typedappsv1 "k8s.io/client-go/kubernetes/typed/apps/v1"
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"
//svc "k8s.io/kubernetes/pkg/api/v1/service" //svc "k8s.io/kubernetes/pkg/api/v1/service"
"k8s.io/kubernetes/pkg/controller/statefulset" "k8s.io/kubernetes/pkg/controller/statefulset"
"k8s.io/kubernetes/test/integration/framework" "k8s.io/kubernetes/test/integration/framework"
@ -51,7 +52,7 @@ type statefulsetTester struct {
t *testing.T t *testing.T
c clientset.Interface c clientset.Interface
service *v1.Service service *v1.Service
statefulset *v1beta1.StatefulSet statefulset *appsv1.StatefulSet
} }
func labelMap() map[string]string { func labelMap() map[string]string {
@ -80,19 +81,19 @@ func newHeadlessService(namespace string) *v1.Service {
} }
// newSTS returns a StatefulSet with a fake container image // newSTS returns a StatefulSet with a fake container image
func newSTS(name, namespace string, replicas int) *v1beta1.StatefulSet { func newSTS(name, namespace string, replicas int) *appsv1.StatefulSet {
replicasCopy := int32(replicas) replicasCopy := int32(replicas)
return &v1beta1.StatefulSet{ return &appsv1.StatefulSet{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
Kind: "StatefulSet", Kind: "StatefulSet",
APIVersion: "apps/v1beta1", APIVersion: "apps/v1",
}, },
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: namespace, Namespace: namespace,
Name: name, Name: name,
}, },
Spec: v1beta1.StatefulSetSpec{ Spec: appsv1.StatefulSetSpec{
PodManagementPolicy: v1beta1.ParallelPodManagement, PodManagementPolicy: appsv1.ParallelPodManagement,
Replicas: &replicasCopy, Replicas: &replicasCopy,
Selector: &metav1.LabelSelector{ Selector: &metav1.LabelSelector{
MatchLabels: labelMap(), MatchLabels: labelMap(),
@ -133,8 +134,8 @@ func newSTS(name, namespace string, replicas int) *v1beta1.StatefulSet {
}, },
}, },
ServiceName: "fake-service-name", ServiceName: "fake-service-name",
UpdateStrategy: v1beta1.StatefulSetUpdateStrategy{ UpdateStrategy: appsv1.StatefulSetUpdateStrategy{
Type: v1beta1.RollingUpdateStatefulSetStrategyType, Type: appsv1.RollingUpdateStatefulSetStrategyType,
}, },
VolumeClaimTemplates: []v1.PersistentVolumeClaim{ VolumeClaimTemplates: []v1.PersistentVolumeClaim{
// for volume mount "datadir" // for volume mount "datadir"
@ -204,11 +205,11 @@ func createHeadlessService(t *testing.T, clientSet clientset.Interface, headless
} }
} }
func createSTSsPods(t *testing.T, clientSet clientset.Interface, stss []*v1beta1.StatefulSet, pods []*v1.Pod) ([]*v1beta1.StatefulSet, []*v1.Pod) { func createSTSsPods(t *testing.T, clientSet clientset.Interface, stss []*appsv1.StatefulSet, pods []*v1.Pod) ([]*appsv1.StatefulSet, []*v1.Pod) {
var createdSTSs []*v1beta1.StatefulSet var createdSTSs []*appsv1.StatefulSet
var createdPods []*v1.Pod var createdPods []*v1.Pod
for _, sts := range stss { for _, sts := range stss {
createdSTS, err := clientSet.AppsV1beta1().StatefulSets(sts.Namespace).Create(sts) createdSTS, err := clientSet.AppsV1().StatefulSets(sts.Namespace).Create(sts)
if err != nil { if err != nil {
t.Fatalf("failed to create sts %s: %v", sts.Name, err) t.Fatalf("failed to create sts %s: %v", sts.Name, err)
} }
@ -226,15 +227,15 @@ func createSTSsPods(t *testing.T, clientSet clientset.Interface, stss []*v1beta1
} }
// Verify .Status.Replicas is equal to .Spec.Replicas // Verify .Status.Replicas is equal to .Spec.Replicas
func waitSTSStable(t *testing.T, clientSet clientset.Interface, sts *v1beta1.StatefulSet) { func waitSTSStable(t *testing.T, clientSet clientset.Interface, sts *appsv1.StatefulSet) {
stsClient := clientSet.AppsV1beta1().StatefulSets(sts.Namespace) stsClient := clientSet.AppsV1().StatefulSets(sts.Namespace)
desiredGeneration := sts.Generation desiredGeneration := sts.Generation
if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
newSTS, err := stsClient.Get(sts.Name, metav1.GetOptions{}) newSTS, err := stsClient.Get(sts.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err return false, err
} }
return newSTS.Status.Replicas == *newSTS.Spec.Replicas && *newSTS.Status.ObservedGeneration >= desiredGeneration, nil return newSTS.Status.Replicas == *newSTS.Spec.Replicas && newSTS.Status.ObservedGeneration >= desiredGeneration, nil
}); err != nil { }); err != nil {
t.Fatalf("failed to verify .Status.Replicas is equal to .Spec.Replicas for sts %s: %v", sts.Name, err) t.Fatalf("failed to verify .Status.Replicas is equal to .Spec.Replicas for sts %s: %v", sts.Name, err)
} }
@ -285,8 +286,8 @@ func getPods(t *testing.T, podClient typedv1.PodInterface, labelMap map[string]s
return pods return pods
} }
func updateSTS(t *testing.T, stsClient typedv1beta1.StatefulSetInterface, stsName string, updateFunc func(*v1beta1.StatefulSet)) *v1beta1.StatefulSet { func updateSTS(t *testing.T, stsClient typedappsv1.StatefulSetInterface, stsName string, updateFunc func(*appsv1.StatefulSet)) *appsv1.StatefulSet {
var sts *v1beta1.StatefulSet var sts *appsv1.StatefulSet
if err := retry.RetryOnConflict(retry.DefaultBackoff, func() error { if err := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
newSTS, err := stsClient.Get(stsName, metav1.GetOptions{}) newSTS, err := stsClient.Get(stsName, metav1.GetOptions{})
if err != nil { if err != nil {
@ -302,8 +303,8 @@ func updateSTS(t *testing.T, stsClient typedv1beta1.StatefulSetInterface, stsNam
} }
// Update .Spec.Replicas to replicas and verify .Status.Replicas is changed accordingly // Update .Spec.Replicas to replicas and verify .Status.Replicas is changed accordingly
func scaleSTS(t *testing.T, c clientset.Interface, sts *v1beta1.StatefulSet, replicas int32) { func scaleSTS(t *testing.T, c clientset.Interface, sts *appsv1.StatefulSet, replicas int32) {
stsClient := c.AppsV1beta1().StatefulSets(sts.Namespace) stsClient := c.AppsV1().StatefulSets(sts.Namespace)
if err := retry.RetryOnConflict(retry.DefaultBackoff, func() error { if err := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
newSTS, err := stsClient.Get(sts.Name, metav1.GetOptions{}) newSTS, err := stsClient.Get(sts.Name, metav1.GetOptions{})
if err != nil { if err != nil {