github.com/coreos/mantle@v0.13.0/kola/tests/kubernetes/basic.go (about) 1 // Copyright 2015 CoreOS, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package kubernetes 16 17 import ( 18 "bytes" 19 "fmt" 20 "strings" 21 "time" 22 23 "github.com/coreos/mantle/kola/cluster" 24 "github.com/coreos/mantle/kola/register" 25 "github.com/coreos/mantle/platform" 26 "github.com/coreos/mantle/util" 27 ) 28 29 // register a separate test for each version tag 30 var basicTags = []string{ 31 "v1.3.4_coreos.0", 32 } 33 34 // regester each tag once per runtime 35 var runtimes = []string{ 36 "docker", 37 } 38 39 func init() { 40 for i := range basicTags { 41 for j := range runtimes { 42 // use closure to store version and runtime in a Test 43 t, r := basicTags[i], runtimes[j] 44 f := func(c cluster.TestCluster) { 45 CoreOSBasic(c, t, r) 46 } 47 48 register.Register(®ister.Test{ 49 Name: "google.kubernetes.basic." + r + "." + t, 50 Run: f, 51 ClusterSize: 0, 52 Platforms: []string{"gce"}, 53 Distros: []string{"cl"}, 54 }) 55 } 56 } 57 } 58 59 // Run basic smoke tests on cluster. Assumes master is machine index 1, 60 // workers make up the rest. 61 func CoreOSBasic(c cluster.TestCluster, version, runtime string) { 62 k := setupCluster(c, 2, version, runtime) 63 64 // start nginx pod and curl endpoint 65 if err := nginxCheck(c, k.master, k.workers); err != nil { 66 c.Fatal(err) 67 } 68 69 // http://kubernetes.io/v1.0/docs/user-guide/secrets/ Also, ensures 70 // https://github.com/coreos/bugs/issues/447 does not re-occur. 71 if err := secretCheck(c, k.master, k.workers); err != nil { 72 c.Fatal(err) 73 } 74 } 75 76 func nodeCheck(c cluster.TestCluster, master platform.Machine, nodes []platform.Machine) error { 77 b, err := c.SSH(master, "./kubectl get nodes") 78 if err != nil { 79 return err 80 } 81 82 // parse kubectl output for IPs 83 addrMap := map[string]struct{}{} 84 for _, line := range strings.Split(string(b), "\n")[1:] { 85 addrMap[strings.SplitN(line, " ", 2)[0]] = struct{}{} 86 } 87 88 // add master to node list because it is now normal to register 89 // master nodes but have it set as unschedulable in kubernetes v1.2+ 90 nodes = append(nodes, master) 91 92 if len(addrMap) != len(nodes) { 93 return fmt.Errorf("cannot detect all nodes in kubectl output \n%v\n%v", addrMap, nodes) 94 } 95 for _, node := range nodes { 96 if _, ok := addrMap[node.PrivateIP()]; !ok { 97 return fmt.Errorf("node IP missing from kubectl get nodes") 98 } 99 } 100 return nil 101 } 102 103 func nginxCheck(c cluster.TestCluster, master platform.Machine, nodes []platform.Machine) error { 104 pod := strings.NewReader(nginxPodYAML) 105 if err := platform.InstallFile(pod, master, "./nginx-pod.yaml"); err != nil { 106 return err 107 } 108 if _, err := c.SSH(master, "./kubectl create -f nginx-pod.yaml"); err != nil { 109 return err 110 } 111 // wait for pod status to be 'Running' 112 podIsRunning := func() error { 113 b, err := c.SSH(master, "./kubectl get pod nginx --template={{.status.phase}}") 114 if err != nil { 115 return err 116 } 117 if !bytes.Equal(b, []byte("Running")) { 118 return fmt.Errorf("nginx pod not running: %s", b) 119 } 120 return nil 121 } 122 if err := util.Retry(10, 10*time.Second, podIsRunning); err != nil { 123 return err 124 } 125 126 // delete pod 127 _, err := c.SSH(master, "./kubectl delete pods nginx") 128 if err != nil { 129 return err 130 } 131 132 return nil 133 } 134 135 func secretCheck(c cluster.TestCluster, master platform.Machine, nodes []platform.Machine) error { 136 // create yaml files 137 secret := strings.NewReader(secretYAML) 138 pod := strings.NewReader(secretPodYAML) 139 if err := platform.InstallFile(secret, master, "./secret.yaml"); err != nil { 140 return err 141 } 142 if err := platform.InstallFile(pod, master, "./secret-pod.yaml"); err != nil { 143 return err 144 } 145 146 if _, err := c.SSH(master, "./kubectl create -f secret.yaml"); err != nil { 147 return err 148 } 149 _, err := c.SSH(master, "./kubectl describe secret test-secret") 150 if err != nil { 151 return err 152 } 153 154 b, err := c.SSH(master, "./kubectl create -f secret-pod.yaml") 155 if err != nil { 156 return err 157 } 158 expectedOutput := "value-1" 159 if strings.Contains(strings.TrimSpace(string(b)), expectedOutput) { 160 return fmt.Errorf("error detecting secret pod") 161 } 162 163 return nil 164 } 165 166 const ( 167 secretPodYAML = `apiVersion: v1 168 kind: Pod 169 metadata: 170 name: secret-test-pod 171 spec: 172 containers: 173 - name: test-container 174 image: kubernetes/mounttest:0.1 175 command: [ "/mt", "--file_content=/etc/secret-volume/data-1" ] 176 volumeMounts: 177 # name must match the volume name below 178 - name: secret-volume 179 mountPath: /etc/secret-volume 180 volumes: 181 - name: secret-volume 182 secret: 183 secretName: test-secret 184 restartPolicy: Never` 185 186 secretYAML = `apiVersion: v1 187 kind: Secret 188 metadata: 189 name: test-secret 190 data: 191 data-1: dmFsdWUtMQ0K 192 data-2: dmFsdWUtMg0KDQo=` 193 194 nginxPodYAML = `apiVersion: v1 195 kind: Pod 196 metadata: 197 name: nginx 198 labels: 199 app: nginx 200 spec: 201 containers: 202 - name: nginx 203 image: nginx 204 ports: 205 - containerPort: 80` 206 )