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  }