-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcluster.go
196 lines (170 loc) · 5.82 KB
/
cluster.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"strconv"
"k8s.io/klog"
)
func clusterDownGCE(k8sDir string) error {
cmd := exec.Command(filepath.Join(k8sDir, "hack", "e2e-internal", "e2e-down.sh"))
err := runCommand("Bringing Down E2E Cluster on GCE", cmd)
if err != nil {
return fmt.Errorf("failed to bring down kubernetes e2e cluster on gce: %v", err)
}
return nil
}
func clusterDownGKE(gceZone string) error {
cmd := exec.Command("gcloud", "container", "clusters", "delete", gkeTestClusterName,
"--zone", gceZone, "--quiet", "--machine-type", "n1-standard-2")
err := runCommand("Bringing Down E2E Cluster on GKE", cmd)
if err != nil {
return fmt.Errorf("failed to bring down kubernetes e2e cluster on gke: %v", err)
}
return nil
}
func buildKubernetes(k8sDir, command string) error {
cmd := exec.Command("make", "-C", k8sDir, command)
err := runCommand("Building Kubernetes", cmd)
if err != nil {
return fmt.Errorf("failed to build Kubernetes: %v", err)
}
return nil
}
func clusterUpGCE(k8sDir, gceZone string, numNodes int) error {
kshPath := filepath.Join(k8sDir, "cluster", "kubectl.sh")
_, err := os.Stat(kshPath)
if err == nil {
// Set kubectl to the one bundled in the k8s tar for versioning
err = os.Setenv("GCE_PD_KUBECTL", kshPath)
if err != nil {
return fmt.Errorf("failed to set cluster specific kubectl: %v", err)
}
} else {
klog.Errorf("could not find cluster kubectl at %s, falling back to default kubectl", kshPath)
}
if len(*kubeFeatureGates) != 0 {
err = os.Setenv("KUBE_FEATURE_GATES", *kubeFeatureGates)
if err != nil {
return fmt.Errorf("failed to set kubernetes feature gates: %v", err)
}
klog.V(4).Infof("Set Kubernetes feature gates: %v", *kubeFeatureGates)
}
err = os.Setenv("NUM_NODES", strconv.Itoa(numNodes))
if err != nil {
return err
}
err = os.Setenv("KUBE_GCE_ZONE", gceZone)
if err != nil {
return err
}
cmd := exec.Command(filepath.Join(k8sDir, "hack", "e2e-internal", "e2e-up.sh"))
err = runCommand("Starting E2E Cluster on GCE", cmd)
if err != nil {
return fmt.Errorf("failed to bring up kubernetes e2e cluster on gce: %v", err)
}
return nil
}
func clusterUpGKE(gceZone string, numNodes int) error {
out, err := exec.Command("gcloud", "container", "clusters", "list", "--zone", gceZone,
"--filter", fmt.Sprintf("name=%s", gkeTestClusterName)).CombinedOutput()
if err != nil {
return fmt.Errorf("failed to check for previous test cluster: %v %s", err, out)
}
if len(out) > 0 {
klog.Infof("Detected previous cluster %s. Deleting so a new one can be created...", gkeTestClusterName)
err = clusterDownGKE(gceZone)
if err != nil {
return err
}
}
cmd := exec.Command("gcloud", "container", "clusters", "create", gkeTestClusterName,
"--zone", gceZone, "--cluster-version", *gkeClusterVer, "--num-nodes", strconv.Itoa(numNodes), "--quiet")
err = runCommand("Staring E2E Cluster on GKE", cmd)
if err != nil {
return fmt.Errorf("failed to bring up kubernetes e2e cluster on gke: %v", err)
}
return nil
}
func downloadKubernetesSource(pkgDir, k8sIoDir, kubeVersion string) error {
k8sDir := filepath.Join(k8sIoDir, "kubernetes")
/*
// TODO: Download a fresh copy every time until mutate manifests hardcoding existing image is solved.
if _, err := os.Stat(k8sDir); !os.IsNotExist(err) {
klog.Infof("Staging Kubernetes already found at %s, skipping download", k8sDir)
return nil
}
*/
klog.V(4).Infof("Staging Kubernetes folder not found, downloading now")
err := os.MkdirAll(k8sIoDir, 0777)
if err != nil {
return err
}
kubeTarDir := filepath.Join(k8sIoDir, fmt.Sprintf("kubernetes-%s.tar.gz", kubeVersion))
var vKubeVersion string
if kubeVersion == "master" {
vKubeVersion = kubeVersion
// A hack to be able to build Kubernetes in this nested place
// KUBE_GIT_VERSION_FILE set to file to load kube version from
err = os.Setenv("KUBE_GIT_VERSION_FILE", filepath.Join(pkgDir, "test", "k8s-integration", ".dockerized-kube-version-defs"))
if err != nil {
return err
}
} else {
vKubeVersion = "v" + kubeVersion
}
out, err := exec.Command("curl", "-L", fmt.Sprintf("https://github.com/kubernetes/kubernetes/archive/%s.tar.gz", vKubeVersion), "-o", kubeTarDir).CombinedOutput()
if err != nil {
return fmt.Errorf("failed to curl kubernetes version %s: %s, err: %v", kubeVersion, out, err)
}
out, err = exec.Command("tar", "-C", k8sIoDir, "-xvf", kubeTarDir).CombinedOutput()
if err != nil {
return fmt.Errorf("failed to untar %s: %s, err: %v", kubeTarDir, out, err)
}
err = os.RemoveAll(k8sDir)
if err != nil {
return err
}
err = os.Rename(filepath.Join(k8sIoDir, fmt.Sprintf("kubernetes-%s", kubeVersion)), k8sDir)
if err != nil {
return err
}
klog.V(4).Infof("Successfully downloaded Kubernetes v%s to %s", kubeVersion, k8sDir)
return nil
}
func getGKEKubeTestArgs() ([]string, error) {
var gkeEnv string
switch gkeURL := os.Getenv("CLOUDSDK_API_ENDPOINT_OVERRIDES_CONTAINER"); gkeURL {
case "https://staging-container.sandbox.googleapis.com/":
gkeEnv = "staging"
case "https://test-container.sandbox.googleapis.com/":
gkeEnv = "test"
case "":
gkeEnv = "prod"
default:
// if the URL does not match to an option, assume it is a custom GKE backend
// URL and pass that to kubetest
gkeEnv = gkeURL
}
cmd := exec.Command("gcloud", "config", "get-value", "project")
project, err := cmd.Output()
if err != nil {
return nil, fmt.Errorf("failed to get current project: %v", err)
}
args := []string{
"--up=false",
"--down=false",
"--provider=gke",
"--gcp-network=default",
"--check-version-skew=false",
"--deployment=gke",
"--gcp-node-image=cos",
"--gcp-network=default",
fmt.Sprintf("--cluster=%s", gkeTestClusterName),
fmt.Sprintf("--gke-environment=%s", gkeEnv),
fmt.Sprintf("--gcp-zone=%s", *gceZone),
fmt.Sprintf("--gcp-project=%s", project[:len(project)-1]),
}
return args, nil
}