1
16
17 package secrets
18
19
20
21 import (
22 "context"
23 "testing"
24
25 "encoding/json"
26
27 v1 "k8s.io/api/core/v1"
28 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29 "k8s.io/apimachinery/pkg/types"
30 clientset "k8s.io/client-go/kubernetes"
31 kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
32 "k8s.io/kubernetes/test/integration"
33 "k8s.io/kubernetes/test/integration/framework"
34 )
35
36 func deleteSecretOrErrorf(t *testing.T, c clientset.Interface, ns, name string) {
37 if err := c.CoreV1().Secrets(ns).Delete(context.TODO(), name, metav1.DeleteOptions{}); err != nil {
38 t.Errorf("unable to delete secret %v: %v", name, err)
39 }
40 }
41
42
43 func TestSecrets(t *testing.T) {
44
45 server := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins=ServiceAccount"}, framework.SharedEtcd())
46 defer server.TearDownFn()
47
48 client := clientset.NewForConfigOrDie(server.ClientConfig)
49
50 ns := framework.CreateNamespaceOrDie(client, "secret", t)
51 defer framework.DeleteNamespaceOrDie(client, ns, t)
52
53 DoTestSecrets(t, client, ns)
54 DoTestSecretsImmutableWithEmptyValue(t, client, ns)
55 }
56
57
58
59
60 func DoTestSecretsImmutableWithEmptyValue(t *testing.T, client clientset.Interface, ns *v1.Namespace) {
61
62
63 trueVal := true
64 s := v1.Secret{
65 ObjectMeta: metav1.ObjectMeta{
66 Name: "secret",
67 Namespace: ns.Name,
68 },
69 Immutable: &trueVal,
70 Data: map[string][]byte{
71 "emptyData": {},
72 },
73 }
74
75 if _, err := client.CoreV1().Secrets(s.Namespace).Create(context.TODO(), &s, metav1.CreateOptions{}); err != nil {
76 t.Errorf("unable to create test secret: %v", err)
77 }
78 defer deleteSecretOrErrorf(t, client, s.Namespace, s.Name)
79
80
81 patchSecret := v1.Secret{
82 ObjectMeta: metav1.ObjectMeta{
83 Name: "secret",
84 Namespace: ns.Name,
85 Labels: map[string]string{
86 "foo": "bar",
87 },
88 },
89 Immutable: &trueVal,
90 Data: map[string][]byte{
91 "emptyData": {},
92 },
93 }
94
95 secretPatch, err := json.Marshal(patchSecret)
96 if err != nil {
97 t.Errorf("unable to marshal test secret: %v", err)
98 }
99
100
101
102 if _, err := client.CoreV1().Secrets(s.Namespace).Patch(context.TODO(), patchSecret.Name, types.StrategicMergePatchType, secretPatch, metav1.PatchOptions{}); err != nil {
103 t.Errorf("unable to patch test secret: %v", err)
104 }
105 }
106
107
108 func DoTestSecrets(t *testing.T, client clientset.Interface, ns *v1.Namespace) {
109
110 s := v1.Secret{
111 ObjectMeta: metav1.ObjectMeta{
112 Name: "secret",
113 Namespace: ns.Name,
114 },
115 Data: map[string][]byte{
116 "data": []byte("value1\n"),
117 },
118 }
119
120 if _, err := client.CoreV1().Secrets(s.Namespace).Create(context.TODO(), &s, metav1.CreateOptions{}); err != nil {
121 t.Errorf("unable to create test secret: %v", err)
122 }
123 defer deleteSecretOrErrorf(t, client, s.Namespace, s.Name)
124
125
126 pod := &v1.Pod{
127 ObjectMeta: metav1.ObjectMeta{
128 Name: "XXX",
129 Namespace: ns.Name,
130 },
131 Spec: v1.PodSpec{
132 Volumes: []v1.Volume{
133 {
134 Name: "secvol",
135 VolumeSource: v1.VolumeSource{
136 Secret: &v1.SecretVolumeSource{
137 SecretName: "secret",
138 },
139 },
140 },
141 },
142 Containers: []v1.Container{
143 {
144 Name: "fake-name",
145 Image: "fakeimage",
146 VolumeMounts: []v1.VolumeMount{
147 {
148 Name: "secvol",
149 MountPath: "/fake/path",
150 ReadOnly: true,
151 },
152 },
153 },
154 },
155 },
156 }
157
158
159 pod.ObjectMeta.Name = "uses-secret"
160 if _, err := client.CoreV1().Pods(ns.Name).Create(context.TODO(), pod, metav1.CreateOptions{}); err != nil {
161 t.Errorf("Failed to create pod: %v", err)
162 }
163 defer integration.DeletePodOrErrorf(t, client, ns.Name, pod.Name)
164
165
166 pod.ObjectMeta.Name = "uses-non-existent-secret"
167 if _, err := client.CoreV1().Pods(ns.Name).Create(context.TODO(), pod, metav1.CreateOptions{}); err != nil {
168 t.Errorf("Failed to create pod: %v", err)
169 }
170 defer integration.DeletePodOrErrorf(t, client, ns.Name, pod.Name)
171
172
173
174
175
176 }
177
View as plain text