Skip to content

Commit 6ce4b23

Browse files
author
Jim Minter
committed
embed clock interface into templateinstance controller for testing
1 parent 53d15ef commit 6ce4b23

File tree

3 files changed

+30
-12
lines changed

3 files changed

+30
-12
lines changed

pkg/template/controller/readiness_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ func TestCheckReadiness(t *testing.T) {
194194
groupKind: batch.Kind("Job"),
195195
object: &batch.Job{
196196
Status: batch.JobStatus{
197-
CompletionTime: &metav1.Time{Time: time.Now()},
197+
CompletionTime: &metav1.Time{Time: time.Unix(0, 0)},
198198
},
199199
},
200200
expectedReady: true,

pkg/template/controller/templateinstance_controller.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
kapi "k8s.io/kubernetes/pkg/apis/core"
2727
kclientsetinternal "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
2828
"k8s.io/kubernetes/pkg/kubectl/resource"
29+
"k8s.io/utils/clock"
2930

3031
"github.com/golang/glog"
3132
"github.com/prometheus/client_golang/prometheus"
@@ -66,6 +67,8 @@ type TemplateInstanceController struct {
6667
queue workqueue.RateLimitingInterface
6768

6869
readinessLimiter workqueue.RateLimiter
70+
71+
clock clock.Clock
6972
}
7073

7174
// NewTemplateInstanceController returns a new TemplateInstanceController.
@@ -80,6 +83,7 @@ func NewTemplateInstanceController(config *rest.Config, kc kclientsetinternal.In
8083
informer: informer.Informer(),
8184
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "openshift_template_instance_controller"),
8285
readinessLimiter: workqueue.NewItemFastSlowRateLimiter(5*time.Second, 20*time.Second, 200),
86+
clock: clock.RealClock{},
8387
}
8488

8589
c.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
@@ -144,7 +148,7 @@ func (c *TemplateInstanceController) sync(key string) error {
144148
}
145149

146150
if !templateInstance.HasCondition(templateapi.TemplateInstanceInstantiateFailure, kapi.ConditionTrue) {
147-
ready, err := c.checkReadiness(templateInstance, time.Now())
151+
ready, err := c.checkReadiness(templateInstance)
148152
if err != nil && !kerrors.IsTimeout(err) {
149153
// NB: kerrors.IsTimeout() is true in the case of an API server
150154
// timeout, not the timeout caused by readinessTimeout expiring.
@@ -196,8 +200,8 @@ func (c *TemplateInstanceController) sync(key string) error {
196200
return nil
197201
}
198202

199-
func (c *TemplateInstanceController) checkReadiness(templateInstance *templateapi.TemplateInstance, now time.Time) (bool, error) {
200-
if now.After(templateInstance.CreationTimestamp.Add(readinessTimeout)) {
203+
func (c *TemplateInstanceController) checkReadiness(templateInstance *templateapi.TemplateInstance) (bool, error) {
204+
if c.clock.Now().After(templateInstance.CreationTimestamp.Add(readinessTimeout)) {
201205
return false, fmt.Errorf("Timeout")
202206
}
203207

pkg/template/controller/templateinstance_controller_test.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"k8s.io/kubernetes/pkg/apis/authorization"
1717
kapi "k8s.io/kubernetes/pkg/apis/core"
1818
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
19+
"k8s.io/utils/clock"
1920

2021
templateapi "github.com/openshift/origin/pkg/template/apis/template"
2122
restutil "github.com/openshift/origin/pkg/util/rest"
@@ -27,10 +28,21 @@ func (rt roundtripper) RoundTrip(r *http.Request) (*http.Response, error) {
2728
return rt(r)
2829
}
2930

31+
type fakeClock struct {
32+
clock.RealClock
33+
now time.Time
34+
}
35+
36+
func (f *fakeClock) Now() time.Time {
37+
return f.now
38+
}
39+
3040
// TestControllerCheckReadiness verifies the basic behaviour of
3141
// TemplateInstanceController.checkReadiness(): that it can return ready, not
3242
// ready and timed out correctly.
3343
func TestControllerCheckReadiness(t *testing.T) {
44+
clock := &fakeClock{now: time.Unix(0, 0)}
45+
3446
job := batchv1.Job{
3547
TypeMeta: metav1.TypeMeta{
3648
APIVersion: "batch/v1",
@@ -66,15 +78,15 @@ func TestControllerCheckReadiness(t *testing.T) {
6678
restmapper: restutil.DefaultMultiRESTMapper(),
6779
kc: fakeclientset,
6880
config: fakerestconfig,
81+
clock: clock,
6982
}
7083
fakeclientset.AddReactor("create", "subjectaccessreviews", func(action clientgotesting.Action) (handled bool, ret runtime.Object, err error) {
7184
return true, &authorization.SubjectAccessReview{Status: authorization.SubjectAccessReviewStatus{Allowed: true}}, nil
7285
})
7386

74-
now := time.Now()
7587
templateInstance := &templateapi.TemplateInstance{
7688
ObjectMeta: metav1.ObjectMeta{
77-
CreationTimestamp: metav1.Time{Time: now},
89+
CreationTimestamp: metav1.Time{Time: clock.now},
7890
},
7991
Spec: templateapi.TemplateInstanceSpec{
8092
Requester: &templateapi.TemplateInstanceRequester{},
@@ -94,27 +106,29 @@ func TestControllerCheckReadiness(t *testing.T) {
94106
}
95107

96108
// should report not ready yet
97-
ready, err := c.checkReadiness(templateInstance, now)
109+
ready, err := c.checkReadiness(templateInstance)
98110
if ready || err != nil {
99111
t.Error(ready, err)
100112
}
101113

102114
// should report timed out
103-
ready, err = c.checkReadiness(templateInstance, now.Add(readinessTimeout+1))
115+
clock.now = clock.now.Add(readinessTimeout + 1)
116+
ready, err = c.checkReadiness(templateInstance)
104117
if ready || err == nil || err.Error() != "Timeout" {
105118
t.Error(ready, err)
106119
}
107120

108121
// should report ready
109-
job.Status.CompletionTime = &metav1.Time{Time: now}
110-
ready, err = c.checkReadiness(templateInstance, now)
122+
clock.now = time.Unix(0, 0)
123+
job.Status.CompletionTime = &metav1.Time{Time: clock.now}
124+
ready, err = c.checkReadiness(templateInstance)
111125
if !ready || err != nil {
112126
t.Error(ready, err)
113127
}
114128

115129
// should report failed
116-
job.Status.Failed = int32(1)
117-
ready, err = c.checkReadiness(templateInstance, now)
130+
job.Status.Failed = 1
131+
ready, err = c.checkReadiness(templateInstance)
118132
if ready || err == nil || err.Error() != "Readiness failed on Job namespace/name" {
119133
t.Error(ready, err)
120134
}

0 commit comments

Comments
 (0)