k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/cmd/kube-scheduler/app/options/configfile_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 options
    18  
    19  import (
    20  	"context"
    21  	"fmt"
    22  	"os"
    23  	"path/filepath"
    24  	"syscall"
    25  	"testing"
    26  
    27  	"github.com/stretchr/testify/assert"
    28  	"k8s.io/klog/v2"
    29  	"k8s.io/kubernetes/pkg/scheduler/apis/config"
    30  )
    31  
    32  const (
    33  	apiVersionMissing = "'apiVersion' is missing"
    34  	apiVersionTooOld  = "no kind \"KubeSchedulerConfiguration\" is registered for" +
    35  		" version \"kubescheduler.config.k8s.io/v1alpha1\""
    36  
    37  	// schedulerConfigMinimalCorrect is the minimal
    38  	// correct scheduler config
    39  	schedulerConfigMinimalCorrect = `
    40  apiVersion: kubescheduler.config.k8s.io/v1
    41  kind: KubeSchedulerConfiguration`
    42  
    43  	// schedulerConfigDecodeErr is the scheduler config
    44  	// which throws decoding error when we try to load it
    45  	schedulerConfigDecodeErr = `
    46  kind: KubeSchedulerConfiguration`
    47  
    48  	// schedulerConfigVersionTooOld is the scheduler config
    49  	// which throws error because the config version 'v1alpha1'
    50  	// is too old
    51  	schedulerConfigVersionTooOld = `
    52  apiVersion: kubescheduler.config.k8s.io/v1alpha1
    53  kind: KubeSchedulerConfiguration
    54  `
    55  )
    56  
    57  func TestLoadConfigFromFile(t *testing.T) {
    58  	tmpDir, err := os.MkdirTemp("", "scheduler-configs")
    59  	if err != nil {
    60  		t.Fatal(err)
    61  	}
    62  	defer os.RemoveAll(tmpDir)
    63  
    64  	correctConfigFile := filepath.Join(tmpDir, "correct_config.yaml")
    65  	if err := os.WriteFile(correctConfigFile,
    66  		[]byte(schedulerConfigMinimalCorrect),
    67  		os.FileMode(0600)); err != nil {
    68  		t.Fatal(err)
    69  	}
    70  
    71  	decodeErrConfigFile := filepath.Join(tmpDir, "decode_err_no_version_config.yaml")
    72  	if err := os.WriteFile(decodeErrConfigFile,
    73  		[]byte(schedulerConfigDecodeErr),
    74  		os.FileMode(0600)); err != nil {
    75  		t.Fatal(err)
    76  	}
    77  
    78  	versionTooOldConfigFile := filepath.Join(tmpDir, "version_too_old_config.yaml")
    79  	if err := os.WriteFile(versionTooOldConfigFile,
    80  		[]byte(schedulerConfigVersionTooOld),
    81  		os.FileMode(0600)); err != nil {
    82  		t.Fatal(err)
    83  	}
    84  
    85  	tests := []struct {
    86  		name           string
    87  		path           string
    88  		expectedErr    error
    89  		expectedConfig *config.KubeSchedulerConfiguration
    90  	}{
    91  		{
    92  			name:           "Empty scheduler config file path",
    93  			path:           "",
    94  			expectedErr:    syscall.Errno(syscall.ENOENT),
    95  			expectedConfig: nil,
    96  		},
    97  		{
    98  			name:           "Correct scheduler config",
    99  			path:           correctConfigFile,
   100  			expectedErr:    nil,
   101  			expectedConfig: &config.KubeSchedulerConfiguration{},
   102  		},
   103  		{
   104  			name:           "Scheduler config with decode error",
   105  			path:           decodeErrConfigFile,
   106  			expectedErr:    fmt.Errorf(apiVersionMissing),
   107  			expectedConfig: nil,
   108  		},
   109  		{
   110  			name:           "Scheduler config version too old",
   111  			path:           versionTooOldConfigFile,
   112  			expectedErr:    fmt.Errorf(apiVersionTooOld),
   113  			expectedConfig: nil,
   114  		},
   115  	}
   116  
   117  	logger := klog.FromContext(context.Background())
   118  
   119  	for i, test := range tests {
   120  		t.Run(fmt.Sprintf("case_%d: %s", i, test.name), func(t *testing.T) {
   121  			cfg, err := LoadConfigFromFile(logger, test.path)
   122  			if test.expectedConfig == nil {
   123  				assert.Nil(t, cfg)
   124  			} else {
   125  				assert.NotNil(t, cfg)
   126  			}
   127  
   128  			if test.expectedErr == nil {
   129  				assert.NoError(t, err)
   130  			} else {
   131  				assert.ErrorContains(t, err, test.expectedErr.Error())
   132  			}
   133  		})
   134  
   135  	}
   136  }