mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 05:40:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			173 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2017 The Kubernetes Authors.
 | |
| 
 | |
| Licensed under the Apache License, Version 2.0 (the "License");
 | |
| you may not use this file except in compliance with the License.
 | |
| You may obtain a copy of the License at
 | |
| 
 | |
|     http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
| Unless required by applicable law or agreed to in writing, software
 | |
| distributed under the License is distributed on an "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| See the License for the specific language governing permissions and
 | |
| limitations under the License.
 | |
| */
 | |
| 
 | |
| package gci
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"path/filepath"
 | |
| 	"testing"
 | |
| 	"text/template"
 | |
| 
 | |
| 	"k8s.io/api/core/v1"
 | |
| 	"k8s.io/apimachinery/pkg/runtime"
 | |
| 	"k8s.io/kubernetes/pkg/api/legacyscheme"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	envScriptFileName         = "kube-env"
 | |
| 	configureHelperScriptName = "configure-helper.sh"
 | |
| )
 | |
| 
 | |
| type ManifestTestCase struct {
 | |
| 	pod                 v1.Pod
 | |
| 	envScriptPath       string
 | |
| 	manifest            string
 | |
| 	auxManifests        []string
 | |
| 	kubeHome            string
 | |
| 	manifestSources     string
 | |
| 	manifestDestination string
 | |
| 	manifestTemplateDir string
 | |
| 	manifestTemplate    string
 | |
| 	manifestFuncName    string
 | |
| 	t                   *testing.T
 | |
| }
 | |
| 
 | |
| func newManifestTestCase(t *testing.T, manifest, funcName string, auxManifests []string) *ManifestTestCase {
 | |
| 	c := &ManifestTestCase{
 | |
| 		t:                t,
 | |
| 		manifest:         manifest,
 | |
| 		auxManifests:     auxManifests,
 | |
| 		manifestFuncName: funcName,
 | |
| 	}
 | |
| 
 | |
| 	d, err := ioutil.TempDir("", "configure-helper-test")
 | |
| 	if err != nil {
 | |
| 		c.t.Fatalf("Failed to create temp directory: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	c.kubeHome = d
 | |
| 	c.envScriptPath = filepath.Join(c.kubeHome, envScriptFileName)
 | |
| 	c.manifestSources = filepath.Join(c.kubeHome, "kube-manifests", "kubernetes", "gci-trusty")
 | |
| 
 | |
| 	currentPath, err := os.Getwd()
 | |
| 	if err != nil {
 | |
| 		c.t.Fatalf("Failed to get current directory: %v", err)
 | |
| 	}
 | |
| 	gceDir := filepath.Dir(currentPath)
 | |
| 	c.manifestTemplateDir = filepath.Join(gceDir, "manifests")
 | |
| 	c.manifestTemplate = filepath.Join(c.manifestTemplateDir, c.manifest)
 | |
| 	c.manifestDestination = filepath.Join(c.kubeHome, "etc", "kubernetes", "manifests", c.manifest)
 | |
| 
 | |
| 	c.mustCopyFromTemplate()
 | |
| 	c.mustCopyAuxFromTemplate()
 | |
| 	c.mustCreateManifestDstDir()
 | |
| 
 | |
| 	return c
 | |
| }
 | |
| 
 | |
| func (c *ManifestTestCase) mustCopyFromTemplate() {
 | |
| 	if err := os.MkdirAll(c.manifestSources, os.ModePerm); err != nil {
 | |
| 		c.t.Fatalf("Failed to create source directory: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	if err := copyFile(c.manifestTemplate, filepath.Join(c.manifestSources, c.manifest)); err != nil {
 | |
| 		c.t.Fatalf("Failed to copy source manifest to KUBE_HOME: %v", err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (c *ManifestTestCase) mustCopyAuxFromTemplate() {
 | |
| 	for _, m := range c.auxManifests {
 | |
| 		err := copyFile(filepath.Join(c.manifestTemplateDir, m), filepath.Join(c.manifestSources, m))
 | |
| 		if err != nil {
 | |
| 			c.t.Fatalf("Failed to copy source manifest %s to KUBE_HOME: %v", m, err)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (c *ManifestTestCase) mustCreateManifestDstDir() {
 | |
| 	p := filepath.Join(filepath.Join(c.kubeHome, "etc", "kubernetes", "manifests"))
 | |
| 	if err := os.MkdirAll(p, os.ModePerm); err != nil {
 | |
| 		c.t.Fatalf("Failed to create designation folder for kube-apiserver.manifest: %v", err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (c *ManifestTestCase) mustCreateEnv(envTemplate string, env interface{}) {
 | |
| 	f, err := os.Create(filepath.Join(c.kubeHome, envScriptFileName))
 | |
| 	if err != nil {
 | |
| 		c.t.Fatalf("Failed to create envScript: %v", err)
 | |
| 	}
 | |
| 	defer f.Close()
 | |
| 
 | |
| 	t := template.Must(template.New("env").Parse(envTemplate))
 | |
| 
 | |
| 	if err = t.Execute(f, env); err != nil {
 | |
| 		c.t.Fatalf("Failed to execute template: %v", err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (c *ManifestTestCase) mustInvokeFunc(envTemplate string, env interface{}) {
 | |
| 	c.mustCreateEnv(envTemplate, env)
 | |
| 	args := fmt.Sprintf("source %s ; source %s --source-only ; %s", c.envScriptPath, configureHelperScriptName, c.manifestFuncName)
 | |
| 	cmd := exec.Command("bash", "-c", args)
 | |
| 
 | |
| 	bs, err := cmd.CombinedOutput()
 | |
| 	if err != nil {
 | |
| 		c.t.Logf("%s", bs)
 | |
| 		c.t.Fatalf("Failed to run configure-helper.sh: %v", err)
 | |
| 	}
 | |
| 	c.t.Logf("%s", string(bs))
 | |
| }
 | |
| 
 | |
| func (c *ManifestTestCase) mustLoadPodFromManifest() {
 | |
| 	json, err := ioutil.ReadFile(c.manifestDestination)
 | |
| 	if err != nil {
 | |
| 		c.t.Fatalf("Failed to read manifest: %s, %v", c.manifestDestination, err)
 | |
| 	}
 | |
| 
 | |
| 	if err := runtime.DecodeInto(legacyscheme.Codecs.UniversalDecoder(), json, &c.pod); err != nil {
 | |
| 		c.t.Fatalf("Failed to decode manifest: %v", err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (c *ManifestTestCase) tearDown() {
 | |
| 	os.RemoveAll(c.kubeHome)
 | |
| }
 | |
| 
 | |
| func copyFile(src, dst string) (err error) {
 | |
| 	in, err := os.Open(src)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	defer in.Close()
 | |
| 	out, err := os.Create(dst)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	defer func() {
 | |
| 		cerr := out.Close()
 | |
| 		if cerr == nil {
 | |
| 			err = cerr
 | |
| 		}
 | |
| 	}()
 | |
| 	_, err = io.Copy(out, in)
 | |
| 	return err
 | |
| }
 |