package integration
import (
"testing"
kapi "k8s.io/kubernetes/pkg/api"
kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"github.com/openshift/origin/pkg/client"
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
"github.com/openshift/origin/pkg/cmd/server/origin"
"github.com/openshift/origin/test/common/build"
testutil "github.com/openshift/origin/test/util"
testserver "github.com/openshift/origin/test/util/server"
)
type controllerCount struct {
BuildControllers,
BuildPodControllers,
ImageChangeControllers,
ConfigChangeControllers int
}
// TestConcurrentBuildControllers tests the transition of a build from new to pending. Ensures that only a single New -> Pending
// transition happens and that only a single pod is created during a set period of time.
func TestConcurrentBuildControllers(t *testing.T) {
defer testutil.DumpEtcdOnFailure(t)
// Start a master with multiple BuildControllers
osClient, kClient := setupBuildControllerTest(controllerCount{BuildControllers: 5}, t)
build.RunBuildControllerTest(t, osClient, kClient)
}
// TestConcurrentBuildPodControllers tests the lifecycle of a build pod when running multiple controllers.
func TestConcurrentBuildPodControllers(t *testing.T) {
defer testutil.DumpEtcdOnFailure(t)
// Start a master with multiple BuildPodControllers
osClient, kClient := setupBuildControllerTest(controllerCount{BuildPodControllers: 5}, t)
build.RunBuildPodControllerTest(t, osClient, kClient)
}
func TestConcurrentBuildImageChangeTriggerControllers(t *testing.T) {
defer testutil.DumpEtcdOnFailure(t)
// Start a master with multiple ImageChangeTrigger controllers
osClient, _ := setupBuildControllerTest(controllerCount{ImageChangeControllers: 5}, t)
build.RunImageChangeTriggerTest(t, osClient)
}
func TestBuildDeleteController(t *testing.T) {
defer testutil.DumpEtcdOnFailure(t)
osClient, kClient := setupBuildControllerTest(controllerCount{}, t)
build.RunBuildDeleteTest(t, osClient, kClient)
}
func TestBuildRunningPodDeleteController(t *testing.T) {
defer testutil.DumpEtcdOnFailure(t)
osClient, kClient := setupBuildControllerTest(controllerCount{}, t)
build.RunBuildRunningPodDeleteTest(t, osClient, kClient)
}
func TestBuildCompletePodDeleteController(t *testing.T) {
defer testutil.DumpEtcdOnFailure(t)
osClient, kClient := setupBuildControllerTest(controllerCount{}, t)
build.RunBuildCompletePodDeleteTest(t, osClient, kClient)
}
func TestConcurrentBuildConfigControllers(t *testing.T) {
defer testutil.DumpEtcdOnFailure(t)
osClient, kClient := setupBuildControllerTest(controllerCount{ConfigChangeControllers: 5}, t)
build.RunBuildConfigChangeControllerTest(t, osClient, kClient)
}
func setupBuildControllerTest(counts controllerCount, t *testing.T) (*client.Client, *kclientset.Clientset) {
testutil.RequireEtcd(t)
master, clusterAdminKubeConfig, err := testserver.StartTestMaster()
if err != nil {
t.Fatal(err)
}
clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
if err != nil {
t.Fatal(err)
}
clusterAdminKubeClientset, err := testutil.GetClusterAdminKubeClient(clusterAdminKubeConfig)
if err != nil {
t.Fatal(err)
}
_, err = clusterAdminKubeClientset.Core().Namespaces().Create(&kapi.Namespace{
ObjectMeta: kapi.ObjectMeta{Name: testutil.Namespace()},
})
if err != nil {
t.Fatal(err)
}
if err := testserver.WaitForServiceAccounts(clusterAdminKubeClientset, testutil.Namespace(), []string{bootstrappolicy.BuilderServiceAccountName, bootstrappolicy.DefaultServiceAccountName}); err != nil {
t.Fatalf("unexpected error: %v", err)
}
openshiftConfig, err := origin.BuildMasterConfig(*master)
if err != nil {
t.Fatal(err)
}
// Get the build controller clients, since those rely on service account tokens
// We don't want to proceed with the rest of the test until those are available
openshiftConfig.BuildControllerClients()
for i := 0; i < counts.BuildControllers; i++ {
openshiftConfig.RunBuildController(openshiftConfig.Informers)
}
for i := 0; i < counts.BuildPodControllers; i++ {
openshiftConfig.RunBuildPodController()
}
for i := 0; i < counts.ImageChangeControllers; i++ {
openshiftConfig.RunBuildImageChangeTriggerController()
}
for i := 0; i < counts.ConfigChangeControllers; i++ {
openshiftConfig.RunBuildConfigChangeController()
}
return clusterAdminClient, clusterAdminKubeClientset
}