...

Source file src/edge-infra.dev/pkg/sds/ien/resource/uirequest_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  	firefoxName  = "firefox"
    14  	firefox      = "firefox"
    15  	firefoxImage = "docker.io/linuxserver/firefox:latest"
    16  )
    17  
    18  func TestAddUIRequestResourcesToPod(t *testing.T) {
    19  	tcs := []struct {
    20  		Pod         *corev1.Pod
    21  		ExpectedPod *corev1.Pod
    22  	}{
    23  		{
    24  			// test case 1: pod requesting UI has label, volume and envvar added
    25  			Pod: &corev1.Pod{
    26  				ObjectMeta: metav1.ObjectMeta{
    27  					Name:      firefoxName,
    28  					Namespace: firefoxName,
    29  				},
    30  				Spec: corev1.PodSpec{
    31  					Containers: []corev1.Container{
    32  						{
    33  							Name:  firefox,
    34  							Image: firefoxImage,
    35  							Resources: corev1.ResourceRequirements{
    36  								Requests: corev1.ResourceList{
    37  									UIRequestResource.ResourceName(): kresource.MustParse("1"),
    38  								},
    39  							},
    40  						},
    41  					},
    42  				},
    43  			},
    44  			ExpectedPod: &corev1.Pod{
    45  				ObjectMeta: metav1.ObjectMeta{
    46  					Name:      firefoxName,
    47  					Namespace: firefoxName,
    48  					Labels:    map[string]string{UIRequestResource.String(): "true"},
    49  				},
    50  				Spec: corev1.PodSpec{
    51  					Containers: []corev1.Container{
    52  						{
    53  							Name:  firefox,
    54  							Image: firefoxImage,
    55  							Resources: corev1.ResourceRequirements{
    56  								Requests: corev1.ResourceList{
    57  									UIRequestResource.ResourceName(): kresource.MustParse("1"),
    58  								},
    59  							},
    60  							Env: []corev1.EnvVar{
    61  								{Name: displayEnvVar, Value: displayZero},
    62  							},
    63  							VolumeMounts: []corev1.VolumeMount{
    64  								{
    65  									Name:      x11Volume,
    66  									MountPath: x11DirPath,
    67  									ReadOnly:  false,
    68  								},
    69  							},
    70  						},
    71  					},
    72  					Volumes: []corev1.Volume{
    73  						{
    74  							Name: x11Volume,
    75  							VolumeSource: corev1.VolumeSource{
    76  								HostPath: &corev1.HostPathVolumeSource{Path: x11DirPath, Type: &hostPathDir},
    77  							},
    78  						},
    79  					},
    80  				},
    81  			},
    82  		},
    83  		{
    84  			// test case 2: pod's existing x11 volume and envvar are not changed
    85  			Pod: &corev1.Pod{
    86  				ObjectMeta: metav1.ObjectMeta{
    87  					Name:      firefoxName,
    88  					Namespace: firefoxName,
    89  					Labels:    map[string]string{UIRequestResource.String(): labelValue},
    90  				},
    91  				Spec: corev1.PodSpec{
    92  					Containers: []corev1.Container{
    93  						{
    94  							Name:  firefox,
    95  							Image: firefoxImage,
    96  							Resources: corev1.ResourceRequirements{
    97  								Requests: corev1.ResourceList{
    98  									UIRequestResource.ResourceName(): kresource.MustParse("1"),
    99  								},
   100  							},
   101  							Env: []corev1.EnvVar{
   102  								{Name: displayEnvVar, Value: ":1.0"},
   103  							},
   104  							VolumeMounts: []corev1.VolumeMount{
   105  								{
   106  									Name:      x11Volume,
   107  									MountPath: x11DirPath,
   108  									ReadOnly:  true,
   109  								},
   110  							},
   111  						},
   112  					},
   113  					Volumes: []corev1.Volume{
   114  						{
   115  							Name: x11Volume,
   116  							VolumeSource: corev1.VolumeSource{
   117  								HostPath: &corev1.HostPathVolumeSource{Path: "/tmp/.X12-unix", Type: &hostPathDir},
   118  							},
   119  						},
   120  					},
   121  				},
   122  			},
   123  			ExpectedPod: &corev1.Pod{
   124  				ObjectMeta: metav1.ObjectMeta{
   125  					Name:      firefoxName,
   126  					Namespace: firefoxName,
   127  					Labels:    map[string]string{UIRequestResource.String(): labelValue},
   128  				},
   129  				Spec: corev1.PodSpec{
   130  					Containers: []corev1.Container{
   131  						{
   132  							Name:  firefox,
   133  							Image: firefoxImage,
   134  							Resources: corev1.ResourceRequirements{
   135  								Requests: corev1.ResourceList{
   136  									UIRequestResource.ResourceName(): kresource.MustParse("1"),
   137  								},
   138  							},
   139  							Env: []corev1.EnvVar{
   140  								{Name: displayEnvVar, Value: ":1.0"},
   141  							},
   142  							VolumeMounts: []corev1.VolumeMount{
   143  								{
   144  									Name:      x11Volume,
   145  									MountPath: x11DirPath,
   146  									ReadOnly:  true,
   147  								},
   148  							},
   149  						},
   150  					},
   151  					Volumes: []corev1.Volume{
   152  						{
   153  							Name: x11Volume,
   154  							VolumeSource: corev1.VolumeSource{
   155  								HostPath: &corev1.HostPathVolumeSource{Path: "/tmp/.X12-unix", Type: &hostPathDir},
   156  							},
   157  						},
   158  					},
   159  				},
   160  			},
   161  		},
   162  		{
   163  			// test case 3: multiple containers, only containers with requests mutated, existing fields ignored
   164  			Pod: &corev1.Pod{
   165  				ObjectMeta: metav1.ObjectMeta{
   166  					Name:      firefoxName,
   167  					Namespace: firefoxName,
   168  					Labels: map[string]string{
   169  						UIRequestResource.String(): labelValue,
   170  						"app.kubernetes.io/name":   firefoxName,
   171  					},
   172  				},
   173  				Spec: corev1.PodSpec{
   174  					Containers: []corev1.Container{
   175  						{
   176  							Name:  firefox,
   177  							Image: firefoxImage,
   178  							Resources: corev1.ResourceRequirements{
   179  								Requests: corev1.ResourceList{
   180  									UIRequestResource.ResourceName(): kresource.MustParse("1"),
   181  								},
   182  							},
   183  							Env: []corev1.EnvVar{
   184  								{Name: displayEnvVar, Value: ":1.0"},
   185  							},
   186  						},
   187  						{
   188  							Name:  "chromium",
   189  							Image: "docker.io/linuxserver/chromium",
   190  							Resources: corev1.ResourceRequirements{
   191  								Requests: corev1.ResourceList{
   192  									UIRequestResource.ResourceName(): kresource.MustParse("1"),
   193  								},
   194  							},
   195  							VolumeMounts: []corev1.VolumeMount{
   196  								{
   197  									Name:      x11Volume,
   198  									MountPath: x11DirPath,
   199  									ReadOnly:  true,
   200  								},
   201  							},
   202  						},
   203  						{
   204  							Name:  "ubuntu",
   205  							Image: "docker.io/ubuntu",
   206  						},
   207  					},
   208  				},
   209  			},
   210  			ExpectedPod: &corev1.Pod{
   211  				ObjectMeta: metav1.ObjectMeta{
   212  					Name:      firefoxName,
   213  					Namespace: firefoxName,
   214  					Labels: map[string]string{
   215  						UIRequestResource.String(): labelValue,
   216  						"app.kubernetes.io/name":   firefoxName,
   217  					},
   218  				},
   219  				Spec: corev1.PodSpec{
   220  					Containers: []corev1.Container{
   221  						{
   222  							Name:  firefox,
   223  							Image: firefoxImage,
   224  							Resources: corev1.ResourceRequirements{
   225  								Requests: corev1.ResourceList{
   226  									UIRequestResource.ResourceName(): kresource.MustParse("1"),
   227  								},
   228  							},
   229  							Env: []corev1.EnvVar{
   230  								{Name: displayEnvVar, Value: ":1.0"},
   231  							},
   232  							VolumeMounts: []corev1.VolumeMount{
   233  								{
   234  									Name:      x11Volume,
   235  									MountPath: x11DirPath,
   236  									ReadOnly:  false,
   237  								},
   238  							},
   239  						},
   240  						{
   241  							Name:  "chromium",
   242  							Image: "docker.io/linuxserver/chromium",
   243  							Resources: corev1.ResourceRequirements{
   244  								Requests: corev1.ResourceList{
   245  									UIRequestResource.ResourceName(): kresource.MustParse("1"),
   246  								},
   247  							},
   248  							Env: []corev1.EnvVar{
   249  								{Name: displayEnvVar, Value: displayZero},
   250  							},
   251  							VolumeMounts: []corev1.VolumeMount{
   252  								{
   253  									Name:      x11Volume,
   254  									MountPath: x11DirPath,
   255  									ReadOnly:  true,
   256  								},
   257  							},
   258  						},
   259  						{
   260  							Name:  "ubuntu",
   261  							Image: "docker.io/ubuntu",
   262  						},
   263  					},
   264  					Volumes: []corev1.Volume{
   265  						{
   266  							Name: x11Volume,
   267  							VolumeSource: corev1.VolumeSource{
   268  								HostPath: &corev1.HostPathVolumeSource{Path: x11DirPath, Type: &hostPathDir},
   269  							},
   270  						},
   271  					},
   272  				},
   273  			},
   274  		},
   275  	}
   276  	for idx, tc := range tcs {
   277  		pod := tc.Pod.DeepCopy()
   278  		podTemplate := corev1.PodTemplateSpec{Spec: pod.Spec}
   279  		podTemplate = InjectResourceIntoPod(podTemplate, UIRequestResource)
   280  		require.Equal(t, tc.ExpectedPod.Spec, podTemplate.Spec, "test case %d failed: pod not as expected", idx+1)
   281  	}
   282  }
   283  

View as plain text