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 }