Skip to content

Commit 4be5ebd

Browse files
committed
Add e2e test for Lease API
1 parent eadf68e commit 4be5ebd

File tree

2 files changed

+151
-0
lines changed

2 files changed

+151
-0
lines changed

test/e2e/common/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ go_library(
2424
"init_container.go",
2525
"kubelet.go",
2626
"kubelet_etc_hosts.go",
27+
"lease.go",
2728
"lifecycle_hook.go",
2829
"networking.go",
2930
"node_lease.go",
@@ -68,6 +69,7 @@ go_library(
6869
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
6970
"//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
7071
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
72+
"//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library",
7173
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
7274
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
7375
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",

test/e2e/common/lease.go

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/*
2+
Copyright 2019 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package common
18+
19+
import (
20+
"encoding/json"
21+
"fmt"
22+
"time"
23+
24+
coordinationv1 "k8s.io/api/coordination/v1"
25+
apiequality "k8s.io/apimachinery/pkg/api/equality"
26+
"k8s.io/apimachinery/pkg/api/errors"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
"k8s.io/apimachinery/pkg/labels"
29+
"k8s.io/apimachinery/pkg/types"
30+
"k8s.io/apimachinery/pkg/util/strategicpatch"
31+
"k8s.io/kubernetes/test/e2e/framework"
32+
"k8s.io/utils/pointer"
33+
34+
"github.com/onsi/ginkgo"
35+
)
36+
37+
func getPatchBytes(oldLease, newLease *coordinationv1.Lease) ([]byte, error) {
38+
oldData, err := json.Marshal(oldLease)
39+
if err != nil {
40+
return nil, fmt.Errorf("failed to Marshal oldData: %v", err)
41+
}
42+
newData, err := json.Marshal(newLease)
43+
if err != nil {
44+
return nil, fmt.Errorf("failed to Marshal newData: %v", err)
45+
}
46+
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, coordinationv1.Lease{})
47+
if err != nil {
48+
return nil, fmt.Errorf("failed to CreateTwoWayMergePatch: %v", err)
49+
}
50+
return patchBytes, nil
51+
}
52+
53+
var _ = framework.KubeDescribe("Lease", func() {
54+
f := framework.NewDefaultFramework("lease-test")
55+
56+
// TODO(wojtek-t): Promote to Conformance once proved to be stable.
57+
ginkgo.It("API should be available", func() {
58+
leaseClient := f.ClientSet.CoordinationV1().Leases(f.Namespace.Name)
59+
60+
name := "lease"
61+
lease := &coordinationv1.Lease{
62+
ObjectMeta: metav1.ObjectMeta{
63+
Name: name,
64+
},
65+
Spec: coordinationv1.LeaseSpec{
66+
HolderIdentity: pointer.StringPtr("holder"),
67+
LeaseDurationSeconds: pointer.Int32Ptr(30),
68+
AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(2 * time.Second)},
69+
RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(5 * time.Second)},
70+
LeaseTransitions: pointer.Int32Ptr(0),
71+
},
72+
}
73+
74+
createdLease, err := leaseClient.Create(lease)
75+
framework.ExpectNoError(err, "creating Lease failed")
76+
77+
readLease, err := leaseClient.Get(name, metav1.GetOptions{})
78+
framework.ExpectNoError(err, "couldn't read Lease")
79+
framework.ExpectEqual(apiequality.Semantic.DeepEqual(lease.Spec, readLease.Spec), true)
80+
81+
createdLease.Spec = coordinationv1.LeaseSpec{
82+
HolderIdentity: pointer.StringPtr("holder2"),
83+
LeaseDurationSeconds: pointer.Int32Ptr(30),
84+
AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(20 * time.Second)},
85+
RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(50 * time.Second)},
86+
LeaseTransitions: pointer.Int32Ptr(1),
87+
}
88+
89+
_, err = leaseClient.Update(createdLease)
90+
framework.ExpectNoError(err, "updating Lease failed")
91+
92+
readLease, err = leaseClient.Get(name, metav1.GetOptions{})
93+
framework.ExpectNoError(err, "couldn't read Lease")
94+
framework.ExpectEqual(apiequality.Semantic.DeepEqual(createdLease.Spec, readLease.Spec), true)
95+
96+
patchedLease := readLease.DeepCopy()
97+
patchedLease.Spec = coordinationv1.LeaseSpec{
98+
HolderIdentity: pointer.StringPtr("holder3"),
99+
LeaseDurationSeconds: pointer.Int32Ptr(60),
100+
AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(50 * time.Second)},
101+
RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(70 * time.Second)},
102+
LeaseTransitions: pointer.Int32Ptr(2),
103+
}
104+
patchBytes, err := getPatchBytes(readLease, patchedLease)
105+
framework.ExpectNoError(err, "creating patch failed")
106+
107+
_, err = leaseClient.Patch(name, types.StrategicMergePatchType, patchBytes)
108+
framework.ExpectNoError(err, "patching Lease failed")
109+
110+
readLease, err = leaseClient.Get(name, metav1.GetOptions{})
111+
framework.ExpectNoError(err, "couldn't read Lease")
112+
framework.ExpectEqual(apiequality.Semantic.DeepEqual(patchedLease.Spec, readLease.Spec), true)
113+
114+
name2 := "lease2"
115+
lease2 := &coordinationv1.Lease{
116+
ObjectMeta: metav1.ObjectMeta{
117+
Name: name2,
118+
Labels: map[string]string{"deletecollection": "true"},
119+
},
120+
Spec: coordinationv1.LeaseSpec{
121+
HolderIdentity: pointer.StringPtr("holder"),
122+
LeaseDurationSeconds: pointer.Int32Ptr(30),
123+
AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(2 * time.Second)},
124+
RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(5 * time.Second)},
125+
LeaseTransitions: pointer.Int32Ptr(0),
126+
},
127+
}
128+
_, err = leaseClient.Create(lease2)
129+
framework.ExpectNoError(err, "creating Lease failed")
130+
131+
leases, err := leaseClient.List(metav1.ListOptions{})
132+
framework.ExpectNoError(err, "couldn't list Leases")
133+
framework.ExpectEqual(len(leases.Items), 2)
134+
135+
selector := labels.Set(map[string]string{"deletecollection": "true"}).AsSelector()
136+
err = leaseClient.DeleteCollection(&metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: selector.String()})
137+
framework.ExpectNoError(err, "couldn't delete collection")
138+
139+
leases, err = leaseClient.List(metav1.ListOptions{})
140+
framework.ExpectNoError(err, "couldn't list Leases")
141+
framework.ExpectEqual(len(leases.Items), 1)
142+
143+
err = leaseClient.Delete(name, &metav1.DeleteOptions{})
144+
framework.ExpectNoError(err, "deleting Lease failed")
145+
146+
_, err = leaseClient.Get(name, metav1.GetOptions{})
147+
framework.ExpectEqual(errors.IsNotFound(err), true)
148+
})
149+
})

0 commit comments

Comments
 (0)