From 12e9b01ee33a325267d849113cd6b047148bce8e Mon Sep 17 00:00:00 2001 From: Michel Hollands Date: Thu, 3 Aug 2023 12:02:47 +0100 Subject: [PATCH 1/3] Handle the context in webhook Signed-off-by: Michel Hollands --- pkg/admission/no_downscale.go | 6 ++++++ pkg/admission/prep_downscale.go | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/pkg/admission/no_downscale.go b/pkg/admission/no_downscale.go index 06b7b7493..03e991bf1 100644 --- a/pkg/admission/no_downscale.go +++ b/pkg/admission/no_downscale.go @@ -140,6 +140,12 @@ func allowErr(logger log.Logger, msg string, err error) *v1.AdmissionResponse { } func getResourceLabels(ctx context.Context, ar v1.AdmissionReview, api kubernetes.Interface) (map[string]string, error) { + select { + case <-ctx.Done(): + return nil, fmt.Errorf("context cancelled") + default: + } + switch ar.Request.Resource.Resource { case "statefulsets": obj, err := api.AppsV1().StatefulSets(ar.Request.Namespace).Get(ctx, ar.Request.Name, metav1.GetOptions{}) diff --git a/pkg/admission/prep_downscale.go b/pkg/admission/prep_downscale.go index 7d543650e..8a8f42eaf 100644 --- a/pkg/admission/prep_downscale.go +++ b/pkg/admission/prep_downscale.go @@ -39,6 +39,12 @@ type httpClient interface { } func prepareDownscale(ctx context.Context, logger log.Logger, ar v1.AdmissionReview, api kubernetes.Interface, client httpClient) *v1.AdmissionResponse { + select { + case <-ctx.Done(): + return deny("context cancelled") + default: + } + logger = log.With(logger, "name", ar.Request.Name, "resource", ar.Request.Resource.Resource, "namespace", ar.Request.Namespace) oldObj, oldGVK, err := codecs.UniversalDeserializer().Decode(ar.Request.OldObject.Raw, nil, nil) @@ -253,6 +259,12 @@ func deny(msg string, args ...any) *v1.AdmissionResponse { } func getResourceAnnotations(ctx context.Context, ar v1.AdmissionReview, api kubernetes.Interface) (map[string]string, error) { + select { + case <-ctx.Done(): + return nil, fmt.Errorf("context cancelled") + default: + } + switch ar.Request.Resource.Resource { case "statefulsets": obj, err := api.AppsV1().StatefulSets(ar.Request.Namespace).Get(ctx, ar.Request.Name, metav1.GetOptions{}) From cc09f23a4ce9d2e2f19d0c480a32c5124917d9eb Mon Sep 17 00:00:00 2001 From: Michel Hollands Date: Thu, 3 Aug 2023 12:08:44 +0100 Subject: [PATCH 2/3] Return the context error Signed-off-by: Michel Hollands --- pkg/admission/no_downscale.go | 2 +- pkg/admission/prep_downscale.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/admission/no_downscale.go b/pkg/admission/no_downscale.go index 03e991bf1..c53cf137b 100644 --- a/pkg/admission/no_downscale.go +++ b/pkg/admission/no_downscale.go @@ -142,7 +142,7 @@ func allowErr(logger log.Logger, msg string, err error) *v1.AdmissionResponse { func getResourceLabels(ctx context.Context, ar v1.AdmissionReview, api kubernetes.Interface) (map[string]string, error) { select { case <-ctx.Done(): - return nil, fmt.Errorf("context cancelled") + return nil, ctx.Err() default: } diff --git a/pkg/admission/prep_downscale.go b/pkg/admission/prep_downscale.go index 8a8f42eaf..9b7aa59d1 100644 --- a/pkg/admission/prep_downscale.go +++ b/pkg/admission/prep_downscale.go @@ -41,7 +41,7 @@ type httpClient interface { func prepareDownscale(ctx context.Context, logger log.Logger, ar v1.AdmissionReview, api kubernetes.Interface, client httpClient) *v1.AdmissionResponse { select { case <-ctx.Done(): - return deny("context cancelled") + return deny(ctx.Err().Error()) default: } @@ -261,7 +261,7 @@ func deny(msg string, args ...any) *v1.AdmissionResponse { func getResourceAnnotations(ctx context.Context, ar v1.AdmissionReview, api kubernetes.Interface) (map[string]string, error) { select { case <-ctx.Done(): - return nil, fmt.Errorf("context cancelled") + return nil, ctx.Err() default: } From 5e60a3c90aec90bf747bd61a46c17adbfc0b6ccb Mon Sep 17 00:00:00 2001 From: Michel Hollands Date: Thu, 3 Aug 2023 12:17:24 +0100 Subject: [PATCH 3/3] Add handling of context on more places Signed-off-by: Michel Hollands --- pkg/admission/prep_downscale.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/admission/prep_downscale.go b/pkg/admission/prep_downscale.go index 9b7aa59d1..713022cc3 100644 --- a/pkg/admission/prep_downscale.go +++ b/pkg/admission/prep_downscale.go @@ -277,6 +277,11 @@ func getResourceAnnotations(ctx context.Context, ar v1.AdmissionReview, api kube } func addDownscaledAnnotationToStatefulSet(ctx context.Context, api kubernetes.Interface, namespace, stsName string) error { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } client := api.AppsV1().StatefulSets(namespace) patch := fmt.Sprintf(`{"metadata":{"annotations":{"%v":"%v"}}}`, config.LastDownscaleAnnotationKey, time.Now().UTC().Format(time.RFC3339)) _, err := client.Patch(ctx, stsName, types.StrategicMergePatchType, []byte(patch), metav1.PatchOptions{}) @@ -290,6 +295,11 @@ type statefulSetDownscale struct { } func findDownscalesDoneMinTimeAgo(ctx context.Context, api kubernetes.Interface, namespace, stsName, rolloutGroup string) (*statefulSetDownscale, error) { + select { + case <-ctx.Done(): + return nil, ctx.Err() + default: + } client := api.AppsV1().StatefulSets(namespace) groupReq, err := labels.NewRequirement(config.RolloutGroupLabelKey, selection.Equals, []string{rolloutGroup}) if err != nil {