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

xianjin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-uniffle.git


The following commit(s) were added to refs/heads/master by this push:
     new 2b872da1 [ISSUE-524][operator] Upgrading rss could also be deleted 
(#531)
2b872da1 is described below

commit 2b872da10548c5c744a50b2b0918ad3a76ceba49
Author: advancedxy <[email protected]>
AuthorDate: Thu Feb 2 11:33:35 2023 +0800

    [ISSUE-524][operator] Upgrading rss could also be deleted (#531)
    
    ### What changes were proposed in this pull request?
    1. soft the constraint that upgrading rss object cannot be deleted
    
    ### Why are the changes needed?
    more flexibility.
    This fixes #524
    
    ### Does this PR introduce _any_ user-facing change?
    For RSS cluster admin, they can delete a upgrading rss cluster.
    
    ### How was this patch tested?
    Manually verified and an added UT
---
 .../operator/pkg/controller/controller/rss.go      |  3 +-
 .../operator/pkg/controller/controller/rss_test.go | 32 ++++++++++++++++++++++
 .../operator/pkg/webhook/inspector/rss.go          |  2 ++
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/deploy/kubernetes/operator/pkg/controller/controller/rss.go 
b/deploy/kubernetes/operator/pkg/controller/controller/rss.go
index 2e21e04b..f8c6d73a 100644
--- a/deploy/kubernetes/operator/pkg/controller/controller/rss.go
+++ b/deploy/kubernetes/operator/pkg/controller/controller/rss.go
@@ -354,7 +354,8 @@ func (r *rssController) processRss(namespace, name string) 
(bool, error) {
 func (r *rssController) processDeleting(rss 
*unifflev1alpha1.RemoteShuffleService) (bool, error) {
        klog.V(4).Infof("process rss (%v) to be deleted in %v phase",
                utils.UniqueName(rss), rss.Status.Phase)
-       if rss.Status.Phase == unifflev1alpha1.RSSRunning || rss.Status.Phase 
== unifflev1alpha1.RSSPending {
+       if rss.Status.Phase == unifflev1alpha1.RSSRunning || rss.Status.Phase 
== unifflev1alpha1.RSSPending ||
+               rss.Status.Phase == unifflev1alpha1.RSSUpgrading {
                return false, r.updateRssStatus(rss, 
&unifflev1alpha1.RemoteShuffleServiceStatus{
                        Phase: unifflev1alpha1.RSSTerminating,
                })
diff --git a/deploy/kubernetes/operator/pkg/controller/controller/rss_test.go 
b/deploy/kubernetes/operator/pkg/controller/controller/rss_test.go
index a72c7c10..ac905bb2 100644
--- a/deploy/kubernetes/operator/pkg/controller/controller/rss_test.go
+++ b/deploy/kubernetes/operator/pkg/controller/controller/rss_test.go
@@ -27,6 +27,7 @@ import (
        . "github.com/onsi/gomega"
        appsv1 "k8s.io/api/apps/v1"
        corev1 "k8s.io/api/core/v1"
+       "k8s.io/apimachinery/pkg/api/errors"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/util/wait"
        "k8s.io/client-go/kubernetes"
@@ -235,6 +236,37 @@ var _ = Describe("RssController", func() {
                        Expect(err).ToNot(HaveOccurred())
                        Expect(sts).ToNot(BeNil())
                        Expect(*sts.Spec.Replicas).To(Equal(int32(3)))
+
+                       // since we are in the env test, the rss object may 
never transmit upgrading to running.
+                       By("Ensure rss object is still upgrading")
+                       err = wait.Poll(time.Second, time.Second*5, func() 
(bool, error) {
+                               curRss, getErr := 
testRssClient.UniffleV1alpha1().RemoteShuffleServices(testNamespace).
+                                       Get(context.TODO(), testRssName, 
metav1.GetOptions{})
+                               if getErr != nil {
+                                       return false, getErr
+                               }
+                               if curRss.Status.Phase != 
unifflev1alpha1.RSSUpgrading {
+                                       return false, nil
+                               }
+                               return true, nil
+                       })
+                       Expect(err).ToNot(HaveOccurred())
+
+                       By("Delete the upgrading rss object")
+                       err = 
testRssClient.UniffleV1alpha1().RemoteShuffleServices(corev1.NamespaceDefault).
+                               Delete(context.TODO(), testRssName, 
metav1.DeleteOptions{})
+                       Expect(err).ToNot(HaveOccurred())
+
+                       By("Waiting the rss object being delete")
+                       err = wait.Poll(time.Second, time.Second*5, func() 
(done bool, err error) {
+                               _, getErr := 
testRssClient.UniffleV1alpha1().RemoteShuffleServices(testNamespace).
+                                       Get(context.TODO(), testRssName, 
metav1.GetOptions{})
+                               if getErr != nil && errors.IsNotFound(getErr) {
+                                       return true, nil
+                               }
+                               return false, nil
+                       })
+                       Expect(err).ToNot(HaveOccurred())
                })
        })
 })
diff --git a/deploy/kubernetes/operator/pkg/webhook/inspector/rss.go 
b/deploy/kubernetes/operator/pkg/webhook/inspector/rss.go
index e10890d4..43e039c7 100644
--- a/deploy/kubernetes/operator/pkg/webhook/inspector/rss.go
+++ b/deploy/kubernetes/operator/pkg/webhook/inspector/rss.go
@@ -42,6 +42,8 @@ func (i *inspector) validateRSS(ar 
*admissionv1.AdmissionReview) *admissionv1.Ad
                        return util.AdmissionReviewFailed(ar, err)
                }
                // for security purposes, we forbid updating rss objects when 
they are in upgrading phase.
+               // generally speaking, we should also deny updating when rss is 
terminating. However, it would introduce more
+               // complexity and controller's current terminating logic can 
tolerate the rss object update.
                if oldRSS.Status.Phase == unifflev1alpha1.RSSUpgrading {
                        message := "can not update upgrading rss object: " + 
utils.UniqueName(oldRSS)
                        return util.AdmissionReviewForbidden(ar, message)

Reply via email to