Ported TestNetwork to native ginkgo syntax #4179

This commit is contained in:
Robert Rati 2015-02-06 08:53:41 -05:00
parent 6d171a458e
commit a1dcec8a1c

View File

@ -17,147 +17,156 @@ limitations under the License.
package e2e
import (
"fmt"
"net/http"
"time"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"github.com/golang/glog"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
func TestNetwork(c *client.Client) bool {
if testContext.provider == "vagrant" {
glog.Infof("Skipping test which is broken for vagrant (See https://github.com/GoogleCloudPlatform/kubernetes/issues/3580)")
return true
}
var _ = Describe("Networking", func() {
var c *client.Client
// Test basic external connectivity.
resp, err := http.Get("http://google.com/")
if err != nil {
glog.Errorf("unable to talk to the external internet: %v", err)
return false
}
if resp.StatusCode != http.StatusOK {
glog.Errorf("unexpected error code. expected 200, got: %v (%v)", resp.StatusCode, resp)
return false
}
ns := api.NamespaceDefault
// TODO(satnam6502): Replace call of randomSuffix with call to NewUUID when service
// names have the same form as pod and replication controller names.
name := "nettest-" + randomSuffix()
svc, err := c.Services(ns).Create(&api.Service{
ObjectMeta: api.ObjectMeta{
Name: name,
Labels: map[string]string{
"name": name,
},
},
Spec: api.ServiceSpec{
Port: 8080,
ContainerPort: util.NewIntOrStringFromInt(8080),
Selector: map[string]string{
"name": name,
},
},
BeforeEach(func() {
c = loadClientOrDie()
})
glog.Infof("Creating service with name %s", svc.Name)
if err != nil {
glog.Errorf("unable to create test service %s: %v", svc.Name, err)
return false
}
// Clean up service
defer func() {
if err = c.Services(ns).Delete(svc.Name); err != nil {
glog.Errorf("unable to delete svc %v: %v", svc.Name, err)
It("should function for pods", func() {
if testContext.provider == "vagrant" {
By("Skipping test which is broken for vagrant (See https://github.com/GoogleCloudPlatform/kubernetes/issues/3580)")
return
}
}()
rc, err := c.ReplicationControllers(ns).Create(&api.ReplicationController{
ObjectMeta: api.ObjectMeta{
Name: name,
Labels: map[string]string{
"name": name,
},
},
Spec: api.ReplicationControllerSpec{
Replicas: 8,
Selector: map[string]string{
"name": name,
},
Template: &api.PodTemplateSpec{
ObjectMeta: api.ObjectMeta{
Labels: map[string]string{"name": name},
// Test basic external connectivity.
resp, err := http.Get("http://google.com/")
if err != nil {
Fail(fmt.Sprintf("unable to talk to the external internet: %v", err))
}
if resp.StatusCode != http.StatusOK {
Fail(fmt.Sprintf("unexpected error code. expected 200, got: %v (%v)", resp.StatusCode, resp))
}
ns := api.NamespaceDefault
// TODO(satnam6502): Replace call of randomSuffix with call to NewUUID when service
// names have the same form as pod and replication controller names.
name := "nettest-" + randomSuffix()
svc, err := c.Services(ns).Create(&api.Service{
ObjectMeta: api.ObjectMeta{
Name: name,
Labels: map[string]string{
"name": name,
},
Spec: api.PodSpec{
Containers: []api.Container{
{
Name: "webserver",
Image: "kubernetes/nettest:latest",
Command: []string{"-service=" + name},
Ports: []api.Port{{ContainerPort: 8080}},
},
Spec: api.ServiceSpec{
Port: 8080,
ContainerPort: util.NewIntOrStringFromInt(8080),
Selector: map[string]string{
"name": name,
},
},
})
By(fmt.Sprintf("Creating service with name %s", svc.Name))
if err != nil {
Fail(fmt.Sprintf("unable to create test service %s: %v", svc.Name, err))
}
// Clean up service
defer func() {
defer GinkgoRecover()
By("Cleaning up the service")
if err = c.Services(ns).Delete(svc.Name); err != nil {
Fail(fmt.Sprintf("unable to delete svc %v: %v", svc.Name, err))
}
}()
By("Creating a replication controller")
rc, err := c.ReplicationControllers(ns).Create(&api.ReplicationController{
ObjectMeta: api.ObjectMeta{
Name: name,
Labels: map[string]string{
"name": name,
},
},
Spec: api.ReplicationControllerSpec{
Replicas: 8,
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: "webserver",
Image: "kubernetes/nettest:latest",
Command: []string{"-service=" + name},
Ports: []api.Port{{ContainerPort: 8080}},
},
},
},
},
},
},
})
if err != nil {
glog.Errorf("unable to create test rc: %v", err)
return false
}
// Clean up rc
defer func() {
rc.Spec.Replicas = 0
rc, err = c.ReplicationControllers(ns).Update(rc)
})
if err != nil {
glog.Errorf("unable to modify replica count for rc %v: %v", rc.Name, err)
return
Fail(fmt.Sprintf("unable to create test rc: %v", err))
}
if err = c.ReplicationControllers(ns).Delete(rc.Name); err != nil {
glog.Errorf("unable to delete rc %v: %v", rc.Name, err)
}
}()
const maxAttempts = 60
for i := 0; i < maxAttempts; i++ {
time.Sleep(2 * time.Second)
body, err := c.Get().Prefix("proxy").Resource("services").Name(svc.Name).Suffix("status").Do().Raw()
if err != nil {
glog.Infof("Attempt %v/%v: service/pod still starting. (error: '%v')", i, maxAttempts, err)
continue
}
switch string(body) {
case "pass":
glog.Infof("Passed on attempt %v. Cleaning up.", i)
return true
case "running":
glog.Infof("Attempt %v/%v: test still running", i, maxAttempts)
case "fail":
if body, err := c.Get().Prefix("proxy").Resource("services").Name(svc.Name).Suffix("read").Do().Raw(); err != nil {
glog.Infof("Failed on attempt %v. Cleaning up. Error reading details: %v", i, err)
} else {
glog.Infof("Failed on attempt %v. Cleaning up. Details:\n%v", i, string(body))
// Clean up rc
defer func() {
defer GinkgoRecover()
By("Cleaning up the replication controller")
rc.Spec.Replicas = 0
rc, err = c.ReplicationControllers(ns).Update(rc)
if err != nil {
Fail(fmt.Sprintf("unable to modify replica count for rc %v: %v", rc.Name, err))
}
if err = c.ReplicationControllers(ns).Delete(rc.Name); err != nil {
Fail(fmt.Sprintf("unable to delete rc %v: %v", rc.Name, err))
}
}()
By("Waiting for connectivity to be verified")
const maxAttempts = 60
passed := false
var body []byte
for i := 0; i < maxAttempts && !passed; i++ {
time.Sleep(2 * time.Second)
body, err = c.Get().Prefix("proxy").Resource("services").Name(svc.Name).Suffix("status").Do().Raw()
if err != nil {
fmt.Printf("Attempt %v/%v: service/pod still starting. (error: '%v')\n", i, maxAttempts, err)
continue
}
switch string(body) {
case "pass":
fmt.Printf("Passed on attempt %v. Cleaning up.\n", i)
passed = true
break
case "running":
fmt.Printf("Attempt %v/%v: test still running\n", i, maxAttempts)
break
case "fail":
if body, err = c.Get().Prefix("proxy").Resource("services").Name(svc.Name).Suffix("read").Do().Raw(); err != nil {
Fail(fmt.Sprintf("Failed on attempt %v. Cleaning up. Error reading details: %v", i, err))
} else {
Fail(fmt.Sprintf("Failed on attempt %v. Cleaning up. Details:\n%v", i, string(body)))
}
break
}
return false
}
}
if body, err := c.Get().Prefix("proxy").Resource("services").Name(svc.Name).Suffix("read").Do().Raw(); err != nil {
glog.Infof("Timed out. Cleaning up. Error reading details: %v", err)
} else {
glog.Infof("Timed out. Cleaning up. Details:\n%v", string(body))
}
return false
}
var _ = Describe("TestNetwork", func() {
It("should pass", func() {
// TODO: Instead of OrDie, client should Fail the test if there's a problem.
// In general tests should Fail() instead of glog.Fatalf().
Expect(TestNetwork(loadClientOrDie())).To(BeTrue())
if !passed {
if body, err = c.Get().Prefix("proxy").Resource("services").Name(svc.Name).Suffix("read").Do().Raw(); err != nil {
Fail(fmt.Sprintf("Timed out. Cleaning up. Error reading details: %v", err))
} else {
Fail(fmt.Sprintf("Timed out. Cleaning up. Details:\n%v", string(body)))
}
}
Expect(string(body)).To(Equal("pass"))
})
})