package integration import ( "testing" kapi "k8s.io/kubernetes/pkg/api" kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" configapi "github.com/openshift/origin/pkg/cmd/server/api" pluginapi "github.com/openshift/origin/pkg/quota/admission/runonceduration/api" testutil "github.com/openshift/origin/test/util" testserver "github.com/openshift/origin/test/util/server" ) func testRunOnceDurationPod(activeDeadlineSeconds int64) *kapi.Pod { pod := &kapi.Pod{} pod.GenerateName = "testpod" pod.Spec.RestartPolicy = kapi.RestartPolicyNever pod.Spec.Containers = []kapi.Container{ { Name: "container", Image: "test/image", }, } if activeDeadlineSeconds > 0 { pod.Spec.ActiveDeadlineSeconds = &activeDeadlineSeconds } return pod } func testPodDuration(t *testing.T, name string, kclientset kclientset.Interface, pod *kapi.Pod, expected int64) { // Pod with no duration set pod, err := kclientset.Core().Pods(testutil.Namespace()).Create(pod) if err != nil { t.Fatalf("%s: unexpected: %v", name, err) } if pod.Spec.ActiveDeadlineSeconds == nil { t.Errorf("%s: unexpected nil value for pod.Spec.ActiveDeadlineSeconds", name) return } if *pod.Spec.ActiveDeadlineSeconds != expected { t.Errorf("%s: unexpected value for pod.Spec.ActiveDeadlineSeconds: %d. Expected: %d", name, *pod.Spec.ActiveDeadlineSeconds, expected) } } func TestRunOnceDurationAdmissionPlugin(t *testing.T) { defer testutil.DumpEtcdOnFailure(t) var secs int64 = 3600 config := &pluginapi.RunOnceDurationConfig{ ActiveDeadlineSecondsLimit: &secs, } kclientset := setupRunOnceDurationTest(t, config, nil) testPodDuration(t, "global, no duration", kclientset, testRunOnceDurationPod(0), 3600) testPodDuration(t, "global, larger duration", kclientset, testRunOnceDurationPod(7200), 3600) testPodDuration(t, "global, smaller duration", kclientset, testRunOnceDurationPod(100), 100) } func TestRunOnceDurationAdmissionPluginProjectLimit(t *testing.T) { defer testutil.DumpEtcdOnFailure(t) var secs int64 = 3600 config := &pluginapi.RunOnceDurationConfig{ ActiveDeadlineSecondsLimit: &secs, } nsAnnotations := map[string]string{ pluginapi.ActiveDeadlineSecondsLimitAnnotation: "100", } kclientset := setupRunOnceDurationTest(t, config, nsAnnotations) testPodDuration(t, "project, no duration", kclientset, testRunOnceDurationPod(0), 100) testPodDuration(t, "project, larger duration", kclientset, testRunOnceDurationPod(7200), 100) testPodDuration(t, "project, smaller duration", kclientset, testRunOnceDurationPod(50), 50) } func setupRunOnceDurationTest(t *testing.T, pluginConfig *pluginapi.RunOnceDurationConfig, nsAnnotations map[string]string) kclientset.Interface { testutil.RequireEtcd(t) masterConfig, err := testserver.DefaultMasterOptions() if err != nil { t.Fatalf("error creating config: %v", err) } masterConfig.KubernetesMasterConfig.AdmissionConfig.PluginConfig = map[string]configapi.AdmissionPluginConfig{ "RunOnceDuration": { Configuration: pluginConfig, }, } kubeConfigFile, err := testserver.StartConfiguredMaster(masterConfig) if err != nil { t.Fatalf("error starting server: %v", err) } kubeClientset, err := testutil.GetClusterAdminKubeClient(kubeConfigFile) if err != nil { t.Fatalf("error getting client: %v", err) } ns := &kapi.Namespace{} ns.Name = testutil.Namespace() ns.Annotations = nsAnnotations _, err = kubeClientset.Core().Namespaces().Create(ns) if err != nil { t.Fatalf("error creating namespace: %v", err) } if err := testserver.WaitForPodCreationServiceAccounts(kubeClientset, testutil.Namespace()); err != nil { t.Errorf("unexpected error: %v", err) } return kubeClientset }