// Check that the pods comprising a service get spread evenly across available zones func SpreadServiceOrFail(f *framework.Framework, replicaCount int, image string) { // First create the service serviceName := "test-service" serviceSpec := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: serviceName, Namespace: f.Namespace.Name, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "service": serviceName, }, Ports: []api.ServicePort{{ Port: 80, TargetPort: intstr.FromInt(80), }}, }, } _, err := f.Client.Services(f.Namespace.Name).Create(serviceSpec) Expect(err).NotTo(HaveOccurred()) // Now create some pods behind the service podSpec := &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: serviceName, Labels: map[string]string{"service": serviceName}, }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "test", Image: framework.GetPauseImageName(f.Client), }, }, }, } // Caution: StartPods requires at least one pod to replicate. // Based on the callers, replicas is always positive number: zoneCount >= 0 implies (2*zoneCount)+1 > 0. // Thus, no need to test for it. Once the precondition changes to zero number of replicas, // test for replicaCount > 0. Otherwise, StartPods panics. framework.StartPods(f.Client, replicaCount, f.Namespace.Name, serviceName, *podSpec, false) // Wait for all of them to be scheduled selector := labels.SelectorFromSet(labels.Set(map[string]string{"service": serviceName})) pods, err := framework.WaitForPodsWithLabelScheduled(f.Client, f.Namespace.Name, selector) Expect(err).NotTo(HaveOccurred()) // Now make sure they're spread across zones zoneNames, err := getZoneNames(f.Client) Expect(err).NotTo(HaveOccurred()) Expect(checkZoneSpreading(f.Client, pods, zoneNames)).To(Equal(true)) }
// Check that the pods comprising a replication controller get spread evenly across available zones func SpreadRCOrFail(f *framework.Framework, replicaCount int32, image string) { name := "ubelite-spread-rc-" + string(util.NewUUID()) By(fmt.Sprintf("Creating replication controller %s", name)) controller, err := f.Client.ReplicationControllers(f.Namespace.Name).Create(&api.ReplicationController{ ObjectMeta: api.ObjectMeta{ Namespace: f.Namespace.Name, Name: name, }, Spec: api.ReplicationControllerSpec{ Replicas: replicaCount, 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.ContainerPort{{ContainerPort: 9376}}, }, }, }, }, }, }) Expect(err).NotTo(HaveOccurred()) // Cleanup the replication controller when we are done. defer func() { // Resize the replication controller to zero to get rid of pods. if err := framework.DeleteRC(f.Client, f.Namespace.Name, controller.Name); err != nil { framework.Logf("Failed to cleanup replication controller %v: %v.", controller.Name, err) } }() // List the pods, making sure we observe all the replicas. selector := labels.SelectorFromSet(labels.Set(map[string]string{"name": name})) pods, err := framework.PodsCreated(f.Client, f.Namespace.Name, name, replicaCount) Expect(err).NotTo(HaveOccurred()) // Wait for all of them to be scheduled By(fmt.Sprintf("Waiting for %d replicas of %s to be scheduled. Selector: %v", replicaCount, name, selector)) pods, err = framework.WaitForPodsWithLabelScheduled(f.Client, f.Namespace.Name, selector) Expect(err).NotTo(HaveOccurred()) // Now make sure they're spread across zones zoneNames, err := getZoneNames(f.Client) Expect(err).NotTo(HaveOccurred()) Expect(checkZoneSpreading(f.Client, pods, zoneNames)).To(Equal(true)) }
// Check that the pods comprising a service get spread evenly across available zones func SpreadServiceOrFail(f *framework.Framework, replicaCount int, image string) { // First create the service serviceName := "test-service" serviceSpec := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: serviceName, Namespace: f.Namespace.Name, }, Spec: api.ServiceSpec{ Selector: map[string]string{ "service": serviceName, }, Ports: []api.ServicePort{{ Port: 80, TargetPort: intstr.FromInt(80), }}, }, } _, err := f.Client.Services(f.Namespace.Name).Create(serviceSpec) Expect(err).NotTo(HaveOccurred()) // Now create some pods behind the service podSpec := &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: serviceName, Labels: map[string]string{"service": serviceName}, }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "test", Image: "gcr.io/google_containers/pause-amd64:3.0", }, }, }, } framework.StartPods(f.Client, replicaCount, f.Namespace.Name, serviceName, *podSpec, false) // Wait for all of them to be scheduled selector := labels.SelectorFromSet(labels.Set(map[string]string{"service": serviceName})) pods, err := framework.WaitForPodsWithLabelScheduled(f.Client, f.Namespace.Name, selector) Expect(err).NotTo(HaveOccurred()) // Now make sure they're spread across zones zoneNames, err := getZoneNames(f.Client) Expect(err).NotTo(HaveOccurred()) Expect(checkZoneSpreading(f.Client, pods, zoneNames)).To(Equal(true)) }