resource.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. Copyright 2019 The Kubernetes Authors.
  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. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package service
  14. import (
  15. "context"
  16. "time"
  17. v1 "k8s.io/api/core/v1"
  18. apierrors "k8s.io/apimachinery/pkg/api/errors"
  19. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  20. clientset "k8s.io/client-go/kubernetes"
  21. restclient "k8s.io/client-go/rest"
  22. "k8s.io/kubernetes/test/e2e/framework"
  23. e2enode "k8s.io/kubernetes/test/e2e/framework/node"
  24. )
  25. // GetServicesProxyRequest returns a request for a service proxy.
  26. func GetServicesProxyRequest(c clientset.Interface, request *restclient.Request) (*restclient.Request, error) {
  27. return request.Resource("services").SubResource("proxy"), nil
  28. }
  29. // CreateServiceSpec returns a Service object for testing.
  30. func CreateServiceSpec(serviceName, externalName string, isHeadless bool, selector map[string]string) *v1.Service {
  31. headlessService := &v1.Service{
  32. ObjectMeta: metav1.ObjectMeta{
  33. Name: serviceName,
  34. },
  35. Spec: v1.ServiceSpec{
  36. Selector: selector,
  37. },
  38. }
  39. if externalName != "" {
  40. headlessService.Spec.Type = v1.ServiceTypeExternalName
  41. headlessService.Spec.ExternalName = externalName
  42. } else {
  43. headlessService.Spec.Ports = []v1.ServicePort{
  44. {Port: 80, Name: "http", Protocol: v1.ProtocolTCP},
  45. }
  46. }
  47. if isHeadless {
  48. headlessService.Spec.ClusterIP = "None"
  49. }
  50. return headlessService
  51. }
  52. // UpdateService fetches a service, calls the update function on it,
  53. // and then attempts to send the updated service. It retries up to 2
  54. // times in the face of timeouts and conflicts.
  55. func UpdateService(c clientset.Interface, namespace, serviceName string, update func(*v1.Service)) (*v1.Service, error) {
  56. var service *v1.Service
  57. var err error
  58. for i := 0; i < 3; i++ {
  59. service, err = c.CoreV1().Services(namespace).Get(context.TODO(), serviceName, metav1.GetOptions{})
  60. if err != nil {
  61. return service, err
  62. }
  63. update(service)
  64. service, err = c.CoreV1().Services(namespace).Update(context.TODO(), service, metav1.UpdateOptions{})
  65. if !apierrors.IsConflict(err) && !apierrors.IsServerTimeout(err) {
  66. return service, err
  67. }
  68. }
  69. return service, err
  70. }
  71. // CleanupServiceResources cleans up service Type=LoadBalancer resources.
  72. func CleanupServiceResources(c clientset.Interface, loadBalancerName, region, zone string) {
  73. framework.TestContext.CloudConfig.Provider.CleanupServiceResources(c, loadBalancerName, region, zone)
  74. }
  75. // GetIngressPoint returns a host on which ingress serves.
  76. func GetIngressPoint(ing *v1.LoadBalancerIngress) string {
  77. host := ing.IP
  78. if host == "" {
  79. host = ing.Hostname
  80. }
  81. return host
  82. }
  83. // GetServiceLoadBalancerCreationTimeout returns a timeout value for creating a load balancer of a service.
  84. func GetServiceLoadBalancerCreationTimeout(cs clientset.Interface) time.Duration {
  85. nodes, err := e2enode.GetReadySchedulableNodes(cs)
  86. framework.ExpectNoError(err)
  87. if len(nodes.Items) > LargeClusterMinNodesNumber {
  88. return LoadBalancerCreateTimeoutLarge
  89. }
  90. return LoadBalancerCreateTimeoutDefault
  91. }