func TestPodReadOnlyFilesystem(t *testing.T) { _, s := framework.RunAMaster(nil) defer s.Close() isReadOnly := true ns := framework.CreateTestingNamespace("pod-readonly-root", s, t) defer framework.DeleteTestingNamespace(ns, s, t) client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) pod := &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "xxx", }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: "fake-name", Image: "fakeimage", SecurityContext: &v1.SecurityContext{ ReadOnlyRootFilesystem: &isReadOnly, }, }, }, }, } if _, err := client.Core().Pods(ns.Name).Create(pod); err != nil { t.Errorf("Failed to create pod: %v", err) } integration.DeletePodOrErrorf(t, client, ns.Name, pod.Name) }
func DoTestConfigMap(t *testing.T, client clientset.Interface, ns *v1.Namespace) { cfg := v1.ConfigMap{ ObjectMeta: v1.ObjectMeta{ Name: "configmap", Namespace: ns.Name, }, Data: map[string]string{ "data-1": "value-1", "data-2": "value-2", "data-3": "value-3", }, } if _, err := client.Core().ConfigMaps(cfg.Namespace).Create(&cfg); err != nil { t.Errorf("unable to create test configMap: %v", err) } defer deleteConfigMapOrErrorf(t, client, cfg.Namespace, cfg.Name) pod := &v1.Pod{ ObjectMeta: v1.ObjectMeta{ Name: "XXX", Namespace: ns.Name, }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: "fake-name", Image: "fakeimage", Env: []v1.EnvVar{ { Name: "CONFIG_DATA_1", ValueFrom: &v1.EnvVarSource{ ConfigMapKeyRef: &v1.ConfigMapKeySelector{ LocalObjectReference: v1.LocalObjectReference{ Name: "configmap", }, Key: "data-1", }, }, }, { Name: "CONFIG_DATA_2", ValueFrom: &v1.EnvVarSource{ ConfigMapKeyRef: &v1.ConfigMapKeySelector{ LocalObjectReference: v1.LocalObjectReference{ Name: "configmap", }, Key: "data-2", }, }, }, { Name: "CONFIG_DATA_3", ValueFrom: &v1.EnvVarSource{ ConfigMapKeyRef: &v1.ConfigMapKeySelector{ LocalObjectReference: v1.LocalObjectReference{ Name: "configmap", }, Key: "data-3", }, }, }, }, }, }, }, } pod.ObjectMeta.Name = "uses-configmap" if _, err := client.Core().Pods(ns.Name).Create(pod); err != nil { t.Errorf("Failed to create pod: %v", err) } defer integration.DeletePodOrErrorf(t, client, ns.Name, pod.Name) }
// DoTestSecrets test secrets for one api version. func DoTestSecrets(t *testing.T, client clientset.Interface, ns *v1.Namespace) { // Make a secret object. s := v1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: "secret", Namespace: ns.Name, }, Data: map[string][]byte{ "data": []byte("value1\n"), }, } if _, err := client.Core().Secrets(s.Namespace).Create(&s); err != nil { t.Errorf("unable to create test secret: %v", err) } defer deleteSecretOrErrorf(t, client, s.Namespace, s.Name) // Template for pods that use a secret. pod := &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "XXX", Namespace: ns.Name, }, Spec: v1.PodSpec{ Volumes: []v1.Volume{ { Name: "secvol", VolumeSource: v1.VolumeSource{ Secret: &v1.SecretVolumeSource{ SecretName: "secret", }, }, }, }, Containers: []v1.Container{ { Name: "fake-name", Image: "fakeimage", VolumeMounts: []v1.VolumeMount{ { Name: "secvol", MountPath: "/fake/path", ReadOnly: true, }, }, }, }, }, } // Create a pod to consume secret. pod.ObjectMeta.Name = "uses-secret" if _, err := client.Core().Pods(ns.Name).Create(pod); err != nil { t.Errorf("Failed to create pod: %v", err) } defer integration.DeletePodOrErrorf(t, client, ns.Name, pod.Name) // Create a pod that consumes non-existent secret. pod.ObjectMeta.Name = "uses-non-existent-secret" if _, err := client.Core().Pods(ns.Name).Create(pod); err != nil { t.Errorf("Failed to create pod: %v", err) } defer integration.DeletePodOrErrorf(t, client, ns.Name, pod.Name) // This pod may fail to run, but we don't currently prevent this, and this // test can't check whether the kubelet actually pulls the secret. // Verifying contents of the volumes is out of scope for a // apiserver<->kubelet integration test. It is covered by an e2e test. }
func TestPodUpdateActiveDeadlineSeconds(t *testing.T) { _, s := framework.RunAMaster(nil) defer s.Close() ns := framework.CreateTestingNamespace("pod-activedeadline-update", s, t) defer framework.DeleteTestingNamespace(ns, s, t) client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) var ( iZero = int64(0) i30 = int64(30) i60 = int64(60) iNeg = int64(-1) ) prototypePod := func() *v1.Pod { return &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "xxx", }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: "fake-name", Image: "fakeimage", }, }, }, } } cases := []struct { name string original *int64 update *int64 valid bool }{ { name: "no change, nil", original: nil, update: nil, valid: true, }, { name: "no change, set", original: &i30, update: &i30, valid: true, }, { name: "change to positive from nil", original: nil, update: &i60, valid: true, }, { name: "change to smaller positive", original: &i60, update: &i30, valid: true, }, { name: "change to larger positive", original: &i30, update: &i60, valid: false, }, { name: "change to negative from positive", original: &i30, update: &iNeg, valid: false, }, { name: "change to negative from nil", original: nil, update: &iNeg, valid: false, }, // zero is not allowed, must be a positive integer { name: "change to zero from positive", original: &i30, update: &iZero, valid: false, }, { name: "change to nil from positive", original: &i30, update: nil, valid: false, }, } for i, tc := range cases { pod := prototypePod() pod.Spec.ActiveDeadlineSeconds = tc.original pod.ObjectMeta.Name = fmt.Sprintf("activedeadlineseconds-test-%v", i) if _, err := client.Core().Pods(ns.Name).Create(pod); err != nil { t.Errorf("Failed to create pod: %v", err) } pod.Spec.ActiveDeadlineSeconds = tc.update _, err := client.Core().Pods(ns.Name).Update(pod) if tc.valid && err != nil { t.Errorf("%v: failed to update pod: %v", tc.name, err) } else if !tc.valid && err == nil { t.Errorf("%v: unexpected allowed update to pod", tc.name) } integration.DeletePodOrErrorf(t, client, ns.Name, pod.Name) } }