sigs.k8s.io/kueue@v0.6.2/pkg/webhooks/admissioncheck_webhook_test.go (about) 1 /* 2 Copyright 2023 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package webhooks 18 19 import ( 20 "testing" 21 22 "github.com/google/go-cmp/cmp" 23 "github.com/google/go-cmp/cmp/cmpopts" 24 "k8s.io/apimachinery/pkg/util/validation/field" 25 26 kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1" 27 ) 28 29 func TestAdmissionCheckValidation(t *testing.T) { 30 testcases := map[string]struct { 31 ac *kueue.AdmissionCheck 32 wantErr field.ErrorList 33 }{ 34 "no controller name": { 35 ac: &kueue.AdmissionCheck{ 36 Spec: kueue.AdmissionCheckSpec{ 37 Parameters: &kueue.AdmissionCheckParametersReference{ 38 APIGroup: "ref.api.group", 39 Kind: "RefKind", 40 Name: "ref-name", 41 }, 42 }, 43 }, 44 wantErr: field.ErrorList{field.Required(field.NewPath("spec", "controllerName"), "")}, 45 }, 46 "bad ref api group": { 47 ac: &kueue.AdmissionCheck{ 48 Spec: kueue.AdmissionCheckSpec{ 49 ControllerName: "controller-name", 50 Parameters: &kueue.AdmissionCheckParametersReference{ 51 APIGroup: "ref.api.group/Bad", 52 Kind: "RefKind", 53 Name: "ref-name", 54 }, 55 }, 56 }, 57 wantErr: field.ErrorList{field.Invalid(field.NewPath("spec", "parameters", "apiGroup"), "ref.api.group/Bad", "")}, 58 }, 59 "no ref api group": { 60 ac: &kueue.AdmissionCheck{ 61 Spec: kueue.AdmissionCheckSpec{ 62 ControllerName: "controller-name", 63 Parameters: &kueue.AdmissionCheckParametersReference{ 64 Kind: "RefKind", 65 Name: "ref-name", 66 }, 67 }, 68 }, 69 wantErr: field.ErrorList{field.Invalid(field.NewPath("spec", "parameters", "apiGroup"), "", "")}, 70 }, 71 "bad ref kind": { 72 ac: &kueue.AdmissionCheck{ 73 Spec: kueue.AdmissionCheckSpec{ 74 ControllerName: "controller-name", 75 Parameters: &kueue.AdmissionCheckParametersReference{ 76 APIGroup: "ref.api.group", 77 Kind: "RefKind/Bad", 78 Name: "ref-name", 79 }, 80 }, 81 }, 82 wantErr: field.ErrorList{field.Invalid(field.NewPath("spec", "parameters", "kind"), "RefKind/Bad", "")}, 83 }, 84 "no ref kind": { 85 ac: &kueue.AdmissionCheck{ 86 Spec: kueue.AdmissionCheckSpec{ 87 ControllerName: "controller-name", 88 Parameters: &kueue.AdmissionCheckParametersReference{ 89 APIGroup: "ref.api.group", 90 Name: "ref-name", 91 }, 92 }, 93 }, 94 wantErr: field.ErrorList{field.Invalid(field.NewPath("spec", "parameters", "kind"), "", "")}, 95 }, 96 "bad ref name": { 97 ac: &kueue.AdmissionCheck{ 98 Spec: kueue.AdmissionCheckSpec{ 99 ControllerName: "controller-name", 100 Parameters: &kueue.AdmissionCheckParametersReference{ 101 APIGroup: "ref.api.group", 102 Kind: "RefKind", 103 Name: "ref-name/Bad", 104 }, 105 }, 106 }, 107 wantErr: field.ErrorList{field.Invalid(field.NewPath("spec", "parameters", "name"), "ref-name/Bad", "")}, 108 }, 109 "no ref name": { 110 ac: &kueue.AdmissionCheck{ 111 Spec: kueue.AdmissionCheckSpec{ 112 ControllerName: "controller-name", 113 Parameters: &kueue.AdmissionCheckParametersReference{ 114 APIGroup: "ref.api.group", 115 Kind: "RefKind", 116 }, 117 }, 118 }, 119 wantErr: field.ErrorList{field.Invalid(field.NewPath("spec", "parameters", "name"), "", "")}, 120 }, 121 "no parameters": { 122 ac: &kueue.AdmissionCheck{ 123 Spec: kueue.AdmissionCheckSpec{ 124 ControllerName: "controller-name", 125 }, 126 }, 127 }, 128 "valid": { 129 ac: &kueue.AdmissionCheck{ 130 Spec: kueue.AdmissionCheckSpec{ 131 ControllerName: "controller-name", 132 Parameters: &kueue.AdmissionCheckParametersReference{ 133 APIGroup: "ref.api.group", 134 Kind: "RefKind", 135 Name: "ref-name", 136 }, 137 }, 138 }, 139 }, 140 } 141 142 for name, tc := range testcases { 143 t.Run(name, func(t *testing.T) { 144 gotErr := validateAdmissionCheck(tc.ac) 145 if diff := cmp.Diff(tc.wantErr, gotErr, cmpopts.IgnoreFields(field.Error{}, "Detail")); diff != "" { 146 t.Errorf("validateAdmissionCheck() mismatch (-want +got):\n%s", diff) 147 } 148 }) 149 } 150 } 151 152 func TestAdmissionCheckUpdateValidation(t *testing.T) { 153 testcases := map[string]struct { 154 oldAc *kueue.AdmissionCheck 155 newAc *kueue.AdmissionCheck 156 wantErr field.ErrorList 157 }{ 158 "can change parameters": { 159 oldAc: &kueue.AdmissionCheck{ 160 Spec: kueue.AdmissionCheckSpec{ 161 ControllerName: "controller-name", 162 Parameters: &kueue.AdmissionCheckParametersReference{ 163 APIGroup: "ref.api.group", 164 Kind: "RefKind", 165 Name: "ref-name", 166 }, 167 }, 168 }, 169 newAc: &kueue.AdmissionCheck{ 170 Spec: kueue.AdmissionCheckSpec{ 171 ControllerName: "controller-name", 172 Parameters: &kueue.AdmissionCheckParametersReference{ 173 APIGroup: "ref.api.group2", 174 Kind: "RefKind2", 175 Name: "ref-name2", 176 }, 177 }, 178 }, 179 }, 180 "can remove parameters": { 181 oldAc: &kueue.AdmissionCheck{ 182 Spec: kueue.AdmissionCheckSpec{ 183 ControllerName: "controller-name", 184 Parameters: &kueue.AdmissionCheckParametersReference{ 185 APIGroup: "ref.api.group", 186 Kind: "RefKind", 187 Name: "ref-name", 188 }, 189 }, 190 }, 191 newAc: &kueue.AdmissionCheck{ 192 Spec: kueue.AdmissionCheckSpec{ 193 ControllerName: "controller-name", 194 }, 195 }, 196 }, 197 "cannot break parameters": { 198 oldAc: &kueue.AdmissionCheck{ 199 Spec: kueue.AdmissionCheckSpec{ 200 ControllerName: "controller-name", 201 Parameters: &kueue.AdmissionCheckParametersReference{ 202 APIGroup: "ref.api.group", 203 Kind: "RefKind", 204 Name: "ref-name", 205 }, 206 }, 207 }, 208 newAc: &kueue.AdmissionCheck{ 209 Spec: kueue.AdmissionCheckSpec{ 210 ControllerName: "controller-name", 211 Parameters: &kueue.AdmissionCheckParametersReference{ 212 APIGroup: "ref.api.group", 213 Kind: "RefKind", 214 }, 215 }, 216 }, 217 wantErr: field.ErrorList{field.Invalid(field.NewPath("spec", "parameters", "name"), "", "")}, 218 }, 219 "cannot change the controller": { 220 oldAc: &kueue.AdmissionCheck{ 221 Spec: kueue.AdmissionCheckSpec{ 222 ControllerName: "controller-name", 223 Parameters: &kueue.AdmissionCheckParametersReference{ 224 APIGroup: "ref.api.group", 225 Kind: "RefKind", 226 Name: "ref-name", 227 }, 228 }, 229 }, 230 newAc: &kueue.AdmissionCheck{ 231 Spec: kueue.AdmissionCheckSpec{ 232 ControllerName: "controller-name2", 233 Parameters: &kueue.AdmissionCheckParametersReference{ 234 APIGroup: "ref.api.group", 235 Kind: "RefKind", 236 Name: "ref-name", 237 }, 238 }, 239 }, 240 wantErr: field.ErrorList{field.Invalid(field.NewPath("spec", "controllerName"), "controller-name", "")}, 241 }, 242 } 243 244 for name, tc := range testcases { 245 t.Run(name, func(t *testing.T) { 246 gotErr := validateAdmissionCheckUpdate(tc.oldAc, tc.newAc) 247 if diff := cmp.Diff(tc.wantErr, gotErr, cmpopts.IgnoreFields(field.Error{}, "Detail")); diff != "" { 248 t.Errorf("validateAdmissionCheckUpdate() mismatch (-want +got):\n%s", diff) 249 } 250 }) 251 } 252 }