forked from kubernetes/kubernetes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
basic.go
174 lines (157 loc) · 5.58 KB
/
basic.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
/*
Copyright 2015 Google Inc. All rights reserved.
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 e2e
import (
"fmt"
"io/ioutil"
"net/http"
"strings"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
"github.com/golang/glog"
)
// A basic test to check the deployment of an image using
// a replication controller. The image serves its hostname
// which is checked for each replica.
func TestBasicImage(c *client.Client, image string) bool {
ns := api.NamespaceDefault
// TODO(satnam6502): Generate a unique name to allow
// parallel executions of this test.
name := "my-hostname"
replicas := 2
// Attmept to delete a controller that might have been
// left lying around from a previously aborted test.
controllers, err := c.ReplicationControllers(ns).List(labels.Everything())
if err != nil {
glog.Infof("Failed to list replication controllers: %v", err)
return false
}
for _, cnt := range controllers.Items {
if cnt.Name == name {
glog.Infof("Found a straggler %s controller", name)
// Delete any pods controlled by this replicaiton controller.
cnt.Spec.Replicas = 0
if _, err := c.ReplicationControllers(ns).Update(&cnt); err != nil {
glog.Warningf("Failed to resize straggler controller to zero: %v", err)
}
// Delete the controller
if err = c.ReplicationControllers(ns).Delete(name); err != nil {
glog.Warningf("Failed to delete straggler replication controller: %v", err)
}
break
}
}
// Create a replication controller for a service
// that serves its hostname on port 8080.
// The source for the Docker containter kubernetes/serve_hostname is
// in contrib/for-demos/serve_hostname
glog.Infof("Creating replication controller %s", name)
controller, err := c.ReplicationControllers(ns).Create(&api.ReplicationController{
ObjectMeta: api.ObjectMeta{
Name: name,
},
Spec: api.ReplicationControllerSpec{
Replicas: replicas,
Selector: map[string]string{
"name": name,
},
Template: &api.PodTemplateSpec{
ObjectMeta: api.ObjectMeta{
Labels: map[string]string{"name": name},
},
Spec: api.PodSpec{
Containers: []api.Container{
{
Name: name,
Image: image,
Ports: []api.Port{{ContainerPort: 9376, HostPort: 8080}},
},
},
},
},
},
})
if err != nil {
glog.Infof("Failed to create replication controller for %s: %v", name, err)
return false
}
// List the pods.
// pods, err := c.Pods(ns).List(labels.Set{"name": name}.AsSelector())
pods, err := c.Pods(ns).List(labels.SelectorFromSet(labels.Set(map[string]string{"name": name})))
if err != nil {
glog.Errorf("Failed to list pods before wait for running check: %v", err)
return false
}
for i, pod := range pods.Items {
glog.Infof("Replica %d: %s\n", i+1, pod.Name)
}
// Wait for the pods to enter the running state. Waiting loops until the pods
// are running so non-running pods cause a timeout for this test.
for _, pod := range pods.Items {
waitForPodRunning(c, pod.Name)
}
// List the pods again to get the host IP information.
pods, err = c.Pods(ns).List(labels.SelectorFromSet(labels.Set(map[string]string{"name": name})))
if err != nil {
glog.Errorf("Failed to list pods after wait for running check: %v", err)
return false
}
// Verify that something is listening.
for i, pod := range pods.Items {
glog.Infof("Pod: %s hostIP: %s", pod.Name, pod.Status.HostIP)
if pod.Status.HostIP == "" {
glog.Warningf("Skipping test of GET response since hostIP is not available")
continue
}
resp, err := http.Get(fmt.Sprintf("http://%s:8080", pod.Status.HostIP))
if err != nil {
glog.Errorf("Failed to GET from replica %d: %v", i+1, err)
return false
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
glog.Errorf("Expected OK status code for replica %d but got %d", i+1, resp.StatusCode)
return false
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Errorf("Failed to read the body of the GET response from replica %d: %v", i+1, err)
return false
}
// The body should be the pod name although we may need to skip a newline
// character at the end of the response.
if !strings.HasPrefix(string(body), pod.Name) {
glog.Errorf("From replica %d expected response %s but got %s", i+1, pod.Name, string(body))
return false
}
glog.Infof("Got expected result from replica %d: %s", i+1, string(body))
}
// Resize the replication controller to zero to get rid of pods.
controller.Spec.Replicas = 0
if _, err = c.ReplicationControllers(ns).Update(controller); err != nil {
glog.Errorf("Failed to resize replication controller to zero: %v", err)
return false
}
// Delete the replication controller.
if err = c.ReplicationControllers(ns).Delete(name); err != nil {
glog.Errorf("Failed to delete replication controller %s: %v", name, err)
return false
}
return true
}
// TestBasic performs the TestBasicImage check with the
// image kubernetes/serve_hostname
func TestBasic(c *client.Client) bool {
return TestBasicImage(c, "kubernetes/serve_hostname")
}