-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcluster.go
157 lines (135 loc) · 4.72 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
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")
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
}