This is an automated email from the ASF dual-hosted git repository.

pcongiusti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/main by this push:
     new 861f9831f fix(cmd): uninstall to wait the operator pod
861f9831f is described below

commit 861f9831f4b4c3a8563a4821254b5f35102f876a
Author: Pasquale Congiusti <pasquale.congiu...@gmail.com>
AuthorDate: Fri Apr 14 17:15:33 2023 +0200

    fix(cmd): uninstall to wait the operator pod
    
    Closes #4246
---
 pkg/cmd/uninstall.go    | 16 ++++++++++++++++
 pkg/util/watch/watch.go | 26 ++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/pkg/cmd/uninstall.go b/pkg/cmd/uninstall.go
index 06b97db15..6b9731bd2 100644
--- a/pkg/cmd/uninstall.go
+++ b/pkg/cmd/uninstall.go
@@ -20,6 +20,7 @@ package cmd
 import (
        "context"
        "fmt"
+       "time"
 
        "github.com/pkg/errors"
        "github.com/spf13/cobra"
@@ -35,7 +36,9 @@ import (
 
        v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
        "github.com/apache/camel-k/v2/pkg/client"
+       "github.com/apache/camel-k/v2/pkg/platform"
        "github.com/apache/camel-k/v2/pkg/util/olm"
+       "github.com/apache/camel-k/v2/pkg/util/watch"
 )
 
 func newCmdUninstall(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*uninstallCmdOptions) {
@@ -156,6 +159,19 @@ func (o *uninstallCmdOptions) uninstall(cmd 
*cobra.Command, _ []string) error {
                                return err
                        }
                        fmt.Fprintf(cmd.OutOrStdout(), "Camel K Operator 
removed from namespace %s\n", o.Namespace)
+
+                       // Let's wait the Pod has completed all the tasks 
before removing roles, as it may cause
+                       // problems during the shutdown
+
+                       pod := platform.GetOperatorPod(o.Context, c, 
o.Namespace)
+                       if pod != nil {
+                               tctx, cancel := context.WithTimeout(o.Context, 
15*time.Second)
+                               defer cancel()
+                               err := watch.WaitPodToTerminate(tctx, c, pod)
+                               if err != nil {
+                                       return errors.Wrap(err, "error while 
waiting the operator pod to terminate gracefully")
+                               }
+                       }
                }
 
                if err = o.uninstallNamespaceRoles(o.Context, cmd, c); err != 
nil {
diff --git a/pkg/util/watch/watch.go b/pkg/util/watch/watch.go
index e975ce8c8..32ee72788 100644
--- a/pkg/util/watch/watch.go
+++ b/pkg/util/watch/watch.go
@@ -23,6 +23,7 @@ import (
 
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       "k8s.io/apimachinery/pkg/watch"
 
        v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
        "github.com/apache/camel-k/v2/pkg/client"
@@ -212,6 +213,31 @@ func HandleIntegrationPlatformEvents(ctx context.Context, 
c client.Client, p *v1
        }
 }
 
+// WaitPodToTerminate will wait for a given pod to teminate.
+func WaitPodToTerminate(ctx context.Context, c client.Client, pod *corev1.Pod) 
error {
+       opts := metav1.ListOptions{
+               TypeMeta:      metav1.TypeMeta{},
+               FieldSelector: fmt.Sprintf("metadata.name=%s", pod.Name),
+       }
+       watcher, err := c.CoreV1().Pods(pod.Namespace).Watch(ctx, opts)
+       if err != nil {
+               return err
+       }
+
+       defer watcher.Stop()
+
+       for {
+               select {
+               case event := <-watcher.ResultChan():
+                       if event.Type == watch.Deleted {
+                               return nil
+                       }
+               case <-ctx.Done():
+                       return nil
+               }
+       }
+}
+
 func isAllowed(lastEvent, event *corev1.Event, baseTime int64) bool {
        if lastEvent == nil {
                return true

Reply via email to