...
1
2 package edgeinjector
3
4 import (
5 "context"
6 "fmt"
7 "testing"
8
9 . "github.com/onsi/ginkgo/v2"
10 . "github.com/onsi/gomega"
11 appsv1 "k8s.io/api/apps/v1"
12 corev1 "k8s.io/api/core/v1"
13 "k8s.io/apimachinery/pkg/api/resource"
14 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15 "sigs.k8s.io/controller-runtime/pkg/client/fake"
16
17 "edge-infra.dev/pkg/sds/devices/class"
18 dsv1 "edge-infra.dev/pkg/sds/devices/k8s/apis/v1"
19 )
20
21 const (
22 xserver = "xserver"
23 xserverImage = "workloads/xserver"
24 className = "display"
25 )
26
27 var expectedGroups = []int64{997, 1015}
28
29 var resourceName = class.FmtClassLabel(className)
30
31 func TestDeviceAnnotationWebhook(t *testing.T) {
32 RegisterFailHandler(Fail)
33 RunSpecs(t, "Device annotation tests")
34 }
35
36 var _ = Describe("Device annotation webhook", func() {
37 It("Add display request annotations", func() {
38 ctx := context.Background()
39
40 deployment := generateDeployment()
41 deviceStatus := generateDeviceStatuses()
42
43 fakeClient := fake.NewClientBuilder().WithScheme(createScheme()).WithObjects(deviceStatus).Build()
44 daw := &ResourceRequestWebhook{Client: fakeClient}
45
46 expectedAnnotationPrefix := fmt.Sprintf("%s/%s", class.DeviceClassPrefix, xserver)
47 Expect(daw.Default(ctx, deployment)).To(BeNil())
48 Expect(deployment.Spec.Template.ObjectMeta.Annotations[expectedAnnotationPrefix]).To(BeEquivalentTo(fmt.Sprintf("%s,%s", className, "default")))
49 Expect(deployment.Spec.Template.Spec.SecurityContext.SupplementalGroups).To(BeEquivalentTo(expectedGroups))
50 })
51 })
52
53 func generateDeployment() *appsv1.Deployment {
54 return &appsv1.Deployment{
55 ObjectMeta: metav1.ObjectMeta{
56 Name: xserver,
57 Namespace: xserver,
58 },
59 Spec: appsv1.DeploymentSpec{
60 Template: corev1.PodTemplateSpec{
61 Spec: corev1.PodSpec{
62 Containers: []corev1.Container{
63 {
64 Name: xserver,
65 Image: xserverImage,
66 Resources: corev1.ResourceRequirements{
67 Limits: corev1.ResourceList{
68 corev1.ResourceName(resourceName): resource.MustParse("1"),
69 },
70 Requests: corev1.ResourceList{
71 corev1.ResourceName(resourceName): resource.MustParse("1"),
72 },
73 },
74 },
75 },
76 },
77 },
78 },
79 }
80 }
81
82 func generateDeviceStatuses() *dsv1.DeviceStatuses {
83 return &dsv1.DeviceStatuses{
84 TypeMeta: metav1.TypeMeta{
85 APIVersion: dsv1.GroupVersion.Version,
86 Kind: "DeviceStatuses",
87 },
88 ObjectMeta: metav1.ObjectMeta{
89 Name: "node-1",
90 },
91 Spec: dsv1.DeviceStatusesSpec{
92 DeviceGroups: map[string][]int64{
93 resourceName: expectedGroups,
94 },
95 Devices: map[string][]dsv1.DeviceState{
96 resourceName: {
97 {
98 Name: "test-device",
99 },
100 },
101 },
102 },
103 }
104 }
105
View as plain text