istio.io/istio@v0.0.0-20240520182934-d79c90f27776/istioctl/pkg/install/k8sversion/version_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  package k8sversion
    16  
    17  import (
    18  	"bytes"
    19  	"fmt"
    20  	"strings"
    21  	"testing"
    22  
    23  	"k8s.io/apimachinery/pkg/version"
    24  	fakediscovery "k8s.io/client-go/discovery/fake"
    25  
    26  	"istio.io/istio/operator/pkg/util/clog"
    27  	"istio.io/istio/pkg/kube"
    28  	pkgVersion "istio.io/istio/pkg/version"
    29  )
    30  
    31  var (
    32  	version1_17 = &version.Info{
    33  		Major:      "1",
    34  		Minor:      "17",
    35  		GitVersion: "1.17",
    36  	}
    37  	version1_8 = &version.Info{
    38  		Major:      "1",
    39  		Minor:      "8",
    40  		GitVersion: "v1.8",
    41  	}
    42  	version1_18 = &version.Info{
    43  		Major:      "1",
    44  		Minor:      "18",
    45  		GitVersion: "v1.18.5",
    46  	}
    47  	version1_19 = &version.Info{
    48  		Major:      "1",
    49  		Minor:      "19",
    50  		GitVersion: "v1.19.4",
    51  	}
    52  	version1_20 = &version.Info{
    53  		Major:      "1",
    54  		Minor:      "20",
    55  		GitVersion: "v1.20.2",
    56  	}
    57  	version1_22 = &version.Info{
    58  		Major:      "1",
    59  		Minor:      "22",
    60  		GitVersion: "v1.22",
    61  	}
    62  	version1_23 = &version.Info{
    63  		Major:      "1",
    64  		Minor:      "23",
    65  		GitVersion: "v1.23",
    66  	}
    67  	version1_24 = &version.Info{
    68  		Major:      "1",
    69  		Minor:      "24",
    70  		GitVersion: "v1.24",
    71  	}
    72  	version1_25 = &version.Info{
    73  		Major:      "1",
    74  		Minor:      "25",
    75  		GitVersion: "v1.25",
    76  	}
    77  	version1_26 = &version.Info{
    78  		Major:      "1",
    79  		Minor:      "26",
    80  		GitVersion: "v1.26",
    81  	}
    82  	version1_19RC = &version.Info{
    83  		Major:      "1",
    84  		Minor:      "19",
    85  		GitVersion: "v1.19.5-rc.0",
    86  	}
    87  	version1_17GKE = &version.Info{
    88  		Major:      "1",
    89  		Minor:      "17+",
    90  		GitVersion: "v1.17.7-gke.10",
    91  	}
    92  	version1_8GKE = &version.Info{
    93  		Major:      "1",
    94  		Minor:      "8",
    95  		GitVersion: "v1.8.7-gke.8",
    96  	}
    97  	versionInvalid1 = &version.Info{
    98  		Major:      "1",
    99  		Minor:      "7",
   100  		GitVersion: "v1.invalid.7",
   101  	}
   102  	versionInvalid2 = &version.Info{
   103  		Major:      "one",
   104  		Minor:      "seven",
   105  		GitVersion: "one.seven",
   106  	}
   107  )
   108  
   109  func TestExtractKubernetesVersion(t *testing.T) {
   110  	cases := []struct {
   111  		version  *version.Info
   112  		expected int
   113  		errMsg   error
   114  		isValid  bool
   115  	}{
   116  		{
   117  			version:  version1_17,
   118  			expected: 17,
   119  			errMsg:   nil,
   120  			isValid:  true,
   121  		},
   122  		{
   123  			version:  version1_8,
   124  			expected: 8,
   125  			errMsg:   nil,
   126  			isValid:  true,
   127  		},
   128  		{
   129  			version:  version1_18,
   130  			expected: 18,
   131  			errMsg:   nil,
   132  			isValid:  true,
   133  		},
   134  		{
   135  			version:  version1_19,
   136  			expected: 19,
   137  			errMsg:   nil,
   138  			isValid:  true,
   139  		},
   140  		{
   141  			version:  version1_20,
   142  			expected: 20,
   143  			errMsg:   nil,
   144  			isValid:  true,
   145  		},
   146  		{
   147  			version:  version1_22,
   148  			expected: 22,
   149  			errMsg:   nil,
   150  			isValid:  true,
   151  		},
   152  		{
   153  			version:  version1_19RC,
   154  			expected: 19,
   155  			errMsg:   nil,
   156  			isValid:  true,
   157  		},
   158  		{
   159  			version:  version1_17GKE,
   160  			expected: 17,
   161  			errMsg:   nil,
   162  			isValid:  true,
   163  		},
   164  		{
   165  			version:  version1_8GKE,
   166  			expected: 8,
   167  			errMsg:   nil,
   168  			isValid:  true,
   169  		},
   170  		{
   171  			version: versionInvalid1,
   172  			errMsg:  fmt.Errorf("could not parse Malformed version: %v", versionInvalid1.GitVersion),
   173  			isValid: false,
   174  		},
   175  		{
   176  			version: versionInvalid2,
   177  			errMsg:  fmt.Errorf("could not parse Malformed version: %v", versionInvalid2.GitVersion),
   178  			isValid: false,
   179  		},
   180  	}
   181  	for i, c := range cases {
   182  		t.Run(fmt.Sprintf("case %d %s", i, c.version), func(t *testing.T) {
   183  			got, err := extractKubernetesVersion(c.version)
   184  			if c.errMsg != err && c.isValid {
   185  				t.Fatalf("\nwanted: %v \nbut found: %v", c.errMsg, err)
   186  			}
   187  			if got != c.expected {
   188  				t.Fatalf("wanted %v got %v", c.expected, got)
   189  			}
   190  		})
   191  	}
   192  }
   193  
   194  func TestIsK8VersionSupported(t *testing.T) {
   195  	cases := []struct {
   196  		version *version.Info
   197  		logMsg  string
   198  		isValid bool
   199  	}{
   200  		{
   201  			version: version1_18,
   202  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_18.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   203  			isValid: false,
   204  		},
   205  		{
   206  			version: version1_8,
   207  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_8.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   208  			isValid: false,
   209  		},
   210  		{
   211  			version: version1_17GKE,
   212  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_17GKE.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   213  			isValid: false,
   214  		},
   215  		{
   216  			version: versionInvalid1,
   217  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, versionInvalid1.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   218  			isValid: false,
   219  		},
   220  		{
   221  			version: version1_20,
   222  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_20.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   223  			isValid: false,
   224  		},
   225  		{
   226  			version: version1_22,
   227  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_22.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   228  			isValid: false,
   229  		},
   230  		{
   231  			version: version1_23,
   232  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_23.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   233  			isValid: false,
   234  		},
   235  		{
   236  			version: version1_24,
   237  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_24.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   238  			isValid: false,
   239  		},
   240  		{
   241  			version: version1_25,
   242  			logMsg:  fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_25.GitVersion, pkgVersion.Info.Version, MinK8SVersion),
   243  			isValid: false,
   244  		},
   245  		{
   246  			version: version1_26,
   247  			isValid: true,
   248  		},
   249  	}
   250  
   251  	var outBuf bytes.Buffer
   252  	var errBuf bytes.Buffer
   253  
   254  	for i, c := range cases {
   255  		t.Run(fmt.Sprintf("case %d %s", i, c.version), func(t *testing.T) {
   256  			k8sClient := kube.NewFakeClient()
   257  			k8sClient.Kube().Discovery().(*fakediscovery.FakeDiscovery).FakedServerVersion = c.version
   258  
   259  			logger := clog.NewConsoleLogger(&outBuf, &errBuf, nil)
   260  			IsK8VersionSupported(k8sClient, logger)
   261  
   262  			errMsgTrim := strings.TrimSpace(c.logMsg)
   263  			outBufTrim := strings.TrimSpace(outBuf.String())
   264  
   265  			if !c.isValid && strings.Compare(errMsgTrim, outBufTrim) != 0 {
   266  				t.Fatalf("\nwanted: %v \nbut found: %v", errMsgTrim, outBufTrim)
   267  			}
   268  
   269  			if c.isValid && outBuf.Len() > 0 {
   270  				t.Fatalf("\nwanted: %v \nbut found: %v", errMsgTrim, outBufTrim)
   271  			}
   272  			outBuf.Reset()
   273  		})
   274  	}
   275  }