...

Source file src/edge-infra.dev/pkg/sds/ien/resource/audiorequest_test.go

Documentation: edge-infra.dev/pkg/sds/ien/resource

     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  			// test case 1: pod requesting audio has label, volume and envvars added
    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  			// test case 2: pod's existing xdg-runtime volume and envvars are not changed
    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  			// test case 3: multiple containers, only containers with requests mutated, existing fields ignored
   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