k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/cluster/gce/gci/configure_helper_test.go (about) 1 /* 2 Copyright 2017 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 gci 18 19 import ( 20 "fmt" 21 "io" 22 "os" 23 "os/exec" 24 "path/filepath" 25 "testing" 26 "text/template" 27 28 v1 "k8s.io/api/core/v1" 29 "k8s.io/apimachinery/pkg/runtime" 30 "k8s.io/kubernetes/pkg/api/legacyscheme" 31 ) 32 33 const ( 34 envScriptFileName = "kube-env" 35 ) 36 37 type ManifestTestCase struct { 38 pod v1.Pod 39 manifest string 40 auxManifests []string 41 kubeHome string 42 manifestSources string 43 manifestDestination string 44 manifestTemplateDir string 45 manifestTemplate string 46 manifestFuncName string 47 t *testing.T 48 } 49 50 func newManifestTestCase(t *testing.T, manifest, funcName string, auxManifests []string) *ManifestTestCase { 51 c := &ManifestTestCase{ 52 t: t, 53 manifest: manifest, 54 auxManifests: auxManifests, 55 manifestFuncName: funcName, 56 } 57 58 d, err := os.MkdirTemp("", "configure-helper-test") 59 if err != nil { 60 c.t.Fatalf("Failed to create temp directory: %v", err) 61 } 62 63 c.kubeHome = d 64 c.manifestSources = filepath.Join(c.kubeHome, "kube-manifests", "kubernetes", "gci-trusty") 65 66 currentPath, err := os.Getwd() 67 if err != nil { 68 c.t.Fatalf("Failed to get current directory: %v", err) 69 } 70 gceDir := filepath.Dir(currentPath) 71 c.manifestTemplateDir = filepath.Join(gceDir, "manifests") 72 c.manifestTemplate = filepath.Join(c.manifestTemplateDir, c.manifest) 73 c.manifestDestination = filepath.Join(c.kubeHome, "etc", "kubernetes", "manifests", c.manifest) 74 75 c.mustCopyFromTemplate() 76 c.mustCopyAuxFromTemplate() 77 c.mustCreateManifestDstDir() 78 79 return c 80 } 81 82 func (c *ManifestTestCase) mustCopyFromTemplate() { 83 if err := os.MkdirAll(c.manifestSources, os.ModePerm); err != nil { 84 c.t.Fatalf("Failed to create source directory: %v", err) 85 } 86 87 if err := copyFile(c.manifestTemplate, filepath.Join(c.manifestSources, c.manifest)); err != nil { 88 c.t.Fatalf("Failed to copy source manifest to KUBE_HOME: %v", err) 89 } 90 } 91 92 func (c *ManifestTestCase) mustCopyAuxFromTemplate() { 93 for _, m := range c.auxManifests { 94 err := copyFile(filepath.Join(c.manifestTemplateDir, m), filepath.Join(c.manifestSources, m)) 95 if err != nil { 96 c.t.Fatalf("Failed to copy source manifest %s to KUBE_HOME: %v", m, err) 97 } 98 } 99 } 100 101 func (c *ManifestTestCase) mustCreateManifestDstDir() { 102 p := filepath.Join(filepath.Join(c.kubeHome, "etc", "kubernetes", "manifests")) 103 if err := os.MkdirAll(p, os.ModePerm); err != nil { 104 c.t.Fatalf("Failed to create designation folder for kube-apiserver.manifest: %v", err) 105 } 106 } 107 108 func (c *ManifestTestCase) mustInvokeFunc(env interface{}, scriptNames []string, targetTemplate string, templates ...string) { 109 envScriptPath := c.mustCreateEnv(env, targetTemplate, templates...) 110 args := fmt.Sprintf("source %q ;", envScriptPath) 111 for _, script := range scriptNames { 112 args += fmt.Sprintf("source %q ;", script) 113 } 114 args += c.manifestFuncName 115 cmd := exec.Command("bash", "-c", args) 116 117 bs, err := cmd.CombinedOutput() 118 if err != nil { 119 c.t.Logf("%q", bs) 120 c.t.Fatalf("Failed to run %q: %v", cmd.Args, err) 121 } 122 c.t.Logf("%s", string(bs)) 123 } 124 125 func (c *ManifestTestCase) mustCreateEnv(env interface{}, target string, templates ...string) string { 126 f, err := os.Create(filepath.Join(c.kubeHome, envScriptFileName)) 127 if err != nil { 128 c.t.Fatalf("Failed to create envScript: %v", err) 129 } 130 defer f.Close() 131 132 t, err := template.ParseFiles(templates...) 133 if err != nil { 134 c.t.Fatalf("Failed to parse files %q, err: %v", templates, err) 135 } 136 137 if err = t.ExecuteTemplate(f, target, env); err != nil { 138 c.t.Fatalf("Failed to execute template %s, err: %v", target, err) 139 } 140 141 return f.Name() 142 } 143 144 func (c *ManifestTestCase) mustLoadPodFromManifest() { 145 json, err := os.ReadFile(c.manifestDestination) 146 if err != nil { 147 c.t.Fatalf("Failed to read manifest: %s, %v", c.manifestDestination, err) 148 } 149 150 if err := runtime.DecodeInto(legacyscheme.Codecs.UniversalDecoder(), json, &c.pod); err != nil { 151 c.t.Fatalf("Failed to decode manifest:\n%s\nerror: %v", json, err) 152 } 153 } 154 155 func (c *ManifestTestCase) tearDown() { 156 if err := os.RemoveAll(c.kubeHome); err != nil { 157 c.t.Fatalf("Failed to teardown: %s", err) 158 } 159 } 160 161 func copyFile(src, dst string) (err error) { 162 in, err := os.Open(src) 163 if err != nil { 164 return err 165 } 166 defer in.Close() 167 out, err := os.Create(dst) 168 if err != nil { 169 return err 170 } 171 defer func() { 172 cerr := out.Close() 173 if err == nil { 174 err = cerr 175 } 176 }() 177 _, err = io.Copy(out, in) 178 return err 179 }