mirror of https://github.com/k3s-io/k3s
Merge pull request #61933 from hanxiaoshuai/cleanup0330
Automatic merge from submit-queue (batch tested with PRs 59035, 61933). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. add TestGeneration in customresource/etcd_test.go **What this PR does / why we need it**: add TestGeneration in customresource/etcd_test.go **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes # **Special notes for your reviewer**: **Release note**: ```release-note NONE ```pull/8/head
commit
d4ded15f8a
|
@ -158,6 +158,9 @@ func TestGenerationNumber(t *testing.T) {
|
||||||
modifiedSno.Status.ObservedGeneration = 10
|
modifiedSno.Status.ObservedGeneration = 10
|
||||||
ctx := genericapirequest.NewDefaultContext()
|
ctx := genericapirequest.NewDefaultContext()
|
||||||
rs, err := createReplicaSet(storage.ReplicaSet, modifiedSno, t)
|
rs, err := createReplicaSet(storage.ReplicaSet, modifiedSno, t)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
etcdRS, err := storage.ReplicaSet.Get(ctx, rs.Name, &metav1.GetOptions{})
|
etcdRS, err := storage.ReplicaSet.Get(ctx, rs.Name, &metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
@ -165,14 +168,13 @@ func TestGenerationNumber(t *testing.T) {
|
||||||
storedRS, _ := etcdRS.(*extensions.ReplicaSet)
|
storedRS, _ := etcdRS.(*extensions.ReplicaSet)
|
||||||
|
|
||||||
// Generation initialization
|
// Generation initialization
|
||||||
if storedRS.Generation != 1 && storedRS.Status.ObservedGeneration != 0 {
|
if storedRS.Generation != 1 || storedRS.Status.ObservedGeneration != 0 {
|
||||||
t.Fatalf("Unexpected generation number %v, status generation %v", storedRS.Generation, storedRS.Status.ObservedGeneration)
|
t.Fatalf("Unexpected generation number %v, status generation %v", storedRS.Generation, storedRS.Status.ObservedGeneration)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Updates to spec should increment the generation number
|
// Updates to spec should increment the generation number
|
||||||
storedRS.Spec.Replicas += 1
|
storedRS.Spec.Replicas += 1
|
||||||
storage.ReplicaSet.Update(ctx, storedRS.Name, rest.DefaultUpdatedObjectInfo(storedRS), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc)
|
if _, _, err := storage.ReplicaSet.Update(ctx, storedRS.Name, rest.DefaultUpdatedObjectInfo(storedRS), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc); err != nil {
|
||||||
if err != nil {
|
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
etcdRS, err = storage.ReplicaSet.Get(ctx, rs.Name, &metav1.GetOptions{})
|
etcdRS, err = storage.ReplicaSet.Get(ctx, rs.Name, &metav1.GetOptions{})
|
||||||
|
@ -186,8 +188,7 @@ func TestGenerationNumber(t *testing.T) {
|
||||||
|
|
||||||
// Updates to status should not increment either spec or status generation numbers
|
// Updates to status should not increment either spec or status generation numbers
|
||||||
storedRS.Status.Replicas += 1
|
storedRS.Status.Replicas += 1
|
||||||
storage.ReplicaSet.Update(ctx, storedRS.Name, rest.DefaultUpdatedObjectInfo(storedRS), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc)
|
if _, _, err := storage.ReplicaSet.Update(ctx, storedRS.Name, rest.DefaultUpdatedObjectInfo(storedRS), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc); err != nil {
|
||||||
if err != nil {
|
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
etcdRS, err = storage.ReplicaSet.Get(ctx, rs.Name, &metav1.GetOptions{})
|
etcdRS, err = storage.ReplicaSet.Get(ctx, rs.Name, &metav1.GetOptions{})
|
||||||
|
|
|
@ -161,6 +161,9 @@ func TestGenerationNumber(t *testing.T) {
|
||||||
modifiedSno.Status.ObservedGeneration = 10
|
modifiedSno.Status.ObservedGeneration = 10
|
||||||
ctx := genericapirequest.NewDefaultContext()
|
ctx := genericapirequest.NewDefaultContext()
|
||||||
rc, err := createController(storage.Controller, modifiedSno, t)
|
rc, err := createController(storage.Controller, modifiedSno, t)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
ctrl, err := storage.Controller.Get(ctx, rc.Name, &metav1.GetOptions{})
|
ctrl, err := storage.Controller.Get(ctx, rc.Name, &metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
@ -168,7 +171,7 @@ func TestGenerationNumber(t *testing.T) {
|
||||||
controller, _ := ctrl.(*api.ReplicationController)
|
controller, _ := ctrl.(*api.ReplicationController)
|
||||||
|
|
||||||
// Generation initialization
|
// Generation initialization
|
||||||
if controller.Generation != 1 && controller.Status.ObservedGeneration != 0 {
|
if controller.Generation != 1 || controller.Status.ObservedGeneration != 0 {
|
||||||
t.Fatalf("Unexpected generation number %v, status generation %v", controller.Generation, controller.Status.ObservedGeneration)
|
t.Fatalf("Unexpected generation number %v, status generation %v", controller.Generation, controller.Status.ObservedGeneration)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@ go_test(
|
||||||
"//vendor/k8s.io/api/autoscaling/v1:go_default_library",
|
"//vendor/k8s.io/api/autoscaling/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
"//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library",
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library",
|
||||||
"//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource:go_default_library",
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource:go_default_library",
|
||||||
"//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:go_default_library",
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
|
@ -82,6 +83,8 @@ go_test(
|
||||||
"//vendor/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/pkg/storage/etcd/testing:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/storage/etcd/testing:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/discovery:go_default_library",
|
"//vendor/k8s.io/client-go/discovery:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -35,10 +35,13 @@ import (
|
||||||
registrytest "k8s.io/apiserver/pkg/registry/generic/testing"
|
registrytest "k8s.io/apiserver/pkg/registry/generic/testing"
|
||||||
"k8s.io/apiserver/pkg/registry/rest"
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing"
|
etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
||||||
"k8s.io/client-go/discovery"
|
"k8s.io/client-go/discovery"
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apiserver"
|
"k8s.io/apiextensions-apiserver/pkg/apiserver"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/features"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/registry/customresource"
|
"k8s.io/apiextensions-apiserver/pkg/registry/customresource"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor"
|
"k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor"
|
||||||
)
|
)
|
||||||
|
@ -160,6 +163,61 @@ func TestDelete(t *testing.T) {
|
||||||
test.TestDelete(validNewCustomResource())
|
test.TestDelete(validNewCustomResource())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGenerationNumber(t *testing.T) {
|
||||||
|
// enable alpha feature CustomResourceSubresources
|
||||||
|
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)()
|
||||||
|
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.CustomResource.Store.DestroyFunc()
|
||||||
|
modifiedRno := *validNewCustomResource()
|
||||||
|
modifiedRno.SetGeneration(10)
|
||||||
|
ctx := genericapirequest.NewDefaultContext()
|
||||||
|
cr, err := createCustomResource(storage.CustomResource, modifiedRno, t)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
etcdCR, err := storage.CustomResource.Get(ctx, cr.GetName(), &metav1.GetOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
storedCR, _ := etcdCR.(*unstructured.Unstructured)
|
||||||
|
|
||||||
|
// Generation initialization
|
||||||
|
if storedCR.GetGeneration() != 1 {
|
||||||
|
t.Fatalf("Unexpected generation number %v", storedCR.GetGeneration())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updates to spec should increment the generation number
|
||||||
|
setSpecReplicas(storedCR, getSpecReplicas(storedCR)+1)
|
||||||
|
if _, _, err := storage.CustomResource.Update(ctx, storedCR.GetName(), rest.DefaultUpdatedObjectInfo(storedCR), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc); err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
etcdCR, err = storage.CustomResource.Get(ctx, cr.GetName(), &metav1.GetOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
storedCR, _ = etcdCR.(*unstructured.Unstructured)
|
||||||
|
if storedCR.GetGeneration() != 2 {
|
||||||
|
t.Fatalf("Unexpected generation, spec: %v", storedCR.GetGeneration())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updates to status should not increment the generation number
|
||||||
|
setStatusReplicas(storedCR, getStatusReplicas(storedCR)+1)
|
||||||
|
if _, _, err := storage.CustomResource.Update(ctx, storedCR.GetName(), rest.DefaultUpdatedObjectInfo(storedCR), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc); err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
etcdCR, err = storage.CustomResource.Get(ctx, cr.GetName(), &metav1.GetOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
storedCR, _ = etcdCR.(*unstructured.Unstructured)
|
||||||
|
if storedCR.GetGeneration() != 2 {
|
||||||
|
t.Fatalf("Unexpected generation, spec: %v", storedCR.GetGeneration())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func TestCategories(t *testing.T) {
|
func TestCategories(t *testing.T) {
|
||||||
storage, server := newStorage(t)
|
storage, server := newStorage(t)
|
||||||
defer server.Terminate(t)
|
defer server.Terminate(t)
|
||||||
|
@ -398,3 +456,34 @@ func (c unstructuredJsonCodec) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
w.Write(bs)
|
w.Write(bs)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setSpecReplicas(u *unstructured.Unstructured, replicas int64) {
|
||||||
|
setNestedField(u, replicas, "spec", "replicas")
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSpecReplicas(u *unstructured.Unstructured) int64 {
|
||||||
|
val, found, err := unstructured.NestedInt64(u.Object, "spec", "replicas")
|
||||||
|
if !found || err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
func setStatusReplicas(u *unstructured.Unstructured, replicas int64) {
|
||||||
|
setNestedField(u, replicas, "status", "replicas")
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStatusReplicas(u *unstructured.Unstructured) int64 {
|
||||||
|
val, found, err := unstructured.NestedInt64(u.Object, "status", "replicas")
|
||||||
|
if !found || err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
func setNestedField(u *unstructured.Unstructured, value interface{}, fields ...string) {
|
||||||
|
if u.Object == nil {
|
||||||
|
u.Object = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
unstructured.SetNestedField(u.Object, value, fields...)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue