test/integration/buildpod_admission_test.go
bc6edcca
 package integration
 
 import (
 	"reflect"
c1e03fe1
 	"strings"
bc6edcca
 	"testing"
 	"time"
 
 	kapi "k8s.io/kubernetes/pkg/api"
97e6f1de
 	kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
bc6edcca
 	"k8s.io/kubernetes/pkg/fields"
 	watchapi "k8s.io/kubernetes/pkg/watch"
 
316359e2
 	defaultsapi "github.com/openshift/origin/pkg/build/admission/defaults/api"
 	overridesapi "github.com/openshift/origin/pkg/build/admission/overrides/api"
bc6edcca
 	buildtestutil "github.com/openshift/origin/pkg/build/admission/testutil"
 	buildapi "github.com/openshift/origin/pkg/build/api"
 	"github.com/openshift/origin/pkg/client"
 	configapi "github.com/openshift/origin/pkg/cmd/server/api"
 	"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
 	testutil "github.com/openshift/origin/test/util"
 	testserver "github.com/openshift/origin/test/util/server"
 )
 
e2e8cf3d
 var buildPodAdmissionTestTimeout time.Duration = 30 * time.Second
bc6edcca
 
 func TestBuildDefaultGitHTTPProxy(t *testing.T) {
9f6552c6
 	defer testutil.DumpEtcdOnFailure(t)
bc6edcca
 	httpProxy := "http://my.test.proxy:12345"
97e6f1de
 	oclient, kclientset := setupBuildDefaultsAdmissionTest(t, &defaultsapi.BuildDefaultsConfig{
bc6edcca
 		GitHTTPProxy: httpProxy,
 	})
97e6f1de
 	build, _ := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
bc6edcca
 	if actual := build.Spec.Source.Git.HTTPProxy; actual == nil || *actual != httpProxy {
 		t.Errorf("Resulting build did not get expected HTTP proxy: %v", actual)
 	}
 }
 
 func TestBuildDefaultGitHTTPSProxy(t *testing.T) {
9f6552c6
 	defer testutil.DumpEtcdOnFailure(t)
bc6edcca
 	httpsProxy := "https://my.test.proxy:12345"
97e6f1de
 	oclient, kclientset := setupBuildDefaultsAdmissionTest(t, &defaultsapi.BuildDefaultsConfig{
bc6edcca
 		GitHTTPSProxy: httpsProxy,
 	})
97e6f1de
 	build, _ := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
bc6edcca
 	if actual := build.Spec.Source.Git.HTTPSProxy; actual == nil || *actual != httpsProxy {
 		t.Errorf("Resulting build did not get expected HTTPS proxy: %v", actual)
 	}
 }
 
 func TestBuildDefaultEnvironment(t *testing.T) {
9f6552c6
 	defer testutil.DumpEtcdOnFailure(t)
bc6edcca
 	env := []kapi.EnvVar{
 		{
 			Name:  "VAR1",
 			Value: "VALUE1",
 		},
 		{
 			Name:  "VAR2",
 			Value: "VALUE2",
 		},
 	}
97e6f1de
 	oclient, kclientset := setupBuildDefaultsAdmissionTest(t, &defaultsapi.BuildDefaultsConfig{
bc6edcca
 		Env: env,
 	})
97e6f1de
 	build, _ := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
bc6edcca
 	if actual := build.Spec.Strategy.DockerStrategy.Env; !reflect.DeepEqual(env, actual) {
 		t.Errorf("Resulting build did not get expected environment: %v", actual)
 	}
 }
 
c1e03fe1
 func TestBuildDefaultLabels(t *testing.T) {
 	defer testutil.DumpEtcdOnFailure(t)
 	labels := []buildapi.ImageLabel{{Name: "KEY", Value: "VALUE"}}
97e6f1de
 	oclient, kclientset := setupBuildDefaultsAdmissionTest(t, &defaultsapi.BuildDefaultsConfig{
c1e03fe1
 		ImageLabels: labels,
 	})
97e6f1de
 	build, _ := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
c1e03fe1
 	if actual := build.Spec.Output.ImageLabels; !reflect.DeepEqual(labels, actual) {
 		t.Errorf("Resulting build did not get expected labels: %v", actual)
 	}
 }
 
 func TestBuildDefaultNodeSelectors(t *testing.T) {
 	defer testutil.DumpEtcdOnFailure(t)
 	selectors := map[string]string{"KEY": "VALUE"}
97e6f1de
 	oclient, kclientset := setupBuildDefaultsAdmissionTest(t, &defaultsapi.BuildDefaultsConfig{
c1e03fe1
 		NodeSelector: selectors,
 	})
97e6f1de
 	_, pod := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
c1e03fe1
 	if actual := pod.Spec.NodeSelector; !reflect.DeepEqual(selectors, actual) {
 		t.Errorf("Resulting pod did not get expected nodeselectors: %v", actual)
 	}
 }
 
 func TestBuildDefaultAnnotations(t *testing.T) {
 	defer testutil.DumpEtcdOnFailure(t)
 	annotations := map[string]string{"KEY": "VALUE"}
97e6f1de
 	oclient, kclientset := setupBuildDefaultsAdmissionTest(t, &defaultsapi.BuildDefaultsConfig{
c1e03fe1
 		Annotations: annotations,
 	})
97e6f1de
 	_, pod := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
c1e03fe1
 	if actual := pod.Annotations; strings.Compare(actual["KEY"], annotations["KEY"]) != 0 {
 		t.Errorf("Resulting pod did not get expected annotations: actual: %v, expected: %v", actual["KEY"], annotations["KEY"])
 	}
 }
 
bc6edcca
 func TestBuildOverrideForcePull(t *testing.T) {
9f6552c6
 	defer testutil.DumpEtcdOnFailure(t)
97e6f1de
 	oclient, kclientset := setupBuildOverridesAdmissionTest(t, &overridesapi.BuildOverridesConfig{
bc6edcca
 		ForcePull: true,
 	})
97e6f1de
 	build, _ := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
bc6edcca
 	if !build.Spec.Strategy.DockerStrategy.ForcePull {
 		t.Errorf("ForcePull was not set on resulting build")
 	}
 }
 
 func TestBuildOverrideForcePullCustomStrategy(t *testing.T) {
9f6552c6
 	defer testutil.DumpEtcdOnFailure(t)
97e6f1de
 	oclient, kclientset := setupBuildOverridesAdmissionTest(t, &overridesapi.BuildOverridesConfig{
bc6edcca
 		ForcePull: true,
 	})
97e6f1de
 	build, pod := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestCustomBuild())
bc6edcca
 	if pod.Spec.Containers[0].ImagePullPolicy != kapi.PullAlways {
 		t.Errorf("Pod ImagePullPolicy is not PullAlways")
 	}
 	if !build.Spec.Strategy.CustomStrategy.ForcePull {
 		t.Errorf("ForcePull was not set on resulting build")
 	}
 }
 
c1e03fe1
 func TestBuildOverrideLabels(t *testing.T) {
 	defer testutil.DumpEtcdOnFailure(t)
 	labels := []buildapi.ImageLabel{{Name: "KEY", Value: "VALUE"}}
97e6f1de
 	oclient, kclientset := setupBuildOverridesAdmissionTest(t, &overridesapi.BuildOverridesConfig{
c1e03fe1
 		ImageLabels: labels,
 	})
97e6f1de
 	build, _ := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
c1e03fe1
 	if actual := build.Spec.Output.ImageLabels; !reflect.DeepEqual(labels, actual) {
 		t.Errorf("Resulting build did not get expected labels: %v", actual)
 	}
 }
 
 func TestBuildOverrideNodeSelectors(t *testing.T) {
 	defer testutil.DumpEtcdOnFailure(t)
 	selectors := map[string]string{"KEY": "VALUE"}
97e6f1de
 	oclient, kclientset := setupBuildOverridesAdmissionTest(t, &overridesapi.BuildOverridesConfig{
c1e03fe1
 		NodeSelector: selectors,
 	})
97e6f1de
 	_, pod := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
c1e03fe1
 	if actual := pod.Spec.NodeSelector; !reflect.DeepEqual(selectors, actual) {
 		t.Errorf("Resulting build did not get expected nodeselectors: %v", actual)
 	}
 }
 
 func TestBuildOverrideAnnotations(t *testing.T) {
 	defer testutil.DumpEtcdOnFailure(t)
 	annotations := map[string]string{"KEY": "VALUE"}
97e6f1de
 	oclient, kclientset := setupBuildOverridesAdmissionTest(t, &overridesapi.BuildOverridesConfig{
c1e03fe1
 		Annotations: annotations,
 	})
97e6f1de
 	_, pod := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
c1e03fe1
 	if actual := pod.Annotations; strings.Compare(actual["KEY"], annotations["KEY"]) != 0 {
 		t.Errorf("Resulting build did not get expected annotations: %v", actual)
 	}
 }
 
bc6edcca
 func buildPodAdmissionTestCustomBuild() *buildapi.Build {
bd47008d
 	build := &buildapi.Build{ObjectMeta: kapi.ObjectMeta{
 		Labels: map[string]string{
 			buildapi.BuildConfigLabel:    "mock-build-config",
 			buildapi.BuildRunPolicyLabel: string(buildapi.BuildRunPolicyParallel),
 		},
 	}}
bc6edcca
 	build.Name = "test-custom-build"
 	build.Spec.Source.Git = &buildapi.GitBuildSource{URI: "http://test/src"}
 	build.Spec.Strategy.CustomStrategy = &buildapi.CustomBuildStrategy{}
 	build.Spec.Strategy.CustomStrategy.From.Kind = "DockerImage"
 	build.Spec.Strategy.CustomStrategy.From.Name = "test/image"
 	return build
 }
 
 func buildPodAdmissionTestDockerBuild() *buildapi.Build {
bd47008d
 	build := &buildapi.Build{ObjectMeta: kapi.ObjectMeta{
 		Labels: map[string]string{
 			buildapi.BuildConfigLabel:    "mock-build-config",
 			buildapi.BuildRunPolicyLabel: string(buildapi.BuildRunPolicyParallel),
 		},
 	}}
bc6edcca
 	build.Name = "test-build"
 	build.Spec.Source.Git = &buildapi.GitBuildSource{URI: "http://test/src"}
 	build.Spec.Strategy.DockerStrategy = &buildapi.DockerBuildStrategy{}
 	return build
 }
 
97e6f1de
 func runBuildPodAdmissionTest(t *testing.T, client *client.Client, kclientset *kclientset.Clientset, build *buildapi.Build) (*buildapi.Build, *kapi.Pod) {
bc6edcca
 
 	ns := testutil.Namespace()
 	_, err := client.Builds(ns).Create(build)
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
 
 	watchOpt := kapi.ListOptions{
 		FieldSelector: fields.OneTermEqualSelector(
 			"metadata.name",
be0d0362
 			buildapi.GetBuildPodName(build),
bc6edcca
 		),
 	}
97e6f1de
 	podWatch, err := kclientset.Core().Pods(ns).Watch(watchOpt)
bc6edcca
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
 	type resultObjs struct {
 		build *buildapi.Build
 		pod   *kapi.Pod
 	}
 	result := make(chan resultObjs)
 	defer podWatch.Stop()
 	go func() {
 		for e := range podWatch.ResultChan() {
 			if e.Type == watchapi.Added {
 				pod, ok := e.Object.(*kapi.Pod)
 				if !ok {
 					t.Fatalf("unexpected object: %v", e.Object)
 				}
 				build := (*buildtestutil.TestPod)(pod).GetBuild(t)
 				result <- resultObjs{build: build, pod: pod}
 			}
 		}
 	}()
 
 	select {
 	case <-time.After(buildPodAdmissionTestTimeout):
 		t.Fatalf("timed out after %v", buildPodAdmissionTestTimeout)
 	case objs := <-result:
 		return objs.build, objs.pod
 	}
 	return nil, nil
 }
 
97e6f1de
 func setupBuildDefaultsAdmissionTest(t *testing.T, defaultsConfig *defaultsapi.BuildDefaultsConfig) (*client.Client, *kclientset.Clientset) {
bc6edcca
 	return setupBuildPodAdmissionTest(t, map[string]configapi.AdmissionPluginConfig{
 		"BuildDefaults": {
316359e2
 			Configuration: defaultsConfig,
bc6edcca
 		},
 	})
 }
 
97e6f1de
 func setupBuildOverridesAdmissionTest(t *testing.T, overridesConfig *overridesapi.BuildOverridesConfig) (*client.Client, *kclientset.Clientset) {
bc6edcca
 	return setupBuildPodAdmissionTest(t, map[string]configapi.AdmissionPluginConfig{
 		"BuildOverrides": {
316359e2
 			Configuration: overridesConfig,
bc6edcca
 		},
 	})
 }
 
97e6f1de
 func setupBuildPodAdmissionTest(t *testing.T, pluginConfig map[string]configapi.AdmissionPluginConfig) (*client.Client, *kclientset.Clientset) {
982163f0
 	testutil.RequireEtcd(t)
bc6edcca
 	master, err := testserver.DefaultMasterOptions()
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
c1e03fe1
 	master.AdmissionConfig.PluginConfig = pluginConfig
bc6edcca
 	clusterAdminKubeConfig, err := testserver.StartConfiguredMaster(master)
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
 	clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
 
97e6f1de
 	clusterAdminKubeClientset, err := testutil.GetClusterAdminKubeClient(clusterAdminKubeConfig)
bc6edcca
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
 
97e6f1de
 	_, err = clusterAdminKubeClientset.Namespaces().Create(&kapi.Namespace{
bc6edcca
 		ObjectMeta: kapi.ObjectMeta{Name: testutil.Namespace()},
 	})
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
 
 	err = testserver.WaitForServiceAccounts(
97e6f1de
 		clusterAdminKubeClientset,
bc6edcca
 		testutil.Namespace(),
 		[]string{
 			bootstrappolicy.BuilderServiceAccountName,
 			bootstrappolicy.DefaultServiceAccountName,
 		})
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
 
97e6f1de
 	return clusterAdminClient, clusterAdminKubeClientset
bc6edcca
 }