From 64228dfe56db96c8fa6ce31f76bf207c90f552d4 Mon Sep 17 00:00:00 2001 From: Jordan Brant Baker Date: Tue, 3 Apr 2018 22:13:40 -0700 Subject: [PATCH] initial stab at delay between deleting pods, keel/forceDelay annotation --- provider/kubernetes/force_update.go | 4 +++- types/types.go | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/provider/kubernetes/force_update.go b/provider/kubernetes/force_update.go index 6e799696..7607bf4c 100644 --- a/provider/kubernetes/force_update.go +++ b/provider/kubernetes/force_update.go @@ -2,6 +2,7 @@ package kubernetes import ( "fmt" + "time" "k8s.io/api/extensions/v1beta1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -15,6 +16,7 @@ func (p *Provider) forceUpdate(deployment *v1beta1.Deployment) (err error) { gracePeriod := types.ParsePodTerminationGracePeriod(deployment.Annotations) selector := meta_v1.FormatLabelSelector(deployment.Spec.Selector) + podDeleteDelay := types.ParsePodDeleteDelay(deployment.Annotations) // image tag didn't change, need to terminate pods podList, err := p.implementer.Pods(deployment.Namespace, selector) @@ -49,9 +51,9 @@ func (p *Provider) forceUpdate(deployment *v1beta1.Deployment) (err error) { "namespace": deployment.Namespace, "deployment": deployment.Name, }).Error("provider.kubernetes: got error while deleting a pod") - continue } + time.Sleep(podDeleteDelay) } return nil diff --git a/types/types.go b/types/types.go index 788f55e3..fc1f2129 100644 --- a/types/types.go +++ b/types/types.go @@ -47,6 +47,10 @@ const KeelApprovalDeadlineLabel = "keel.sh/approvalDeadline" // KeelApprovalDeadlineDefault - default deadline in hours const KeelApprovalDeadlineDefault = 24 +// KeelPodDeleteDelay - optional delay betwen killing pods +// during force deploy +const KeelPodDeleteDelay = "keel.sh/forceDelay" + // KeelPodTerminationGracePeriod - optional grace period during // pod termination const KeelPodTerminationGracePeriod = "keel.sh/gracePeriod" @@ -206,6 +210,29 @@ func ParseEventNotificationChannels(annotations map[string]string) []string { return channels } +// ParsePodDeleteDelay - parses pod delete delay time in seconds +// from a given map of annotations +func ParsePodDeleteDelay(annotations map[string]string) int64 { + delay := int64(0) + if annotations == nil { + return delay + } + delayStr, ok := annotations[KeelPodDeleteDelay] + if ok { + + g, err := strconv.Atoi(delayStr) + if err != nil { + return delay + } + + if g > 0 && g < 600 { + return int64(g) + } + } + + return delay +} + // ParsePodTerminationGracePeriod - parses pod termination time in seconds // from a given map of annotations func ParsePodTerminationGracePeriod(annotations map[string]string) int64 {