package generictrigger
import (
"testing"
"time"
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/cache"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
ktestclient "k8s.io/kubernetes/pkg/client/unversioned/testclient"
"k8s.io/kubernetes/pkg/controller/framework"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/watch"
"github.com/openshift/origin/pkg/client/testclient"
deployapi "github.com/openshift/origin/pkg/deploy/api"
_ "github.com/openshift/origin/pkg/deploy/api/install"
testapi "github.com/openshift/origin/pkg/deploy/api/test"
deployv1 "github.com/openshift/origin/pkg/deploy/api/v1"
imageapi "github.com/openshift/origin/pkg/image/api"
)
var (
codec = kapi.Codecs.LegacyCodec(deployv1.SchemeGroupVersion)
dcInformer = framework.NewSharedIndexInformer(
&cache.ListWatch{
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
return (&testclient.Fake{}).DeploymentConfigs(kapi.NamespaceAll).List(options)
},
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
return (&testclient.Fake{}).DeploymentConfigs(kapi.NamespaceAll).Watch(options)
},
},
&deployapi.DeploymentConfig{},
2*time.Minute,
cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc},
)
rcInformer = framework.NewSharedIndexInformer(
&cache.ListWatch{
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
return (fake.NewSimpleClientset()).Core().ReplicationControllers(kapi.NamespaceAll).List(options)
},
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
return (fake.NewSimpleClientset()).Core().ReplicationControllers(kapi.NamespaceAll).Watch(options)
},
},
&kapi.ReplicationController{},
2*time.Minute,
cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc},
)
streamInformer = framework.NewSharedIndexInformer(
&cache.ListWatch{
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
return (&testclient.Fake{}).ImageStreams(kapi.NamespaceAll).List(options)
},
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
return (&testclient.Fake{}).ImageStreams(kapi.NamespaceAll).Watch(options)
},
},
&imageapi.ImageStream{},
2*time.Minute,
cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc},
)
)
// TestHandle_noTriggers ensures that a change to a config with no
// triggers doesn't result in a config instantiation.
func TestHandle_noTriggers(t *testing.T) {
fake := &testclient.Fake{}
controller := NewDeploymentTriggerController(dcInformer, rcInformer, streamInformer, fake, codec)
config := testapi.OkDeploymentConfig(1)
config.Namespace = kapi.NamespaceDefault
config.Spec.Triggers = []deployapi.DeploymentTriggerPolicy{}
if err := controller.Handle(config); err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(fake.Actions()) > 0 {
t.Fatalf("unexpected actions: %v", fake.Actions())
}
}
// TestHandle_pausedConfig ensures that a paused config will not be instantiated.
func TestHandle_pausedConfig(t *testing.T) {
fake := &testclient.Fake{}
controller := NewDeploymentTriggerController(dcInformer, rcInformer, streamInformer, fake, codec)
config := testapi.OkDeploymentConfig(1)
config.Namespace = kapi.NamespaceDefault
config.Spec.Paused = true
if err := controller.Handle(config); err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(fake.Actions()) > 0 {
t.Fatalf("unexpected actions: %v", fake.Actions())
}
}
// TestHandle_configChangeTrigger ensures that a config with a config change
// trigger will be reconciled.
func TestHandle_configChangeTrigger(t *testing.T) {
updated := false
fake := &testclient.Fake{}
fake.AddReactor("update", "deploymentconfigs/instantiate", func(action ktestclient.Action) (handled bool, ret runtime.Object, err error) {
updated = true
return true, nil, nil
})
controller := NewDeploymentTriggerController(dcInformer, rcInformer, streamInformer, fake, codec)
config := testapi.OkDeploymentConfig(0)
config.Namespace = kapi.NamespaceDefault
config.Spec.Triggers = []deployapi.DeploymentTriggerPolicy{testapi.OkConfigChangeTrigger()}
if err := controller.Handle(config); err != nil {
t.Fatalf("unexpected error: %v", err)
}
if !updated {
t.Fatalf("expected config to be instantiated")
}
}
// TestHandle_imageChangeTrigger ensures that a config with an image change
// trigger will be reconciled.
func TestHandle_imageChangeTrigger(t *testing.T) {
updated := false
fake := &testclient.Fake{}
fake.AddReactor("update", "deploymentconfigs/instantiate", func(action ktestclient.Action) (handled bool, ret runtime.Object, err error) {
updated = true
return true, nil, nil
})
controller := NewDeploymentTriggerController(dcInformer, rcInformer, streamInformer, fake, codec)
config := testapi.OkDeploymentConfig(0)
config.Namespace = kapi.NamespaceDefault
config.Spec.Triggers = []deployapi.DeploymentTriggerPolicy{testapi.OkImageChangeTrigger()}
if err := controller.Handle(config); err != nil {
t.Fatalf("unexpected error: %v", err)
}
if !updated {
t.Fatalf("expected config to be instantiated")
}
}