istio.io/istio@v0.0.0-20240520182934-d79c90f27776/cni/test/install_k8s_test.go (about)

     1  // Copyright Istio Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  // This tests the k8s installation.  It validates the CNI plugin configuration
    16  // and the existence of the CNI plugin binary locations.
    17  package install_test
    18  
    19  import (
    20  	"testing"
    21  
    22  	install "istio.io/istio/cni/test"
    23  	"istio.io/istio/pkg/test/env"
    24  )
    25  
    26  var (
    27  	Hub = "gcr.io/istio-release"
    28  	Tag = "master-latest-daily"
    29  )
    30  
    31  type testCase struct {
    32  	name             string
    33  	chainedCNIPlugin bool
    34  	preConfFile      string
    35  	resultFileName   string
    36  	// Must set chainedCNIPlugin to true if delayedConfFile is specified
    37  	delayedConfFile        string
    38  	expectedOutputFile     string
    39  	expectedPostCleanFile  string
    40  	cniConfDirOrderedFiles []string
    41  }
    42  
    43  func TestInstall(t *testing.T) {
    44  	testDataDir := env.IstioSrc + "/cni/test/testdata"
    45  	cases := []testCase{
    46  		{
    47  			name:                   "File with pre-plugins--.conflist",
    48  			chainedCNIPlugin:       true,
    49  			preConfFile:            "00-calico.conflist",
    50  			resultFileName:         "00-calico.conflist",
    51  			expectedOutputFile:     testDataDir + "/expected/10-calico.conflist-istioconfig",
    52  			expectedPostCleanFile:  testDataDir + "/pre/calico.conflist",
    53  			cniConfDirOrderedFiles: []string{"calico.conflist"},
    54  		},
    55  		{
    56  			name:                   "File without pre-plugins--.conf",
    57  			chainedCNIPlugin:       true,
    58  			preConfFile:            "00-minikube_cni.conf",
    59  			resultFileName:         "00-minikube_cni.conflist",
    60  			expectedOutputFile:     testDataDir + "/expected/minikube_cni.conflist.expected",
    61  			expectedPostCleanFile:  testDataDir + "/expected/minikube_cni.conflist.clean",
    62  			cniConfDirOrderedFiles: []string{"minikube_cni.conf"},
    63  		},
    64  		{
    65  			name:                   "First file with pre-plugins--.conflist",
    66  			chainedCNIPlugin:       true,
    67  			resultFileName:         "00-calico.conflist",
    68  			expectedOutputFile:     testDataDir + "/expected/10-calico.conflist-istioconfig",
    69  			expectedPostCleanFile:  testDataDir + "/pre/calico.conflist",
    70  			cniConfDirOrderedFiles: []string{"calico.conflist", "minikube_cni.conf"},
    71  		},
    72  		{
    73  			name:                   "First file without pre-plugins--.conf",
    74  			chainedCNIPlugin:       true,
    75  			resultFileName:         "00-minikube_cni.conflist",
    76  			expectedOutputFile:     testDataDir + "/expected/minikube_cni.conflist.expected",
    77  			expectedPostCleanFile:  testDataDir + "/expected/minikube_cni.conflist.clean",
    78  			cniConfDirOrderedFiles: []string{"minikube_cni.conf", "calico.conflist"},
    79  		},
    80  		{
    81  			name:                   "Skip non-json file for first valid .conf file",
    82  			chainedCNIPlugin:       true,
    83  			resultFileName:         "01-minikube_cni.conflist",
    84  			expectedOutputFile:     testDataDir + "/expected/minikube_cni.conflist.expected",
    85  			expectedPostCleanFile:  testDataDir + "/expected/minikube_cni.conflist.clean",
    86  			cniConfDirOrderedFiles: []string{"non_json.conf", "minikube_cni.conf", "calico.conflist"},
    87  		},
    88  		{
    89  			name:                   "Skip non-json file for first valid .conflist file",
    90  			chainedCNIPlugin:       true,
    91  			resultFileName:         "01-calico.conflist",
    92  			expectedOutputFile:     testDataDir + "/expected/10-calico.conflist-istioconfig",
    93  			expectedPostCleanFile:  testDataDir + "/pre/calico.conflist",
    94  			cniConfDirOrderedFiles: []string{"non_json.conf", "calico.conflist", "minikube_cni.conf"},
    95  		},
    96  		{
    97  			name:                   "Skip invalid .conf file for first valid .conf file",
    98  			chainedCNIPlugin:       true,
    99  			resultFileName:         "01-minikube_cni.conflist",
   100  			expectedOutputFile:     testDataDir + "/expected/minikube_cni.conflist.expected",
   101  			expectedPostCleanFile:  testDataDir + "/expected/minikube_cni.conflist.clean",
   102  			cniConfDirOrderedFiles: []string{"bad_minikube_cni.conf", "minikube_cni.conf", "calico.conflist"},
   103  		},
   104  		{
   105  			name:                   "Skip invalid .conf file for first valid .conflist file",
   106  			chainedCNIPlugin:       true,
   107  			resultFileName:         "01-calico.conflist",
   108  			expectedOutputFile:     testDataDir + "/expected/10-calico.conflist-istioconfig",
   109  			expectedPostCleanFile:  testDataDir + "/pre/calico.conflist",
   110  			cniConfDirOrderedFiles: []string{"bad_minikube_cni.conf", "calico.conflist", "minikube_cni.conf"},
   111  		},
   112  		{
   113  			name:                  "Skip invalid .conflist files for first valid .conf file",
   114  			chainedCNIPlugin:      true,
   115  			resultFileName:        "02-minikube_cni.conflist",
   116  			expectedOutputFile:    testDataDir + "/expected/minikube_cni.conflist.expected",
   117  			expectedPostCleanFile: testDataDir + "/expected/minikube_cni.conflist.clean",
   118  			cniConfDirOrderedFiles: []string{
   119  				"noname_calico.conflist",
   120  				"noplugins_calico.conflist",
   121  				"minikube_cni.conf", "calico.conflist",
   122  			},
   123  		},
   124  		{
   125  			name:                  "Skip invalid .conflist files for first valid .conflist file",
   126  			chainedCNIPlugin:      true,
   127  			resultFileName:        "02-calico.conflist",
   128  			expectedOutputFile:    testDataDir + "/expected/10-calico.conflist-istioconfig",
   129  			expectedPostCleanFile: testDataDir + "/pre/calico.conflist",
   130  			cniConfDirOrderedFiles: []string{
   131  				"noname_calico.conflist",
   132  				"noplugins_calico.conflist",
   133  				"calico.conflist", "minikube_cni.conf",
   134  			},
   135  		},
   136  		{
   137  			name:                   "confFile env var point to missing .conf with valid .conflist file",
   138  			chainedCNIPlugin:       true,
   139  			preConfFile:            "00-calico.conf",
   140  			resultFileName:         "00-calico.conflist",
   141  			expectedOutputFile:     testDataDir + "/expected/10-calico.conflist-istioconfig",
   142  			expectedPostCleanFile:  testDataDir + "/pre/calico.conflist",
   143  			cniConfDirOrderedFiles: []string{"calico.conflist"},
   144  		},
   145  		{
   146  			name:                   "confFile env var point to missing .conflist with valid .conf file",
   147  			chainedCNIPlugin:       true,
   148  			preConfFile:            "00-minikube_cni.conflist",
   149  			resultFileName:         "00-minikube_cni.conflist",
   150  			expectedOutputFile:     testDataDir + "/expected/minikube_cni.conflist.expected",
   151  			expectedPostCleanFile:  testDataDir + "/expected/minikube_cni.conflist.clean",
   152  			cniConfDirOrderedFiles: []string{"minikube_cni.conf"},
   153  		},
   154  		{
   155  			name:                  "confFile env var point to missing file initially and ignore different conf",
   156  			chainedCNIPlugin:      true,
   157  			preConfFile:           "missing_initially.conf",
   158  			resultFileName:        "missing_initially.conflist",
   159  			delayedConfFile:       testDataDir + "/pre/calico.conflist",
   160  			expectedOutputFile:    testDataDir + "/expected/10-calico.conflist-istioconfig",
   161  			expectedPostCleanFile: testDataDir + "/pre/calico.conflist",
   162  		},
   163  		{
   164  			name:                  "confFile env var not specified and no valid conf file initially",
   165  			chainedCNIPlugin:      true,
   166  			resultFileName:        "calico.conflist",
   167  			delayedConfFile:       testDataDir + "/pre/calico.conflist",
   168  			expectedOutputFile:    testDataDir + "/expected/10-calico.conflist-istioconfig",
   169  			expectedPostCleanFile: testDataDir + "/pre/calico.conflist",
   170  		},
   171  		{
   172  			name:               "standalone plugin default name",
   173  			resultFileName:     "YYY-istio-cni.conf",
   174  			expectedOutputFile: testDataDir + "/expected/YYY-istio-cni.conf",
   175  		},
   176  		{
   177  			name:               "standalone plugin user defined name",
   178  			preConfFile:        "user-defined.conf",
   179  			resultFileName:     "user-defined.conf",
   180  			expectedOutputFile: testDataDir + "/expected/YYY-istio-cni.conf",
   181  		},
   182  	}
   183  	for _, tc := range cases {
   184  		t.Run(tc.name, func(t *testing.T) {
   185  			t.Logf("%s: Test preconf %s, expected %s", tc.name, tc.preConfFile, tc.expectedOutputFile)
   186  			install.RunInstallCNITest(t, tc.chainedCNIPlugin, tc.preConfFile, tc.resultFileName, tc.delayedConfFile, tc.expectedOutputFile,
   187  				tc.expectedPostCleanFile, tc.cniConfDirOrderedFiles)
   188  		})
   189  	}
   190  }