From f9f58b7efd8f79a5100cf14a5e184bc309e8820b Mon Sep 17 00:00:00 2001 From: Itamar Ostricher Date: Tue, 14 Feb 2017 19:10:10 +0200 Subject: [PATCH] working on adding the timeout service annotation --- .../kubernetes/pkg/api/service/annotations.go | 7 +++++++ vendor/k8s.io/kubernetes/pkg/api/service/util.go | 16 ++++++++++++++++ .../kubernetes/pkg/api/validation/validation.go | 9 +++++++++ 3 files changed, 32 insertions(+) diff --git a/vendor/k8s.io/kubernetes/pkg/api/service/annotations.go b/vendor/k8s.io/kubernetes/pkg/api/service/annotations.go index 4b45549983..71ac3c7941 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/service/annotations.go +++ b/vendor/k8s.io/kubernetes/pkg/api/service/annotations.go @@ -33,6 +33,13 @@ const ( // Not all cloud providers support this annotation, though AWS & GCE do. AnnotationLoadBalancerSourceRangesKey = "service.beta.kubernetes.io/load-balancer-source-ranges" + // AnnotationServiceTimeout is the key of the annotation on a service to set request timeout on LoadBalancers that support it + // + // It should be an unsigned integer value, specified in seconds. + // A value of "0" indicates to use the default value of the underlying LoadBalancer, + // and is equivalent to not specifying the annotation at all. + AnnotationServiceTimeout = "service.beta.kubernetes.io/timeout" + // AnnotationValueExternalTrafficLocal Value of annotation to specify local endpoints behaviour AnnotationValueExternalTrafficLocal = "OnlyLocal" // AnnotationValueExternalTrafficGlobal Value of annotation to specify global (legacy) behaviour diff --git a/vendor/k8s.io/kubernetes/pkg/api/service/util.go b/vendor/k8s.io/kubernetes/pkg/api/service/util.go index 6f0e14e2bd..4a4bf96ec5 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/service/util.go +++ b/vendor/k8s.io/kubernetes/pkg/api/service/util.go @@ -18,6 +18,7 @@ package service import ( "fmt" + "strconv" "strings" "k8s.io/kubernetes/pkg/api" @@ -66,3 +67,18 @@ func GetLoadBalancerSourceRanges(service *api.Service) (netsets.IPNet, error) { } return ipnets, nil } + +// GetServiceRequestTimeout parse and verify the AnnotationServiceTimeout annotation from a service, +// extracting the request timeout. if not present - returns 0. +func GetServiceRequestTimeout(service *api.Service) (uint64, error) { + val := service.Annotations[AnnotationServiceTimeout] + val = strings.TrimSpace(val) + if val == "" { + return 0, nil + } + timeout, err := strconv.ParseUint(val, 10, 32) + if err != nil { + return 0, fmt.Errorf("%s: %s is not valid. Expecting unsigned integer (seconds).", AnnotationServiceTimeout, val) + } + return timeout, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/api/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/api/validation/validation.go index 1c24a0d8c7..254b836e12 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/api/validation/validation.go @@ -2555,6 +2555,15 @@ func validateServiceFields(service *api.Service) field.ErrorList { allErrs = append(allErrs, field.Invalid(fieldPath, val, "must be a list of IP ranges. For example, 10.240.0.0/24,10.250.0.0/24 ")) } } + + // Validate timeout annotation + _, err := apiservice.GetServiceRequestTimeout(service) + if err != nil { + fieldPath = field.NewPath("metadata", "annotations").Key(apiservice.AnnotationServiceTimeout) + val = service.Annotations[apiservice.AnnotationServiceTimeout] + allErrs = append(allErrs, field.Invalid(fieldPath, val, "must be an unsigned integer (seconds).")) + } + return allErrs }