//nolint:typecheck package edgeinjector import ( "context" "fmt" "testing" . "github.com/onsi/ginkgo/v2" //nolint:revive . "github.com/onsi/gomega" //nolint:revive appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client/fake" "edge-infra.dev/pkg/sds/devices/class" dsv1 "edge-infra.dev/pkg/sds/devices/k8s/apis/v1" ) const ( xserver = "xserver" xserverImage = "workloads/xserver" className = "display" ) var expectedGroups = []int64{997, 1015} var resourceName = class.FmtClassLabel(className) func TestDeviceAnnotationWebhook(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Device annotation tests") } var _ = Describe("Device annotation webhook", func() { It("Add display request annotations", func() { ctx := context.Background() deployment := generateDeployment() deviceStatus := generateDeviceStatuses() fakeClient := fake.NewClientBuilder().WithScheme(createScheme()).WithObjects(deviceStatus).Build() daw := &ResourceRequestWebhook{Client: fakeClient} expectedAnnotationPrefix := fmt.Sprintf("%s/%s", class.DeviceClassPrefix, xserver) Expect(daw.Default(ctx, deployment)).To(BeNil()) Expect(deployment.Spec.Template.ObjectMeta.Annotations[expectedAnnotationPrefix]).To(BeEquivalentTo(fmt.Sprintf("%s,%s", className, "default"))) Expect(deployment.Spec.Template.Spec.SecurityContext.SupplementalGroups).To(BeEquivalentTo(expectedGroups)) }) }) func generateDeployment() *appsv1.Deployment { return &appsv1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: xserver, Namespace: xserver, }, Spec: appsv1.DeploymentSpec{ Template: corev1.PodTemplateSpec{ Spec: corev1.PodSpec{ Containers: []corev1.Container{ { Name: xserver, Image: xserverImage, Resources: corev1.ResourceRequirements{ Limits: corev1.ResourceList{ corev1.ResourceName(resourceName): resource.MustParse("1"), }, Requests: corev1.ResourceList{ corev1.ResourceName(resourceName): resource.MustParse("1"), }, }, }, }, }, }, }, } } func generateDeviceStatuses() *dsv1.DeviceStatuses { return &dsv1.DeviceStatuses{ TypeMeta: metav1.TypeMeta{ APIVersion: dsv1.GroupVersion.Version, Kind: "DeviceStatuses", }, ObjectMeta: metav1.ObjectMeta{ Name: "node-1", }, Spec: dsv1.DeviceStatusesSpec{ DeviceGroups: map[string][]int64{ resourceName: expectedGroups, }, Devices: map[string][]dsv1.DeviceState{ resourceName: { { Name: "test-device", }, }, }, }, } }