@@ -19,6 +19,7 @@ package main
1919import (
2020 "bytes"
2121 "encoding/json"
22+ "fmt"
2223 "io"
2324 "net/http"
2425 "net/http/httptest"
@@ -28,7 +29,8 @@ import (
2829 "github.com/stretchr/testify/require"
2930
3031 admissionv1 "k8s.io/api/admission/v1"
31- resourceapi "k8s.io/api/resource/v1beta1"
32+ resourceapi "k8s.io/api/resource/v1"
33+ resourcev1beta1 "k8s.io/api/resource/v1beta1"
3234 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3335 "k8s.io/apimachinery/pkg/runtime"
3436 "k8s.io/apimachinery/pkg/runtime/schema"
@@ -47,6 +49,40 @@ func TestReadyEndpoint(t *testing.T) {
4749}
4850
4951func TestResourceClaimValidatingWebhook (t * testing.T ) {
52+ unknownResource := metav1.GroupVersionResource {
53+ Group : "resource.k8s.io" ,
54+ Version : "v1" ,
55+ Resource : "unknownresources" ,
56+ }
57+
58+ validGPUConfig := & configapi.GpuConfig {
59+ Sharing : & configapi.GpuSharing {
60+ Strategy : configapi .TimeSlicingStrategy ,
61+ TimeSlicingConfig : & configapi.TimeSlicingConfig {
62+ Interval : configapi .DefaultTimeSlice ,
63+ },
64+ },
65+ }
66+
67+ invalidGPUConfigs := []* configapi.GpuConfig {
68+ {
69+ Sharing : & configapi.GpuSharing {
70+ Strategy : configapi .TimeSlicingStrategy ,
71+ TimeSlicingConfig : & configapi.TimeSlicingConfig {
72+ Interval : "InvalidInterval" ,
73+ },
74+ },
75+ },
76+ {
77+ Sharing : & configapi.GpuSharing {
78+ Strategy : configapi .SpacePartitioningStrategy ,
79+ SpacePartitioningConfig : & configapi.SpacePartitioningConfig {
80+ PartitionCount : - 1 ,
81+ },
82+ },
83+ },
84+ }
85+
5086 tests := map [string ]struct {
5187 admissionReview * admissionv1.AdmissionReview
5288 requestContentType string
@@ -64,86 +100,72 @@ func TestResourceClaimValidatingWebhook(t *testing.T) {
64100 },
65101 "valid GpuConfig in ResourceClaim" : {
66102 admissionReview : admissionReviewWithObject (
67- resourceClaimWithGpuConfigs (
68- & configapi.GpuConfig {
69- Sharing : & configapi.GpuSharing {
70- Strategy : configapi .TimeSlicingStrategy ,
71- TimeSlicingConfig : & configapi.TimeSlicingConfig {
72- Interval : configapi .DefaultTimeSlice ,
73- },
74- },
75- },
76- ),
77- resourceClaimResource ,
103+ resourceClaimWithGpuConfigs (validGPUConfig ),
104+ resourceClaimResourceV1 ,
78105 ),
79106 expectedAllowed : true ,
80107 },
81108 "invalid GpuConfigs in ResourceClaim" : {
82109 admissionReview : admissionReviewWithObject (
83- resourceClaimWithGpuConfigs (
84- & configapi.GpuConfig {
85- Sharing : & configapi.GpuSharing {
86- Strategy : configapi .TimeSlicingStrategy ,
87- TimeSlicingConfig : & configapi.TimeSlicingConfig {
88- Interval : "InvalidInterval" ,
89- },
90- },
91- },
92- & configapi.GpuConfig {
93- Sharing : & configapi.GpuSharing {
94- Strategy : configapi .SpacePartitioningStrategy ,
95- SpacePartitioningConfig : & configapi.SpacePartitioningConfig {
96- PartitionCount : - 1 ,
97- },
98- },
99- },
100- ),
101- resourceClaimResource ,
110+ resourceClaimWithGpuConfigs (invalidGPUConfigs ... ),
111+ resourceClaimResourceV1 ,
102112 ),
103113 expectedAllowed : false ,
104114 expectedMessage : "2 configs failed to validate: object at spec.devices.config[0].opaque.parameters is invalid: unknown time-slice interval: InvalidInterval; object at spec.devices.config[1].opaque.parameters is invalid: invalid partition count: -1" ,
105115 },
106116 "valid GpuConfig in ResourceClaimTemplate" : {
107117 admissionReview : admissionReviewWithObject (
108- resourceClaimTemplateWithGpuConfigs (
109- & configapi.GpuConfig {
110- Sharing : & configapi.GpuSharing {
111- Strategy : configapi .TimeSlicingStrategy ,
112- TimeSlicingConfig : & configapi.TimeSlicingConfig {
113- Interval : configapi .DefaultTimeSlice ,
114- },
115- },
116- },
117- ),
118- resourceClaimTemplateResource ,
118+ resourceClaimTemplateWithGpuConfigs (validGPUConfig ),
119+ resourceClaimTemplateResourceV1 ,
119120 ),
120121 expectedAllowed : true ,
121122 },
122123 "invalid GpuConfigs in ResourceClaimTemplate" : {
123124 admissionReview : admissionReviewWithObject (
124- resourceClaimTemplateWithGpuConfigs (
125- & configapi.GpuConfig {
126- Sharing : & configapi.GpuSharing {
127- Strategy : configapi .TimeSlicingStrategy ,
128- TimeSlicingConfig : & configapi.TimeSlicingConfig {
129- Interval : "InvalidInterval" ,
130- },
131- },
132- },
133- & configapi.GpuConfig {
134- Sharing : & configapi.GpuSharing {
135- Strategy : configapi .SpacePartitioningStrategy ,
136- SpacePartitioningConfig : & configapi.SpacePartitioningConfig {
137- PartitionCount : - 1 ,
138- },
139- },
140- },
141- ),
142- resourceClaimTemplateResource ,
125+ resourceClaimTemplateWithGpuConfigs (invalidGPUConfigs ... ),
126+ resourceClaimTemplateResourceV1 ,
127+ ),
128+ expectedAllowed : false ,
129+ expectedMessage : "2 configs failed to validate: object at spec.spec.devices.config[0].opaque.parameters is invalid: unknown time-slice interval: InvalidInterval; object at spec.spec.devices.config[1].opaque.parameters is invalid: invalid partition count: -1" ,
130+ },
131+ "valid GpuConfig in ResourceClaim v1beta1" : {
132+ admissionReview : admissionReviewWithObject (
133+ toResourceClaimV1Beta1 (resourceClaimWithGpuConfigs (validGPUConfig )),
134+ resourceClaimResourceV1Beta1 ,
135+ ),
136+ expectedAllowed : true ,
137+ },
138+ "invalid GpuConfigs in ResourceClaim v1beta1" : {
139+ admissionReview : admissionReviewWithObject (
140+ toResourceClaimV1Beta1 (resourceClaimWithGpuConfigs (invalidGPUConfigs ... )),
141+ resourceClaimResourceV1Beta1 ,
142+ ),
143+ expectedAllowed : false ,
144+ expectedMessage : "2 configs failed to validate: object at spec.devices.config[0].opaque.parameters is invalid: unknown time-slice interval: InvalidInterval; object at spec.devices.config[1].opaque.parameters is invalid: invalid partition count: -1" ,
145+ },
146+ "valid GpuConfig in ResourceClaimTemplate v1beta1" : {
147+ admissionReview : admissionReviewWithObject (
148+ toResourceClaimTemplateV1Beta1 (resourceClaimTemplateWithGpuConfigs (validGPUConfig )),
149+ resourceClaimTemplateResourceV1Beta1 ,
150+ ),
151+ expectedAllowed : true ,
152+ },
153+ "invalid GpuConfigs in ResourceClaimTemplate v1beta1" : {
154+ admissionReview : admissionReviewWithObject (
155+ toResourceClaimTemplateV1Beta1 (resourceClaimTemplateWithGpuConfigs (invalidGPUConfigs ... )),
156+ resourceClaimTemplateResourceV1Beta1 ,
143157 ),
144158 expectedAllowed : false ,
145159 expectedMessage : "2 configs failed to validate: object at spec.spec.devices.config[0].opaque.parameters is invalid: unknown time-slice interval: InvalidInterval; object at spec.spec.devices.config[1].opaque.parameters is invalid: invalid partition count: -1" ,
146160 },
161+ "unknown resource type" : {
162+ admissionReview : admissionReviewWithObject (
163+ resourceClaimWithGpuConfigs (validGPUConfig ),
164+ unknownResource ,
165+ ),
166+ expectedAllowed : false ,
167+ expectedMessage : "expected resource to be one of [{resource.k8s.io v1 resourceclaims} {resource.k8s.io v1beta1 resourceclaims} {resource.k8s.io v1beta2 resourceclaims} {resource.k8s.io v1 resourceclaimtemplates} {resource.k8s.io v1beta1 resourceclaimtemplates} {resource.k8s.io v1beta2 resourceclaimtemplates}], got {resource.k8s.io v1 unknownresources}" ,
168+ },
147169 }
148170
149171 s := httptest .NewServer (newMux ())
@@ -238,3 +260,19 @@ func resourceClaimSpecWithGpuConfigs(gpuConfigs ...*configapi.GpuConfig) resourc
238260 }
239261 return resourceClaimSpec
240262}
263+
264+ func toResourceClaimV1Beta1 (v1Claim * resourceapi.ResourceClaim ) * resourcev1beta1.ResourceClaim {
265+ v1beta1Claim := & resourcev1beta1.ResourceClaim {}
266+ if err := scheme .Convert (v1Claim , v1beta1Claim , nil ); err != nil {
267+ panic (fmt .Sprintf ("failed to convert ResourceClaim to v1beta1: %v" , err ))
268+ }
269+ return v1beta1Claim
270+ }
271+
272+ func toResourceClaimTemplateV1Beta1 (v1Template * resourceapi.ResourceClaimTemplate ) * resourcev1beta1.ResourceClaimTemplate {
273+ v1beta1Template := & resourcev1beta1.ResourceClaimTemplate {}
274+ if err := scheme .Convert (v1Template , v1beta1Template , nil ); err != nil {
275+ panic (fmt .Sprintf ("failed to convert ResourceClaimTemplate to v1beta1: %v" , err ))
276+ }
277+ return v1beta1Template
278+ }
0 commit comments