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  }