1 package resource
2
3 import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7 corev1 "k8s.io/api/core/v1"
8 kresource "k8s.io/apimachinery/pkg/api/resource"
9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10 )
11
12 var (
13 audacityName = "audacity"
14 audacity = "audacity"
15 audacityImage = "docker.io/linuxserver/firefox:latest"
16 )
17
18 func TestAddAudioRequestResourcesToPod(t *testing.T) {
19 tcs := []struct {
20 Pod *corev1.Pod
21 ExpectedPod *corev1.Pod
22 }{
23 {
24
25 Pod: &corev1.Pod{
26 ObjectMeta: metav1.ObjectMeta{
27 Name: audacityName,
28 Namespace: audacityName,
29 },
30 Spec: corev1.PodSpec{
31 Containers: []corev1.Container{
32 {
33 Name: audacity,
34 Image: audacityImage,
35 Resources: corev1.ResourceRequirements{
36 Requests: corev1.ResourceList{
37 AudioRequestResource.ResourceName(): kresource.MustParse("1"),
38 },
39 },
40 },
41 },
42 },
43 },
44 ExpectedPod: &corev1.Pod{
45 ObjectMeta: metav1.ObjectMeta{
46 Name: audacityName,
47 Namespace: audacityName,
48 Labels: map[string]string{AudioRequestResource.String(): "true"},
49 },
50 Spec: corev1.PodSpec{
51 Containers: []corev1.Container{
52 {
53 Name: audacity,
54 Image: audacityImage,
55 Resources: corev1.ResourceRequirements{
56 Requests: corev1.ResourceList{
57 AudioRequestResource.ResourceName(): kresource.MustParse("1"),
58 },
59 },
60 Env: []corev1.EnvVar{
61 {Name: xdgRuntimeDirEnvVar, Value: xdgRuntimeDir},
62 {Name: pulseServerEnvVar, Value: pulseServerPath},
63 },
64 VolumeMounts: []corev1.VolumeMount{
65 {
66 Name: xdgRuntimeVol,
67 MountPath: xdgRuntimeDir,
68 ReadOnly: false,
69 },
70 },
71 },
72 },
73 Volumes: []corev1.Volume{
74 {
75 Name: xdgRuntimeVol,
76 VolumeSource: corev1.VolumeSource{
77 HostPath: &corev1.HostPathVolumeSource{Path: xdgRuntimeDir, Type: &hostPathDir},
78 },
79 },
80 },
81 },
82 },
83 },
84 {
85
86 Pod: &corev1.Pod{
87 ObjectMeta: metav1.ObjectMeta{
88 Name: audacityName,
89 Namespace: audacityName,
90 Labels: map[string]string{AudioRequestResource.String(): labelValue},
91 },
92 Spec: corev1.PodSpec{
93 Containers: []corev1.Container{
94 {
95 Name: audacity,
96 Image: audacityImage,
97 Resources: corev1.ResourceRequirements{
98 Requests: corev1.ResourceList{
99 AudioRequestResource.ResourceName(): kresource.MustParse("1"),
100 },
101 },
102 Env: []corev1.EnvVar{
103 {Name: xdgRuntimeDirEnvVar, Value: xdgRuntimeDir},
104 {Name: pulseServerEnvVar, Value: pulseServerPath},
105 },
106 VolumeMounts: []corev1.VolumeMount{
107 {
108 Name: xdgRuntimeVol,
109 MountPath: xdgRuntimeDir,
110 ReadOnly: false,
111 },
112 },
113 },
114 },
115 Volumes: []corev1.Volume{
116 {
117 Name: xdgRuntimeVol,
118 VolumeSource: corev1.VolumeSource{
119 HostPath: &corev1.HostPathVolumeSource{Path: xdgRuntimeDir, Type: &hostPathDir},
120 },
121 },
122 },
123 },
124 },
125 ExpectedPod: &corev1.Pod{
126 ObjectMeta: metav1.ObjectMeta{
127 Name: audacityName,
128 Namespace: audacityName,
129 Labels: map[string]string{AudioRequestResource.String(): labelValue},
130 },
131 Spec: corev1.PodSpec{
132 Containers: []corev1.Container{
133 {
134 Name: audacity,
135 Image: audacityImage,
136 Resources: corev1.ResourceRequirements{
137 Requests: corev1.ResourceList{
138 AudioRequestResource.ResourceName(): kresource.MustParse("1"),
139 },
140 },
141 Env: []corev1.EnvVar{
142 {Name: xdgRuntimeDirEnvVar, Value: xdgRuntimeDir},
143 {Name: pulseServerEnvVar, Value: pulseServerPath},
144 },
145 VolumeMounts: []corev1.VolumeMount{
146 {
147 Name: xdgRuntimeVol,
148 MountPath: xdgRuntimeDir,
149 ReadOnly: false,
150 },
151 },
152 },
153 },
154 Volumes: []corev1.Volume{
155 {
156 Name: xdgRuntimeVol,
157 VolumeSource: corev1.VolumeSource{
158 HostPath: &corev1.HostPathVolumeSource{Path: xdgRuntimeDir, Type: &hostPathDir},
159 },
160 },
161 },
162 },
163 },
164 },
165 {
166
167 Pod: &corev1.Pod{
168 ObjectMeta: metav1.ObjectMeta{
169 Name: audacityName,
170 Namespace: audacityName,
171 Labels: map[string]string{
172 AudioRequestResource.String(): labelValue,
173 "app.kubernetes.io/name": audacityName,
174 },
175 },
176 Spec: corev1.PodSpec{
177 Containers: []corev1.Container{
178 {
179 Name: audacity,
180 Image: audacityImage,
181 },
182 {
183 Name: "chromium",
184 Image: "docker.io/linuxserver/chromium",
185 Resources: corev1.ResourceRequirements{
186 Requests: corev1.ResourceList{
187 AudioRequestResource.ResourceName(): kresource.MustParse("1"),
188 },
189 },
190 },
191 {
192 Name: "ubuntu",
193 Image: "docker.io/ubuntu",
194 },
195 },
196 },
197 },
198 ExpectedPod: &corev1.Pod{
199 ObjectMeta: metav1.ObjectMeta{
200 Name: audacityName,
201 Namespace: audacityName,
202 Labels: map[string]string{
203 AudioRequestResource.String(): labelValue,
204 "app.kubernetes.io/name": audacityName,
205 },
206 },
207 Spec: corev1.PodSpec{
208 Containers: []corev1.Container{
209 {
210 Name: audacity,
211 Image: audacityImage,
212 },
213 {
214 Name: "chromium",
215 Image: "docker.io/linuxserver/chromium",
216 Resources: corev1.ResourceRequirements{
217 Requests: corev1.ResourceList{
218 AudioRequestResource.ResourceName(): kresource.MustParse("1"),
219 },
220 },
221 Env: []corev1.EnvVar{
222 {Name: xdgRuntimeDirEnvVar, Value: xdgRuntimeDir},
223 {Name: pulseServerEnvVar, Value: pulseServerPath},
224 },
225 VolumeMounts: []corev1.VolumeMount{
226 {
227 Name: xdgRuntimeVol,
228 MountPath: xdgRuntimeDir,
229 ReadOnly: false,
230 },
231 },
232 },
233 {
234 Name: "ubuntu",
235 Image: "docker.io/ubuntu",
236 },
237 },
238 Volumes: []corev1.Volume{
239 {
240 Name: xdgRuntimeVol,
241 VolumeSource: corev1.VolumeSource{
242 HostPath: &corev1.HostPathVolumeSource{Path: xdgRuntimeDir, Type: &hostPathDir},
243 },
244 },
245 },
246 },
247 },
248 },
249 }
250 for idx, tc := range tcs {
251 pod := tc.Pod.DeepCopy()
252 podTemplate := corev1.PodTemplateSpec{Spec: pod.Spec}
253 podTemplate = InjectResourceIntoPod(podTemplate, AudioRequestResource)
254 require.Equal(t, tc.ExpectedPod.Spec, podTemplate.Spec, "test case %d failed: pod not as expected", idx+1)
255 }
256 }
257
View as plain text