// TestControllerServicePorts verifies master extraServicePorts are // correctly copied into controller func TestControllerServicePorts(t *testing.T) { master, etcdserver, _, assert := setUp(t) defer etcdserver.Terminate(t) master.namespaceRegistry = namespace.NewRegistry(nil) master.serviceRegistry = registrytest.NewServiceRegistry() master.endpointRegistry = endpoint.NewRegistry(nil) master.ExtraServicePorts = []api.ServicePort{ { Name: "additional-port-1", Port: 1000, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(1000), }, { Name: "additional-port-2", Port: 1010, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(1010), }, } controller := master.NewBootstrapController() assert.Equal(int32(1000), controller.ExtraServicePorts[0].Port) assert.Equal(int32(1010), controller.ExtraServicePorts[1].Port) }
func TestServiceRegistryUpdateMultiPortExternalService(t *testing.T) { ctx := api.NewDefaultContext() storage, _ := NewTestREST(t, nil) // Create external load balancer. svc1 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeLoadBalancer, Ports: []api.ServicePort{{ Name: "p", Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }, { Name: "q", Port: 8086, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(8086), }}, }, } if _, err := storage.Create(ctx, svc1); err != nil { t.Fatalf("Unexpected error: %v", err) } // Modify ports svc2 := deepCloneService(svc1) svc2.Spec.Ports[1].Port = 8088 if _, _, err := storage.Update(ctx, svc2.Name, rest.DefaultUpdatedObjectInfo(svc2, api.Scheme)); err != nil { t.Fatalf("Unexpected error: %v", err) } }
func createService(client *kubeclient.Client, meta kube.ObjectMeta, clusterIP string, dnsPort int) error { service := &kube.Service{ ObjectMeta: meta, Spec: kube.ServiceSpec{ ClusterIP: clusterIP, Ports: []kube.ServicePort{ { Name: "dns", Port: 53, TargetPort: intstr.FromInt(dnsPort), Protocol: kube.ProtocolUDP, }, { Name: "dns-tcp", Port: 53, TargetPort: intstr.FromInt(dnsPort), Protocol: kube.ProtocolTCP, }, }, }, } _, err := client.Services(meta.Namespace).Create(service) if err != nil { return err } return nil }
func TestServiceReplenishmentUpdateFunc(t *testing.T) { mockReplenish := &testReplenishment{} options := ReplenishmentControllerOptions{ GroupKind: api.Kind("Service"), ReplenishmentFunc: mockReplenish.Replenish, ResyncPeriod: controller.NoResyncPeriodFunc, } oldService := &api.Service{ ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "mysvc"}, Spec: api.ServiceSpec{ Type: api.ServiceTypeNodePort, Ports: []api.ServicePort{{ Port: 80, TargetPort: intstr.FromInt(80), }}, }, } newService := &api.Service{ ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "mysvc"}, Spec: api.ServiceSpec{ Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{{ Port: 80, TargetPort: intstr.FromInt(80), }}}, } updateFunc := ServiceReplenishmentUpdateFunc(&options) updateFunc(oldService, newService) if mockReplenish.groupKind != api.Kind("Service") { t.Errorf("Unexpected group kind %v", mockReplenish.groupKind) } if mockReplenish.namespace != oldService.Namespace { t.Errorf("Unexpected namespace %v", mockReplenish.namespace) } }
func SetDefaults_RollingDeploymentStrategyParams(obj *RollingDeploymentStrategyParams) { if obj.IntervalSeconds == nil { obj.IntervalSeconds = mkintp(deployapi.DefaultRollingIntervalSeconds) } if obj.UpdatePeriodSeconds == nil { obj.UpdatePeriodSeconds = mkintp(deployapi.DefaultRollingUpdatePeriodSeconds) } if obj.TimeoutSeconds == nil { obj.TimeoutSeconds = mkintp(deployapi.DefaultRollingTimeoutSeconds) } if obj.MaxUnavailable == nil && obj.MaxSurge == nil { maxUnavailable := intstr.FromString("25%") obj.MaxUnavailable = &maxUnavailable maxSurge := intstr.FromString("25%") obj.MaxSurge = &maxSurge } if obj.MaxUnavailable == nil && obj.MaxSurge != nil && (*obj.MaxSurge == intstr.FromInt(0) || *obj.MaxSurge == intstr.FromString("0%")) { maxUnavailable := intstr.FromString("25%") obj.MaxUnavailable = &maxUnavailable } if obj.MaxSurge == nil && obj.MaxUnavailable != nil && (*obj.MaxUnavailable == intstr.FromInt(0) || *obj.MaxUnavailable == intstr.FromString("0%")) { maxSurge := intstr.FromString("25%") obj.MaxSurge = &maxSurge } }
func buildIngress() *extensions.Ingress { defaultBackend := extensions.IngressBackend{ ServiceName: "default-backend", ServicePort: intstr.FromInt(80), } return &extensions.Ingress{ ObjectMeta: api.ObjectMeta{ Name: "foo", Namespace: api.NamespaceDefault, }, Spec: extensions.IngressSpec{ Backend: &extensions.IngressBackend{ ServiceName: "default-backend", ServicePort: intstr.FromInt(80), }, Rules: []extensions.IngressRule{ { Host: "foo.bar.com", IngressRuleValue: extensions.IngressRuleValue{ HTTP: &extensions.HTTPIngressRuleValue{ Paths: []extensions.HTTPIngressPath{ { Path: "/foo", Backend: defaultBackend, }, }, }, }, }, }, }, } }
func TestServiceRegistryIPReallocation(t *testing.T) { storage, _ := NewTestREST(t, nil) svc1 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, } ctx := api.NewDefaultContext() created_svc1, _ := storage.Create(ctx, svc1) created_service_1 := created_svc1.(*api.Service) if created_service_1.Name != "foo" { t.Errorf("Expected foo, but got %v", created_service_1.Name) } if !makeIPNet(t).Contains(net.ParseIP(created_service_1.Spec.ClusterIP)) { t.Errorf("Unexpected ClusterIP: %s", created_service_1.Spec.ClusterIP) } _, err := storage.Delete(ctx, created_service_1.Name) if err != nil { t.Errorf("Unexpected error deleting service: %v", err) } svc2 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "bar"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, } ctx = api.NewDefaultContext() created_svc2, _ := storage.Create(ctx, svc2) created_service_2 := created_svc2.(*api.Service) if created_service_2.Name != "bar" { t.Errorf("Expected bar, but got %v", created_service_2.Name) } if !makeIPNet(t).Contains(net.ParseIP(created_service_2.Spec.ClusterIP)) { t.Errorf("Unexpected ClusterIP: %s", created_service_2.Spec.ClusterIP) } }
func TestGetURLParts(t *testing.T) { testCases := []struct { probe *api.HTTPGetAction ok bool host string port int path string }{ {&api.HTTPGetAction{Host: "", Port: intstr.FromInt(-1), Path: ""}, false, "", -1, ""}, {&api.HTTPGetAction{Host: "", Port: intstr.FromString(""), Path: ""}, false, "", -1, ""}, {&api.HTTPGetAction{Host: "", Port: intstr.FromString("-1"), Path: ""}, false, "", -1, ""}, {&api.HTTPGetAction{Host: "", Port: intstr.FromString("not-found"), Path: ""}, false, "", -1, ""}, {&api.HTTPGetAction{Host: "", Port: intstr.FromString("found"), Path: ""}, true, "127.0.0.1", 93, ""}, {&api.HTTPGetAction{Host: "", Port: intstr.FromInt(76), Path: ""}, true, "127.0.0.1", 76, ""}, {&api.HTTPGetAction{Host: "", Port: intstr.FromString("118"), Path: ""}, true, "127.0.0.1", 118, ""}, {&api.HTTPGetAction{Host: "hostname", Port: intstr.FromInt(76), Path: "path"}, true, "hostname", 76, "path"}, } for _, test := range testCases { state := api.PodStatus{PodIP: "127.0.0.1"} container := api.Container{ Ports: []api.ContainerPort{{Name: "found", ContainerPort: 93}}, LivenessProbe: &api.Probe{ Handler: api.Handler{ HTTPGet: test.probe, }, }, } scheme := test.probe.Scheme if scheme == "" { scheme = api.URISchemeHTTP } host := test.probe.Host if host == "" { host = state.PodIP } port, err := extractPort(test.probe.Port, container) if test.ok && err != nil { t.Errorf("Unexpected error: %v", err) } path := test.probe.Path if !test.ok && err == nil { t.Errorf("Expected error for %+v, got %s%s:%d/%s", test, scheme, host, port, path) } if test.ok { if host != test.host || port != test.port || path != test.path { t.Errorf("Expected %s:%d/%s, got %s:%d/%s", test.host, test.port, test.path, host, port, path) } } } }
func TestServiceStorageValidatesUpdate(t *testing.T) { ctx := api.NewDefaultContext() storage, registry := NewTestREST(t, nil) registry.CreateService(ctx, &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, }}, }, }) failureCases := map[string]api.Service{ "empty ID": { ObjectMeta: api.ObjectMeta{Name: ""}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, }, "invalid selector": { ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"ThisSelectorFailsValidation": "ok"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, }, } for _, failureCase := range failureCases { c, created, err := storage.Update(ctx, failureCase.Name, rest.DefaultUpdatedObjectInfo(&failureCase, api.Scheme)) if c != nil || created { t.Errorf("Expected nil object or created false") } if !errors.IsInvalid(err) { t.Errorf("Expected to get an invalid resource error, got %v", err) } } }
func TestServiceRegistryUpdate(t *testing.T) { ctx := api.NewDefaultContext() storage, registry := NewTestREST(t, nil) svc, err := registry.CreateService(ctx, &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1", Namespace: api.NamespaceDefault}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz1"}, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, }) if err != nil { t.Fatalf("Expected no error: %v", err) } updated_svc, created, err := storage.Update(ctx, "foo", rest.DefaultUpdatedObjectInfo(&api.Service{ ObjectMeta: api.ObjectMeta{ Name: "foo", ResourceVersion: svc.ResourceVersion}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz2"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, }, api.Scheme)) if err != nil { t.Fatalf("Expected no error: %v", err) } if updated_svc == nil { t.Errorf("Expected non-nil object") } if created { t.Errorf("expected not created") } updated_service := updated_svc.(*api.Service) if updated_service.Name != "foo" { t.Errorf("Expected foo, but got %v", updated_service.Name) } if e, a := "foo", registry.UpdatedID; e != a { t.Errorf("Expected %v, but got %v", e, a) } }
func TestSetDefaulServiceTargetPort(t *testing.T) { in := &versioned.Service{Spec: versioned.ServiceSpec{Ports: []versioned.ServicePort{{Port: 1234}}}} obj := roundTrip(t, runtime.Object(in)) out := obj.(*versioned.Service) if out.Spec.Ports[0].TargetPort != intstr.FromInt(1234) { t.Errorf("Expected TargetPort to be defaulted, got %v", out.Spec.Ports[0].TargetPort) } in = &versioned.Service{Spec: versioned.ServiceSpec{Ports: []versioned.ServicePort{{Port: 1234, TargetPort: intstr.FromInt(5678)}}}} obj = roundTrip(t, runtime.Object(in)) out = obj.(*versioned.Service) if out.Spec.Ports[0].TargetPort != intstr.FromInt(5678) { t.Errorf("Expected TargetPort to be unchanged, got %v", out.Spec.Ports[0].TargetPort) } }
func TestNewRSNewReplicas(t *testing.T) { tests := []struct { test string strategyType extensions.DeploymentStrategyType depReplicas int32 newRSReplicas int32 maxSurge int expected int32 }{ { "can not scale up - to newRSReplicas", extensions.RollingUpdateDeploymentStrategyType, 1, 5, 1, 5, }, { "scale up - to depDeplicas", extensions.RollingUpdateDeploymentStrategyType, 6, 2, 10, 6, }, { "recreate - to depDeplicas", extensions.RecreateDeploymentStrategyType, 3, 1, 1, 3, }, } newDeployment := generateDeployment("nginx") newRC := generateRS(newDeployment) rs5 := generateRS(newDeployment) rs5.Spec.Replicas = 5 for _, test := range tests { newDeployment.Spec.Replicas = test.depReplicas newDeployment.Spec.Strategy = extensions.DeploymentStrategy{Type: test.strategyType} newDeployment.Spec.Strategy.RollingUpdate = &extensions.RollingUpdateDeployment{ MaxUnavailable: intstr.FromInt(1), MaxSurge: intstr.FromInt(test.maxSurge), } newRC.Spec.Replicas = test.newRSReplicas rs, err := NewRSNewReplicas(&newDeployment, []*extensions.ReplicaSet{&rs5}, &newRC) if err != nil { t.Errorf("In test case %s, got unexpected error %v", test.test, err) } if rs != test.expected { t.Errorf("In test case %s, expected %+v, got %+v", test.test, test.expected, rs) } } }
func generateDeployment(image string) *extensions.Deployment { labels := generateLabels(map[string]string{"name": "tiller"}) d := &extensions.Deployment{ ObjectMeta: api.ObjectMeta{ Name: "tiller-deploy", Labels: labels, }, Spec: extensions.DeploymentSpec{ Replicas: 1, Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Labels: labels, }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "tiller", Image: image, ImagePullPolicy: "Always", Ports: []api.ContainerPort{{ContainerPort: 44134, Name: "tiller"}}, LivenessProbe: &api.Probe{ Handler: api.Handler{ HTTPGet: &api.HTTPGetAction{ Path: "/liveness", Port: intstr.FromInt(44135), }, }, InitialDelaySeconds: 1, TimeoutSeconds: 1, }, ReadinessProbe: &api.Probe{ Handler: api.Handler{ HTTPGet: &api.HTTPGetAction{ Path: "/readiness", Port: intstr.FromInt(44135), }, }, InitialDelaySeconds: 1, TimeoutSeconds: 1, }, }, }, }, }, }, } return d }
func TestSyncEndpointsItemsWithLabels(t *testing.T) { ns := "other" testServer, endpointsHandler := makeTestServer(t, ns, serverResponse{http.StatusOK, &api.Endpoints{}}) // TODO: Uncomment when fix #19254 // defer testServer.Close() client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) endpoints.podStoreSynced = alwaysReady addPods(endpoints.podStore.Store, ns, 3, 2, 0) serviceLabels := map[string]string{"foo": "bar"} endpoints.serviceStore.Store.Add(&api.Service{ ObjectMeta: api.ObjectMeta{ Name: "foo", Namespace: ns, Labels: serviceLabels, }, Spec: api.ServiceSpec{ Selector: map[string]string{"foo": "bar"}, Ports: []api.ServicePort{ {Name: "port0", Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}, {Name: "port1", Port: 88, Protocol: "TCP", TargetPort: intstr.FromInt(8088)}, }, }, }) endpoints.syncService(ns + "/foo") expectedSubsets := []api.EndpointSubset{{ Addresses: []api.EndpointAddress{ {IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}, {IP: "1.2.3.5", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod1", Namespace: ns}}, {IP: "1.2.3.6", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod2", Namespace: ns}}, }, Ports: []api.EndpointPort{ {Name: "port0", Port: 8080, Protocol: "TCP"}, {Name: "port1", Port: 8088, Protocol: "TCP"}, }, }} data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ ObjectMeta: api.ObjectMeta{ ResourceVersion: "", Labels: serviceLabels, }, Subsets: endptspkg.SortSubsets(expectedSubsets), }) // endpointsHandler should get 2 requests - one for "GET" and the next for "POST". endpointsHandler.ValidateRequestCount(t, 2) endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, ""), "POST", &data) }
func TestDoRequestNewWay(t *testing.T) { reqBody := "request body" expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ Protocol: "TCP", Port: 12345, TargetPort: intstr.FromInt(12345), }}}} expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj) fakeHandler := utiltesting.FakeHandler{ StatusCode: 200, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) defer testServer.Close() c := testRESTClient(t, testServer) obj, err := c.Verb("POST"). Prefix("foo", "bar"). Suffix("baz"). Timeout(time.Second). Body([]byte(reqBody)). Do().Get() if err != nil { t.Errorf("Unexpected error: %v %#v", err, err) return } if obj == nil { t.Error("nil obj") } else if !api.Semantic.DeepDerivative(expectedObj, obj) { t.Errorf("Expected: %#v, got %#v", expectedObj, obj) } requestURL := testapi.Default.ResourcePathWithPrefix("foo/bar", "", "", "baz") requestURL += "?timeout=1s" fakeHandler.ValidateRequest(t, requestURL, "POST", &reqBody) }
func TestCreate(t *testing.T) { storage, _, server := newStorage(t) defer server.Terminate(t) test := registrytest.New(t, storage.Etcd) validService := validService() validService.ObjectMeta = api.ObjectMeta{} test.TestCreate( // valid validService, // invalid &api.Service{ Spec: api.ServiceSpec{}, }, // invalid &api.Service{ Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, ClusterIP: "invalid", SessionAffinity: "None", Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, }, ) }
func TestSyncEndpointsItemsPreexistingIdentical(t *testing.T) { ns := api.NamespaceDefault testServer, endpointsHandler := makeTestServer(t, api.NamespaceDefault, serverResponse{http.StatusOK, &api.Endpoints{ ObjectMeta: api.ObjectMeta{ ResourceVersion: "1", Name: "foo", Namespace: ns, }, Subsets: []api.EndpointSubset{{ Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, Ports: []api.EndpointPort{{Port: 8080, Protocol: "TCP"}}, }}, }}) defer testServer.Close() client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) endpoints.podStoreSynced = alwaysReady addPods(endpoints.podStore.Store, api.NamespaceDefault, 1, 1, 0) endpoints.serviceStore.Store.Add(&api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: api.NamespaceDefault}, Spec: api.ServiceSpec{ Selector: map[string]string{"foo": "bar"}, Ports: []api.ServicePort{{Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}}, }, }) endpoints.syncService(ns + "/foo") endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", api.NamespaceDefault, "foo"), "GET", nil) }
func TestRunHandlerHttp(t *testing.T) { fakeHttp := fakeHTTP{} handlerRunner := NewHandlerRunner(&fakeHttp, &fakeContainerCommandRunner{}, nil) containerID := kubecontainer.ContainerID{Type: "test", ID: "abc1234"} containerName := "containerFoo" container := api.Container{ Name: containerName, Lifecycle: &api.Lifecycle{ PostStart: &api.Handler{ HTTPGet: &api.HTTPGetAction{ Host: "foo", Port: intstr.FromInt(8080), Path: "bar", }, }, }, } pod := api.Pod{} pod.ObjectMeta.Name = "podFoo" pod.ObjectMeta.Namespace = "nsFoo" pod.Spec.Containers = []api.Container{container} _, err := handlerRunner.Run(containerID, &pod, &container, container.Lifecycle.PostStart) if err != nil { t.Errorf("unexpected error: %v", err) } if fakeHttp.url != "http://foo:8080/bar" { t.Errorf("unexpected url: %s", fakeHttp.url) } }
func updateIngressOrFail(clientset *federation_release_1_4.Clientset, namespace string) (newIng *v1beta1.Ingress) { var err error if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to createIngressOrFail: clientset: %v, namespace: %v", clientset, namespace)) } ingress := &v1beta1.Ingress{ ObjectMeta: v1.ObjectMeta{ Name: FederatedIngressName, }, Spec: v1beta1.IngressSpec{ Backend: &v1beta1.IngressBackend{ ServiceName: "updated-testingress-service", ServicePort: intstr.FromInt(80), }, }, } for MaxRetriesOnFederatedApiserver := 0; MaxRetriesOnFederatedApiserver < 3; MaxRetriesOnFederatedApiserver++ { _, err = clientset.Extensions().Ingresses(namespace).Get(FederatedIngressName) if err != nil { framework.Failf("failed to get ingress %q: %v", FederatedIngressName, err) } newIng, err = clientset.Extensions().Ingresses(namespace).Update(ingress) if err == nil { describeIng(namespace) return } if !errors.IsConflict(err) && !errors.IsServerTimeout(err) { framework.Failf("failed to update ingress %q: %v", FederatedIngressName, err) } } framework.Failf("too many retries updating ingress %q", FederatedIngressName) return newIng }
func validNewNetworkPolicy() *extensions.NetworkPolicy { port := intstr.FromInt(80) return &extensions.NetworkPolicy{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Namespace: api.NamespaceDefault, Labels: map[string]string{"a": "b"}, }, Spec: extensions.NetworkPolicySpec{ PodSelector: metav1.LabelSelector{MatchLabels: map[string]string{"a": "b"}}, Ingress: []extensions.NetworkPolicyIngressRule{ { From: []extensions.NetworkPolicyPeer{ { PodSelector: &metav1.LabelSelector{MatchLabels: map[string]string{"c": "d"}}, }, }, Ports: []extensions.NetworkPolicyPort{ { Port: &port, }, }, }, }, }, } }
func (config *NetworkingTestConfig) createNodePortService(selector map[string]string) { serviceSpec := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: nodePortServiceName, }, Spec: api.ServiceSpec{ Type: api.ServiceTypeNodePort, Ports: []api.ServicePort{ {Port: ClusterHttpPort, Name: "http", Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(EndpointHttpPort)}, {Port: ClusterUdpPort, Name: "udp", Protocol: api.ProtocolUDP, TargetPort: intstr.FromInt(EndpointUdpPort)}, }, Selector: selector, }, } config.NodePortService = config.createService(serviceSpec) }
func TestPrintHunmanReadableIngressWithColumnLabels(t *testing.T) { ingress := extensions.Ingress{ ObjectMeta: api.ObjectMeta{ Name: "test1", CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, Labels: map[string]string{ "app_name": "kubectl_test_ingress", }, }, Spec: extensions.IngressSpec{ Backend: &extensions.IngressBackend{ ServiceName: "svc", ServicePort: intstr.FromInt(93), }, }, Status: extensions.IngressStatus{ LoadBalancer: api.LoadBalancerStatus{ Ingress: []api.LoadBalancerIngress{ { IP: "2.3.4.5", Hostname: "localhost.localdomain", }, }, }, }, } buff := bytes.Buffer{} printIngress(&ingress, &buff, PrintOptions{false, false, false, false, false, false, []string{"app_name"}}) output := string(buff.Bytes()) appName := ingress.ObjectMeta.Labels["app_name"] if !strings.Contains(output, appName) { t.Errorf("expected to container app_name label value %s, but doesn't %s", appName, output) } }
func TestPrintPodDisruptionBudget(t *testing.T) { tests := []struct { pdb policy.PodDisruptionBudget expect string }{ { policy.PodDisruptionBudget{ ObjectMeta: api.ObjectMeta{ Namespace: "ns1", Name: "pdb1", CreationTimestamp: unversioned.Time{Time: time.Now().Add(1.9e9)}, }, Spec: policy.PodDisruptionBudgetSpec{ MinAvailable: intstr.FromInt(22), }, Status: policy.PodDisruptionBudgetStatus{ PodDisruptionsAllowed: 5, }, }, "pdb1\t22\t5\t0s\n", }} buf := bytes.NewBuffer([]byte{}) for _, test := range tests { printPodDisruptionBudget(&test.pdb, buf, PrintOptions{false, false, false, false, true, false, false, "", []string{}}) if buf.String() != test.expect { t.Fatalf("Expected: %s, got: %s", test.expect, buf.String()) } buf.Reset() } }
func TestServiceRegistryIPLoadBalancer(t *testing.T) { storage, _ := NewTestREST(t, nil) svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeLoadBalancer, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, } ctx := api.NewDefaultContext() created_svc, _ := storage.Create(ctx, svc) created_service := created_svc.(*api.Service) if created_service.Spec.Ports[0].Port != 6502 { t.Errorf("Expected port 6502, but got %v", created_service.Spec.Ports[0].Port) } if !makeIPNet(t).Contains(net.ParseIP(created_service.Spec.ClusterIP)) { t.Errorf("Unexpected ClusterIP: %s", created_service.Spec.ClusterIP) } update := deepCloneService(created_service) _, _, err := storage.Update(ctx, update.Name, rest.DefaultUpdatedObjectInfo(update, api.Scheme)) if err != nil { t.Errorf("Unexpected error %v", err) } }
func createServiceOrFail(clientset *federation_release_1_3.Clientset, namespace string) *v1.Service { if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to deleteServiceOrFail: clientset: %v, namespace: %v", clientset, namespace)) } By(fmt.Sprintf("Creating federated service %q in namespace %q", FederatedServiceName, namespace)) service := &v1.Service{ ObjectMeta: v1.ObjectMeta{ Name: FederatedServiceName, }, Spec: v1.ServiceSpec{ Selector: FederatedServiceLabels, Type: "LoadBalancer", Ports: []v1.ServicePort{ { Name: "http", Port: 80, TargetPort: intstr.FromInt(8080), }, }, }, } By(fmt.Sprintf("Trying to create service %q in namespace %q", service.Name, namespace)) _, err := clientset.Services(namespace).Create(service) framework.ExpectNoError(err, "Creating service %q in namespace %q", service.Name, namespace) By(fmt.Sprintf("Successfully created federated service %q in namespace %q", FederatedServiceName, namespace)) return service }
func testingPod(name, value string) v1.Pod { return v1.Pod{ ObjectMeta: v1.ObjectMeta{ Name: name, Labels: map[string]string{ "name": "foo", "time": value, }, }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: "nginx", Image: "gcr.io/google_containers/nginx-slim:0.7", Ports: []v1.ContainerPort{{ContainerPort: 80}}, LivenessProbe: &v1.Probe{ Handler: v1.Handler{ HTTPGet: &v1.HTTPGetAction{ Path: "/index.html", Port: intstr.FromInt(8080), }, }, InitialDelaySeconds: 30, }, }, }, }, } }
func createService(clientset *fedclientset.Clientset, namespace, name string) (*v1.Service, error) { if clientset == nil || len(namespace) == 0 { return nil, fmt.Errorf("Internal error: invalid parameters passed to createService: clientset: %v, namespace: %v", clientset, namespace) } By(fmt.Sprintf("Creating federated service %q in namespace %q", name, namespace)) service := &v1.Service{ ObjectMeta: v1.ObjectMeta{ Name: name, Namespace: namespace, }, Spec: v1.ServiceSpec{ Selector: FederatedServiceLabels, Type: "LoadBalancer", Ports: []v1.ServicePort{ { Name: "http", Protocol: v1.ProtocolTCP, Port: 80, TargetPort: intstr.FromInt(8080), }, }, SessionAffinity: v1.ServiceAffinityNone, }, } By(fmt.Sprintf("Trying to create service %q in namespace %q", service.Name, namespace)) return clientset.Services(namespace).Create(service) }
func TestComponentProbe(t *testing.T) { var tests = []struct { port int path string }{ { port: 1, path: "foo", }, } for _, rt := range tests { actual := componentProbe(rt.port, rt.path) if actual.Handler.HTTPGet.Port != intstr.FromInt(rt.port) { t.Errorf( "failed componentProbe:\n\texpected: %v\n\t actual: %v", rt.port, actual.Handler.HTTPGet.Port, ) } if actual.Handler.HTTPGet.Path != rt.path { t.Errorf( "failed componentProbe:\n\texpected: %s\n\t actual: %s", rt.path, actual.Handler.HTTPGet.Path, ) } } }
func TestServiceRegistryExternalService(t *testing.T) { ctx := api.NewDefaultContext() storage, registry := NewTestREST(t, nil) svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeLoadBalancer, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: intstr.FromInt(6502), }}, }, } _, err := storage.Create(ctx, svc) if err != nil { t.Errorf("Failed to create service: %#v", err) } srv, err := registry.GetService(ctx, svc.Name) if err != nil { t.Errorf("Unexpected error: %v", err) } if srv == nil { t.Errorf("Failed to find service: %s", svc.Name) } }
func newValidDaemonSet() *extensions.DaemonSet { return &extensions.DaemonSet{ ObjectMeta: api.ObjectMeta{ Name: "foo", Namespace: api.NamespaceDefault, }, Spec: extensions.DaemonSetSpec{ Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"a": "b"}}, Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Labels: map[string]string{"a": "b"}, }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "test", Image: "test_image", ImagePullPolicy: api.PullIfNotPresent, }, }, RestartPolicy: api.RestartPolicyAlways, DNSPolicy: api.DNSClusterFirst, }, }, UpdateStrategy: extensions.DaemonSetUpdateStrategy{ Type: extensions.RollingUpdateDaemonSetStrategyType, RollingUpdate: &extensions.RollingUpdateDaemonSet{ MaxUnavailable: intstr.FromInt(1), }, }, UniqueLabelKey: "foo-label", }, } }