mirror of https://github.com/knative/pkg.git
				
				
				
			testing setup (#639)
This commit is contained in:
		
							parent
							
								
									014d54e62f
								
							
						
					
					
						commit
						c92533920c
					
				| 
						 | 
				
			
			@ -96,8 +96,7 @@ func (gsc *GKESDKClient) get(project, location, cluster string) (*container.Clus
 | 
			
		|||
// nodeType: default to n1-standard-4 if not provided
 | 
			
		||||
// region: default to regional cluster if not provided, and use default backup regions
 | 
			
		||||
// zone: default is none, must be provided together with region
 | 
			
		||||
func (gs *GKEClient) Setup(numNodes *int64, nodeType *string, region *string, zone *string, project *string) (ClusterOperations, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
func (gs *GKEClient) Setup(numNodes *int64, nodeType *string, region *string, zone *string, project *string) ClusterOperations {
 | 
			
		||||
	gc := &GKECluster{
 | 
			
		||||
		Request: &GKERequest{
 | 
			
		||||
			NumNodes:      DefaultGKENumNodes,
 | 
			
		||||
| 
						 | 
				
			
			@ -107,60 +106,70 @@ func (gs *GKEClient) Setup(numNodes *int64, nodeType *string, region *string, zo
 | 
			
		|||
			BackupRegions: DefaultGKEBackupRegions},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx := context.Background()
 | 
			
		||||
	if nil != project { // use provided project and create cluster
 | 
			
		||||
		gc.Project = project
 | 
			
		||||
		gc.NeedCleanup = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if nil != numNodes {
 | 
			
		||||
		gc.Request.NumNodes = *numNodes
 | 
			
		||||
	}
 | 
			
		||||
	if nil != nodeType {
 | 
			
		||||
		gc.Request.NodeType = *nodeType
 | 
			
		||||
	}
 | 
			
		||||
	if nil != region {
 | 
			
		||||
		gc.Request.Region = *region
 | 
			
		||||
	}
 | 
			
		||||
	if "" != common.GetOSEnv(regionEnv) {
 | 
			
		||||
		gc.Request.Region = common.GetOSEnv(regionEnv)
 | 
			
		||||
	}
 | 
			
		||||
	if "" != common.GetOSEnv(backupRegionEnv) {
 | 
			
		||||
		gc.Request.BackupRegions = strings.Split(common.GetOSEnv(backupRegionEnv), " ")
 | 
			
		||||
	}
 | 
			
		||||
	if nil != zone {
 | 
			
		||||
		gc.Request.Zone = *zone
 | 
			
		||||
		gc.Request.BackupRegions = make([]string, 0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx := context.Background()
 | 
			
		||||
	c, err := google.DefaultClient(ctx, container.CloudPlatformScope)
 | 
			
		||||
	if nil != err {
 | 
			
		||||
		return nil, fmt.Errorf("failed create google client: '%v'", err)
 | 
			
		||||
		log.Fatalf("failed create google client: '%v'", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	containerService, err := container.New(c)
 | 
			
		||||
	if nil != err {
 | 
			
		||||
		return nil, fmt.Errorf("failed create container service: '%v'", err)
 | 
			
		||||
		log.Fatalf("failed create container service: '%v'", err)
 | 
			
		||||
	}
 | 
			
		||||
	gc.operations = &GKESDKClient{containerService}
 | 
			
		||||
 | 
			
		||||
	if nil != project { // use provided project and create cluster
 | 
			
		||||
		gc.Project = project
 | 
			
		||||
		gc.NeedCleanup = true
 | 
			
		||||
	} else if err := gc.checkEnvironment(); nil != err {
 | 
			
		||||
		return nil, fmt.Errorf("failed checking existing cluster: '%v'", err)
 | 
			
		||||
	} else if nil != gc.Cluster { // return if Cluster was already set by kubeconfig
 | 
			
		||||
		return gc, nil
 | 
			
		||||
	return gc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Initialize sets up GKE SDK client, checks environment for cluster and
 | 
			
		||||
// projects to decide whether use existing cluster/project or creating new ones.
 | 
			
		||||
func (gc *GKECluster) Initialize() error {
 | 
			
		||||
	if nil == gc.Project {
 | 
			
		||||
		if err := gc.checkEnvironment(); nil != err {
 | 
			
		||||
			return fmt.Errorf("failed checking existing cluster: '%v'", err)
 | 
			
		||||
		} else if nil != gc.Cluster { // return if Cluster was already set by kubeconfig
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if nil == gc.Cluster {
 | 
			
		||||
		if common.IsProw() {
 | 
			
		||||
			project, err := boskos.AcquireGKEProject(nil)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, fmt.Errorf("failed acquire boskos project: '%v'", err)
 | 
			
		||||
				return fmt.Errorf("failed acquire boskos project: '%v'", err)
 | 
			
		||||
			}
 | 
			
		||||
			gc.Project = &project.Name
 | 
			
		||||
		}
 | 
			
		||||
		if nil != numNodes {
 | 
			
		||||
			gc.Request.NumNodes = *numNodes
 | 
			
		||||
		}
 | 
			
		||||
		if nil != nodeType {
 | 
			
		||||
			gc.Request.NodeType = *nodeType
 | 
			
		||||
		}
 | 
			
		||||
		if nil != region {
 | 
			
		||||
			gc.Request.Region = *region
 | 
			
		||||
		}
 | 
			
		||||
		if "" != common.GetOSEnv(regionEnv) {
 | 
			
		||||
			gc.Request.Region = common.GetOSEnv(regionEnv)
 | 
			
		||||
		}
 | 
			
		||||
		if "" != common.GetOSEnv(backupRegionEnv) {
 | 
			
		||||
			gc.Request.BackupRegions = strings.Split(common.GetOSEnv(backupRegionEnv), " ")
 | 
			
		||||
		}
 | 
			
		||||
		if nil != zone {
 | 
			
		||||
			gc.Request.Zone = *zone
 | 
			
		||||
			gc.Request.BackupRegions = make([]string, 0)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if nil == gc.Project || "" == *gc.Project {
 | 
			
		||||
		return nil, fmt.Errorf("gcp project must be set")
 | 
			
		||||
		return fmt.Errorf("gcp project must be set")
 | 
			
		||||
	}
 | 
			
		||||
	log.Printf("use project '%s' for running test", *gc.Project)
 | 
			
		||||
	return gc, nil
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Provider returns gke
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,8 @@ package clustermanager
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
| 
						 | 
				
			
			@ -90,6 +92,244 @@ func (fgsc *FakeGKESDKClient) get(project, location, cluster string) (*container
 | 
			
		|||
	return nil, fmt.Errorf("cluster not found")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSetup(t *testing.T) {
 | 
			
		||||
	numNodesOverride := int64(2)
 | 
			
		||||
	nodeTypeOverride := "foonode"
 | 
			
		||||
	regionOverride := "fooregion"
 | 
			
		||||
	zoneOverride := "foozone"
 | 
			
		||||
	datas := []struct {
 | 
			
		||||
		numNodes                        *int64
 | 
			
		||||
		nodeType, region, zone, project *string
 | 
			
		||||
		regionEnv, backupRegionEnv      string
 | 
			
		||||
		expClusterOperations            *GKECluster
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			// Defaults
 | 
			
		||||
			nil, nil, nil, nil, nil, "", "",
 | 
			
		||||
			&GKECluster{
 | 
			
		||||
				Request: &GKERequest{
 | 
			
		||||
					NumNodes:      1,
 | 
			
		||||
					NodeType:      "n1-standard-4",
 | 
			
		||||
					Region:        "us-central1",
 | 
			
		||||
					Zone:          "",
 | 
			
		||||
					BackupRegions: []string{"us-west1", "us-east1"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}, {
 | 
			
		||||
			// Project provided
 | 
			
		||||
			nil, nil, nil, nil, &fakeProj, "", "",
 | 
			
		||||
			&GKECluster{
 | 
			
		||||
				Request: &GKERequest{
 | 
			
		||||
					NumNodes:      1,
 | 
			
		||||
					NodeType:      "n1-standard-4",
 | 
			
		||||
					Region:        "us-central1",
 | 
			
		||||
					Zone:          "",
 | 
			
		||||
					BackupRegions: []string{"us-west1", "us-east1"},
 | 
			
		||||
				},
 | 
			
		||||
				Project:     &fakeProj,
 | 
			
		||||
				NeedCleanup: true,
 | 
			
		||||
			},
 | 
			
		||||
		}, {
 | 
			
		||||
			// Override other parts
 | 
			
		||||
			&numNodesOverride, &nodeTypeOverride, ®ionOverride, &zoneOverride, nil, "", "",
 | 
			
		||||
			&GKECluster{
 | 
			
		||||
				Request: &GKERequest{
 | 
			
		||||
					NumNodes:      2,
 | 
			
		||||
					NodeType:      "foonode",
 | 
			
		||||
					Region:        "fooregion",
 | 
			
		||||
					Zone:          "foozone",
 | 
			
		||||
					BackupRegions: []string{},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}, {
 | 
			
		||||
			// Override other parts but not zone
 | 
			
		||||
			&numNodesOverride, &nodeTypeOverride, ®ionOverride, nil, nil, "", "",
 | 
			
		||||
			&GKECluster{
 | 
			
		||||
				Request: &GKERequest{
 | 
			
		||||
					NumNodes:      2,
 | 
			
		||||
					NodeType:      "foonode",
 | 
			
		||||
					Region:        "fooregion",
 | 
			
		||||
					Zone:          "",
 | 
			
		||||
					BackupRegions: []string{"us-west1", "us-east1"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}, {
 | 
			
		||||
			// Set env Region
 | 
			
		||||
			nil, nil, nil, nil, nil, "customregion", "",
 | 
			
		||||
			&GKECluster{
 | 
			
		||||
				Request: &GKERequest{
 | 
			
		||||
					NumNodes:      1,
 | 
			
		||||
					NodeType:      "n1-standard-4",
 | 
			
		||||
					Region:        "customregion",
 | 
			
		||||
					Zone:          "",
 | 
			
		||||
					BackupRegions: []string{"us-west1", "us-east1"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}, {
 | 
			
		||||
			// Set env backupzone
 | 
			
		||||
			nil, nil, nil, nil, nil, "", "backupregion1 backupregion2",
 | 
			
		||||
			&GKECluster{
 | 
			
		||||
				Request: &GKERequest{
 | 
			
		||||
					NumNodes:      1,
 | 
			
		||||
					NodeType:      "n1-standard-4",
 | 
			
		||||
					Region:        "us-central1",
 | 
			
		||||
					Zone:          "",
 | 
			
		||||
					BackupRegions: []string{"backupregion1", "backupregion2"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// mock GetOSEnv for testing
 | 
			
		||||
	oldEnvFunc := common.GetOSEnv
 | 
			
		||||
	oldExecFunc := common.StandardExec
 | 
			
		||||
	oldDefaultCred := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")
 | 
			
		||||
	tf, _ := ioutil.TempFile("", "foo")
 | 
			
		||||
	tf.WriteString(`{"type": "service_account"}`)
 | 
			
		||||
	os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", tf.Name())
 | 
			
		||||
	defer func() {
 | 
			
		||||
		// restore
 | 
			
		||||
		common.GetOSEnv = oldEnvFunc
 | 
			
		||||
		common.StandardExec = oldExecFunc
 | 
			
		||||
		os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", oldDefaultCred)
 | 
			
		||||
		os.Remove(tf.Name())
 | 
			
		||||
	}()
 | 
			
		||||
	// mock as kubectl not set and gcloud set as "b", so check environment
 | 
			
		||||
	// return project as "b"
 | 
			
		||||
	common.StandardExec = func(name string, args ...string) ([]byte, error) {
 | 
			
		||||
		var out []byte
 | 
			
		||||
		var err error
 | 
			
		||||
		switch name {
 | 
			
		||||
		case "gcloud":
 | 
			
		||||
			out = []byte("b")
 | 
			
		||||
			err = nil
 | 
			
		||||
		case "kubectl":
 | 
			
		||||
			out = []byte("")
 | 
			
		||||
			err = fmt.Errorf("kubectl not set")
 | 
			
		||||
		default:
 | 
			
		||||
			out, err = oldExecFunc(name)
 | 
			
		||||
		}
 | 
			
		||||
		return out, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, data := range datas {
 | 
			
		||||
		common.GetOSEnv = func(s string) string {
 | 
			
		||||
			switch s {
 | 
			
		||||
			case "E2E_CLUSTER_REGION":
 | 
			
		||||
				return data.regionEnv
 | 
			
		||||
			case "E2E_CLUSTER_BACKUP_REGIONS":
 | 
			
		||||
				return data.backupRegionEnv
 | 
			
		||||
			}
 | 
			
		||||
			return oldEnvFunc(s)
 | 
			
		||||
		}
 | 
			
		||||
		c := GKEClient{}
 | 
			
		||||
		co := c.Setup(data.numNodes, data.nodeType, data.region, data.zone, data.project)
 | 
			
		||||
		errPrefix := fmt.Sprintf("testing setup with:\n\tnumNodes: %v\n\tnodeType: %v\n\tregion: %v\n\tone: %v\n\tproject: %v\n\tregionEnv: %v\n\tbackupRegionEnv: %v",
 | 
			
		||||
			data.numNodes, data.nodeType, data.region, data.zone, data.project, data.regionEnv, data.backupRegionEnv)
 | 
			
		||||
		gotCo := co.(*GKECluster)
 | 
			
		||||
		// mock for easier comparison
 | 
			
		||||
		gotCo.operations = nil
 | 
			
		||||
		if !reflect.DeepEqual(co, data.expClusterOperations) {
 | 
			
		||||
			t.Fatalf("%s\nwant GKECluster:\n'%v'\ngot GKECluster:\n'%v'", errPrefix, data.expClusterOperations, co)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestInitialize(t *testing.T) {
 | 
			
		||||
	customProj := "customproj"
 | 
			
		||||
	datas := []struct {
 | 
			
		||||
		project      *string
 | 
			
		||||
		clusterExist bool
 | 
			
		||||
		gcloudSet    bool
 | 
			
		||||
		expProj      *string
 | 
			
		||||
		expCluster   *container.Cluster
 | 
			
		||||
		expErr       error
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			// User defines project
 | 
			
		||||
			&fakeProj, false, false, &fakeProj, nil, nil,
 | 
			
		||||
		}, {
 | 
			
		||||
			// kubeconfig set
 | 
			
		||||
			nil, true, false, &fakeProj, &container.Cluster{
 | 
			
		||||
				Name:     "d",
 | 
			
		||||
				Location: "c",
 | 
			
		||||
				Status:   "RUNNING",
 | 
			
		||||
			}, nil,
 | 
			
		||||
		}, {
 | 
			
		||||
			// kubeconfig not set and gcloud not set
 | 
			
		||||
			nil, false, true, &customProj, nil, nil,
 | 
			
		||||
		}, {
 | 
			
		||||
			// kubeconfig not set and gcloud set
 | 
			
		||||
			nil, false, false, nil, nil, fmt.Errorf("gcp project must be set"),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oldEnvFunc := common.GetOSEnv
 | 
			
		||||
	oldExecFunc := common.StandardExec
 | 
			
		||||
	defer func() {
 | 
			
		||||
		// restore
 | 
			
		||||
		common.GetOSEnv = oldEnvFunc
 | 
			
		||||
		common.StandardExec = oldExecFunc
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	// Mock to make IsProw() always return false, otherwise it will actually
 | 
			
		||||
	// acquire a boskos project
 | 
			
		||||
	common.GetOSEnv = func(s string) string {
 | 
			
		||||
		switch s {
 | 
			
		||||
		case "PROW_JOB_ID":
 | 
			
		||||
			return ""
 | 
			
		||||
		}
 | 
			
		||||
		return oldEnvFunc(s)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, data := range datas {
 | 
			
		||||
		fgc := setupFakeGKECluster()
 | 
			
		||||
		if nil != data.project {
 | 
			
		||||
			fgc.Project = data.project
 | 
			
		||||
		}
 | 
			
		||||
		if data.clusterExist {
 | 
			
		||||
			parts := strings.Split("gke_b_c_d", "_")
 | 
			
		||||
			fgc.operations.create(parts[1], parts[2], &container.CreateClusterRequest{
 | 
			
		||||
				Cluster: &container.Cluster{
 | 
			
		||||
					Name: parts[3],
 | 
			
		||||
				},
 | 
			
		||||
				ProjectId: parts[1],
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
		// mock for testing
 | 
			
		||||
		common.StandardExec = func(name string, args ...string) ([]byte, error) {
 | 
			
		||||
			var out []byte
 | 
			
		||||
			var err error
 | 
			
		||||
			switch name {
 | 
			
		||||
			case "gcloud":
 | 
			
		||||
				out = []byte("")
 | 
			
		||||
				err = nil
 | 
			
		||||
				if data.gcloudSet {
 | 
			
		||||
					out = []byte(customProj)
 | 
			
		||||
					err = nil
 | 
			
		||||
				}
 | 
			
		||||
			case "kubectl":
 | 
			
		||||
				out = []byte("")
 | 
			
		||||
				err = fmt.Errorf("kubectl not set")
 | 
			
		||||
				if data.clusterExist {
 | 
			
		||||
					out = []byte("gke_b_c_d")
 | 
			
		||||
					err = nil
 | 
			
		||||
				}
 | 
			
		||||
			default:
 | 
			
		||||
				out, err = oldExecFunc(name, args...)
 | 
			
		||||
			}
 | 
			
		||||
			return out, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		err := fgc.Initialize()
 | 
			
		||||
		if !reflect.DeepEqual(err, data.expErr) || !reflect.DeepEqual(fgc.Project, data.expProj) || !reflect.DeepEqual(fgc.Cluster, data.expCluster) {
 | 
			
		||||
			t.Errorf("test initialize with:\n\tpreset project: '%v'\n\tkubeconfig set: '%v'\n\tgcloud set: '%v'\n"+
 | 
			
		||||
				"want:\n\tproject - '%v'\n\tcluster - '%v'\n\terr - '%v'\ngot:\n\tproject - '%v'\n\tcluster - '%v'\n\terr - '%v'",
 | 
			
		||||
				data.project, data.clusterExist, data.gcloudSet, data.expProj, data.expCluster, data.expErr, fgc.Project, fgc.Cluster, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGKECheckEnvironment(t *testing.T) {
 | 
			
		||||
	datas := []struct {
 | 
			
		||||
		kubectlOut   string
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue