/
setup.go
134 lines (112 loc) · 3.64 KB
/
setup.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
Copyright 2020 The Knative 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 gke
import (
"log"
"strings"
container "google.golang.org/api/container/v1beta1"
"knative.dev/toolbox/kntest/pkg/cluster/manager/e2e-tests/boskos"
"knative.dev/toolbox/kntest/pkg/cluster/manager/e2e-tests/common"
"knative.dev/toolbox/pkg/gke"
)
// GKEClient implements Client
type GKEClient struct {
}
// GKERequest contains all requests collected for cluster creation
type GKERequest struct {
// Request holds settings for GKE native operations
gke.Request
// BackupRegions: fall back regions to try out in case of cluster creation
// failure due to regional issue(s)
BackupRegions []string
// SkipCreation: skips cluster creation
SkipCreation bool
// ResourceType: the boskos resource type to acquire to hold the cluster in create
ResourceType string
// SaveMetaData: save the meta data for the created cluster into a file
SaveMetaData bool
}
// GKECluster implements ClusterOperations
type GKECluster struct {
Request *GKERequest
// Project might be GKE specific, so put it here
Project string
Cluster *container.Cluster
// isBoskos is true if the GCP project used is managed by boskos
isBoskos bool
// asyncCleanup tells whether the cluster needs to be deleted asynchronously afterwards
// It should be true on Prow but false on local.
asyncCleanup bool
operations gke.SDKOperations
boskosOps boskos.Operation
}
// Setup sets up a GKECluster client, takes GEKRequest as parameter and applies
// all defaults if not defined.
func (gs *GKEClient) Setup(r GKERequest) ClusterOperations {
gc := &GKECluster{}
if r.Project != "" { // use provided project to create cluster
gc.Project = r.Project
} else if common.IsProw() { // if no project is provided and is on Prow, use boskos
gc.isBoskos = true
gc.asyncCleanup = true
}
if r.MinNodes == 0 {
r.MinNodes = defaultGKEMinNodes
}
if r.MaxNodes == 0 {
r.MaxNodes = defaultGKEMaxNodes
// We don't want MaxNodes < MinNodes
if r.MinNodes > r.MaxNodes {
r.MaxNodes = r.MinNodes
}
}
if r.NodeType == "" {
r.NodeType = defaultGKENodeType
}
// Only use default backup regions if region is not provided
if len(r.BackupRegions) == 0 && r.Region == "" {
r.BackupRegions = defaultGKEBackupRegions
if common.GetOSEnv(backupRegionEnv) != "" {
r.BackupRegions = strings.Split(common.GetOSEnv(backupRegionEnv), " ")
}
}
if r.Region == "" {
r.Region = defaultGKERegion
if common.GetOSEnv(regionEnv) != "" {
r.Region = common.GetOSEnv(regionEnv)
}
}
if r.Zone == "" {
r.Zone = defaultGKEZone
} else { // No backupregions if zone is provided
r.BackupRegions = make([]string, 0)
}
loc := gke.GetClusterLocation(r.Region, r.Zone)
if version, err := resolveGKEVersion(r.GKEVersion, loc); err == nil {
r.GKEVersion = version
} else {
log.Fatalf("Failed to resolve GKE version: '%v'", err)
}
if r.ResourceType == "" {
r.ResourceType = defaultResourceType
}
gc.Request = &r
client, err := boskos.NewClient("", /* boskos owner */
"", /* boskos user */
"" /* boskos password file */)
if err != nil {
log.Fatalf("Failed to create boskos client: '%v'", err)
}
gc.boskosOps = client
return gc
}