sigs.k8s.io/prow@v0.0.0-20240503223140-c5e374dc7eb1/pkg/flagutil/kubernetes_cluster_clients_test.go (about)

     1  /*
     2  Copyright 2019 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 flagutil
    18  
    19  import (
    20  	"os"
    21  	"path/filepath"
    22  	"testing"
    23  )
    24  
    25  func TestExperimentalKubernetesOptions_Validate(t *testing.T) {
    26  	dir := t.TempDir()
    27  	configFile := filepath.Join(dir, "some-file")
    28  	if err := os.WriteFile(configFile, []byte("a"), 0644); err != nil {
    29  		t.Fatalf("failed to write kubeconfig file %q: %v", configFile, err)
    30  	}
    31  	configDir := filepath.Join(dir, "some-dir")
    32  	if err := os.Mkdir(configDir, 0755); err != nil {
    33  		t.Fatalf("failed to create a directory %q: %v", configDir, err)
    34  	}
    35  	defer t.Cleanup(func() {
    36  		if err := os.RemoveAll(dir); err != nil {
    37  			t.Errorf("failed to remove files in %s: %v", dir, err)
    38  		}
    39  	})
    40  
    41  	var testCases = []struct {
    42  		name        string
    43  		dryRun      bool
    44  		kubernetes  OptionGroup
    45  		expectedErr bool
    46  	}{
    47  		{
    48  			name:        "all ok without dry-run",
    49  			dryRun:      false,
    50  			kubernetes:  &KubernetesOptions{},
    51  			expectedErr: false,
    52  		},
    53  		{
    54  			name:        "all ok with dry-run",
    55  			dryRun:      true,
    56  			kubernetes:  &KubernetesOptions{},
    57  			expectedErr: false,
    58  		},
    59  		{
    60  			name: "kubeconfig can be set alone",
    61  			kubernetes: &KubernetesOptions{
    62  				kubeconfig: configFile,
    63  			},
    64  		},
    65  		{
    66  			name: "kubeconfigDir can be set alone",
    67  			kubernetes: &KubernetesOptions{
    68  				kubeconfigDir: configDir,
    69  			},
    70  		},
    71  		{
    72  			name: "kubeconfig and kubeconfigDir can be set together",
    73  			kubernetes: &KubernetesOptions{
    74  				kubeconfig:    configFile,
    75  				kubeconfigDir: configDir,
    76  			},
    77  		},
    78  		{
    79  			name: "kubeconfigSuffix can be set",
    80  			kubernetes: &KubernetesOptions{
    81  				kubeconfigDir:    configDir,
    82  				kubeconfigSuffix: "suffix",
    83  			},
    84  		},
    85  		{
    86  			name: "kubeconfigSuffix must be used with kubeconfigDir",
    87  			kubernetes: &KubernetesOptions{
    88  				kubeconfigSuffix: "suffix",
    89  			},
    90  			expectedErr: true,
    91  		},
    92  	}
    93  
    94  	for _, testCase := range testCases {
    95  		t.Run(testCase.name, func(t *testing.T) {
    96  			err := testCase.kubernetes.Validate(testCase.dryRun)
    97  			if testCase.expectedErr && err == nil {
    98  				t.Errorf("%s: expected an error but got none", testCase.name)
    99  			}
   100  			if !testCase.expectedErr && err != nil {
   101  				t.Errorf("%s: expected no error but got one: %v", testCase.name, err)
   102  			}
   103  		})
   104  	}
   105  }
   106  
   107  func TestResolveSetsConfigsButDoesntSetClients(t *testing.T) {
   108  	config := `apiVersion: v1
   109  clusters:
   110  - cluster:
   111      server: https://build
   112    name: build
   113  - cluster:
   114      server: https://kubernetes.default
   115    name: incluster
   116  contexts:
   117  - context:
   118      cluster: build
   119      user: build
   120    name: build
   121  - context:
   122      cluster: incluster
   123      user: incluster
   124    name: incluster
   125  kind: Config
   126  # We consider current-context to be in-cluster context to be prowjob context ¯\_(ツ)_/¯
   127  # https://github.com/kubernetes/test-infra/blob/1f02f841b7ffdbe78f14d20cabba4531e34feb20/prow/kube/config.go#L126-L127
   128  current-context: incluster
   129  users:
   130  - name: build
   131    user:
   132      token: abc
   133  - name: incluster
   134    user:
   135      token: cde
   136  `
   137  
   138  	tmpFile, err := os.CreateTemp("", "")
   139  	if err != nil {
   140  		t.Fatalf("failed to get tempfile: %v", err)
   141  	}
   142  	kubeconfig := tmpFile.Name()
   143  	defer func() {
   144  		if err := os.Remove(kubeconfig); err != nil {
   145  			t.Errorf("failed to remove tempfile: %v", err)
   146  		}
   147  	}()
   148  	if _, err := tmpFile.Write([]byte(config)); err != nil {
   149  		t.Errorf("failed to write config to tempfile: %v", err)
   150  	}
   151  	if err := tmpFile.Close(); err != nil {
   152  		t.Errorf("failed to close tempfile: %v", err)
   153  	}
   154  
   155  	o := &KubernetesOptions{kubeconfig: kubeconfig}
   156  	if err := o.resolve(true); err != nil {
   157  		t.Fatalf("resolve failed: %v", err)
   158  	}
   159  	if len(o.clusterConfigs) == 0 {
   160  		t.Errorf("expected clsuterconfig to be set, was %v", o.clusterConfigs)
   161  	}
   162  	if o.infrastructureClusterConfig == nil {
   163  		t.Error("expected infrastructureClusterConfig to be set, was nil")
   164  	}
   165  	if len(o.kubernetesClientsByContext) != 0 {
   166  		t.Errorf("expected kubernetes clients to be nil, was %v", o.kubernetesClientsByContext)
   167  	}
   168  	if o.prowJobClientset != nil {
   169  		t.Errorf("expected prowJobClientset to be nil, was %v", o.prowJobClientset)
   170  	}
   171  }