mirror of https://github.com/knative/pkg.git
117 lines
3.9 KiB
Go
117 lines
3.9 KiB
Go
/*
|
|
Copyright 2019 The Knative Authors
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package testing
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
fakeapixclient "knative.dev/pkg/client/injection/apiextensions/client/fake"
|
|
fakekubeclient "knative.dev/pkg/client/injection/kube/client/fake"
|
|
fakedynamicclient "knative.dev/pkg/injection/clients/dynamicclient/fake"
|
|
"knative.dev/pkg/reconciler"
|
|
|
|
"knative.dev/pkg/configmap"
|
|
"knative.dev/pkg/controller"
|
|
"knative.dev/pkg/logging"
|
|
logtesting "knative.dev/pkg/logging/testing"
|
|
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
ktesting "k8s.io/client-go/testing"
|
|
"k8s.io/client-go/tools/record"
|
|
|
|
rtesting "knative.dev/pkg/reconciler/testing"
|
|
)
|
|
|
|
const (
|
|
// maxEventBufferSize is the estimated max number of event notifications that
|
|
// can be buffered during reconciliation.
|
|
maxEventBufferSize = 10
|
|
)
|
|
|
|
// Ctor functions create a k8s controller with given params.
|
|
type Ctor func(context.Context, *Listers, configmap.Watcher) controller.Reconciler
|
|
|
|
// MakeFactory creates a reconciler factory with fake clients and controller created by `ctor`.
|
|
func MakeFactory(ctor Ctor) rtesting.Factory {
|
|
return func(t *testing.T, r *rtesting.TableRow) (
|
|
controller.Reconciler, rtesting.ActionRecorderList, rtesting.EventList) {
|
|
ls := NewListers(r.Objects)
|
|
|
|
ctx := r.Ctx
|
|
if ctx == nil {
|
|
ctx = context.Background()
|
|
}
|
|
logger := logtesting.TestLogger(t)
|
|
ctx = logging.WithLogger(ctx, logger)
|
|
|
|
ctx, kubeClient := fakekubeclient.With(ctx, ls.GetKubeObjects()...)
|
|
ctx, apixClient := fakeapixclient.With(ctx, ls.GetAPIExtensionsObjects()...)
|
|
ctx, dynamicClient := fakedynamicclient.With(ctx, ls.NewScheme(), r.Objects...)
|
|
|
|
// The dynamic client's support for patching is BS. Implement it
|
|
// here via PrependReactor (this can be overridden below by the
|
|
// provided reactors).
|
|
dynamicClient.PrependReactor("patch", "*",
|
|
func(action ktesting.Action) (bool, runtime.Object, error) {
|
|
return true, nil, nil
|
|
})
|
|
|
|
eventRecorder := record.NewFakeRecorder(maxEventBufferSize)
|
|
ctx = controller.WithEventRecorder(ctx, eventRecorder)
|
|
|
|
// This is needed for the tests that use generated names and
|
|
// the object cannot be created beforehand.
|
|
kubeClient.PrependReactor("create", "*",
|
|
func(action ktesting.Action) (bool, runtime.Object, error) {
|
|
ca := action.(ktesting.CreateAction)
|
|
ls.IndexerFor(ca.GetObject()).Add(ca.GetObject())
|
|
return false, nil, nil
|
|
},
|
|
)
|
|
apixClient.PrependReactor("create", "*",
|
|
func(action ktesting.Action) (bool, runtime.Object, error) {
|
|
ca := action.(ktesting.CreateAction)
|
|
ls.IndexerFor(ca.GetObject()).Add(ca.GetObject())
|
|
return false, nil, nil
|
|
},
|
|
)
|
|
|
|
// Set up our Controller from the fakes.
|
|
c := ctor(ctx, &ls, configmap.NewStaticWatcher())
|
|
// Update the context with the stuff we decorated it with.
|
|
r.Ctx = ctx
|
|
|
|
// If the reconcilers is leader aware, then promote it.
|
|
if la, ok := c.(reconciler.LeaderAware); ok {
|
|
la.Promote(reconciler.UniversalBucket(), func(reconciler.Bucket, types.NamespacedName) {})
|
|
}
|
|
|
|
for _, reactor := range r.WithReactors {
|
|
kubeClient.PrependReactor("*", "*", reactor)
|
|
apixClient.PrependReactor("*", "*", reactor)
|
|
dynamicClient.PrependReactor("*", "*", reactor)
|
|
}
|
|
|
|
actionRecorderList := rtesting.ActionRecorderList{dynamicClient, kubeClient, apixClient}
|
|
eventList := rtesting.EventList{Recorder: eventRecorder}
|
|
|
|
return c, actionRecorderList, eventList
|
|
}
|
|
}
|