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

zhongxjian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git


The following commit(s) were added to refs/heads/master by this push:
     new a01bbbc5 [operator] Fix uninstalling panic v3
a01bbbc5 is described below

commit a01bbbc5325f3e170f78604240f9082306bc7583
Author: mfordjody <[email protected]>
AuthorDate: Tue Dec 24 18:44:50 2024 +0800

    [operator] Fix uninstalling panic v3
---
 dubboctl/pkg/cli/context.go           |  2 +-
 operator/cmd/cluster/uninstall.go     | 13 ++++-----
 operator/pkg/install/installer.go     | 50 +++++++++++++++++++++++++++++++++--
 operator/pkg/manifest/manifest.go     | 11 ++++++++
 operator/pkg/manifest/name.go         |  1 +
 operator/pkg/uninstall/uninstaller.go | 15 ++++++-----
 operator/pkg/util/label.go            | 35 ++++++++++++++++++++++++
 7 files changed, 109 insertions(+), 18 deletions(-)

diff --git a/dubboctl/pkg/cli/context.go b/dubboctl/pkg/cli/context.go
index 4899570c..d12a8958 100644
--- a/dubboctl/pkg/cli/context.go
+++ b/dubboctl/pkg/cli/context.go
@@ -12,8 +12,8 @@ type instance struct {
 }
 
 type Context interface {
-       CLIClientWithRevision(rev string) (kube.CLIClient, error)
        CLIClient() (kube.CLIClient, error)
+       CLIClientWithRevision(rev string) (kube.CLIClient, error)
 }
 
 func NewCLIContext(rootFlags *RootFlags) Context {
diff --git a/operator/cmd/cluster/uninstall.go 
b/operator/cmd/cluster/uninstall.go
index f32fb103..e1b5f52d 100644
--- a/operator/cmd/cluster/uninstall.go
+++ b/operator/cmd/cluster/uninstall.go
@@ -37,11 +37,10 @@ func UninstallCmd(ctx cli.Context) *cobra.Command {
        rootArgs := &RootArgs{}
        uiArgs := &uninstallArgs{}
        uicmd := &cobra.Command{
-               Use:           "uninstall",
-               Short:         "Uninstall Dubbo related resources",
-               Long:          "The uninstall command will uninstall the dubbo 
cluster",
-               SilenceUsage:  true,
-               SilenceErrors: false,
+               Use:          "uninstall",
+               Short:        "Uninstall Dubbo related resources",
+               Long:         "The uninstall command will uninstall the dubbo 
cluster",
+               SilenceUsage: true,
                Example: ` # Uninstall a single control plane by dop file
   dubboctl uninstall -f dop.yaml
   
@@ -69,13 +68,11 @@ func Uninstall(cmd *cobra.Command, ctx cli.Context, 
rootArgs *RootArgs, uiArgs *
        cl := clog.NewConsoleLogger(cmd.OutOrStdout(), cmd.ErrOrStderr(), 
installerScope)
        var kubeClient kube.CLIClient
        var err error
-
+       kubeClient, err = ctx.CLIClientWithRevision("")
        if err != nil {
                return err
        }
 
-       kubeClient, err = ctx.CLIClientWithRevision("")
-
        pl := progress.NewInfo()
        if uiArgs.purge && uiArgs.files != "" {
                cl.LogAndPrint(PurgeWithRevisionOrOperatorSpecifiedWarning)
diff --git a/operator/pkg/install/installer.go 
b/operator/pkg/install/installer.go
index b6e542b3..9cadbbd4 100644
--- a/operator/pkg/install/installer.go
+++ b/operator/pkg/install/installer.go
@@ -16,6 +16,8 @@ import (
        "github.com/apache/dubbo-kubernetes/pkg/util/slices"
        "github.com/hashicorp/go-multierror"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       klabels "k8s.io/apimachinery/pkg/labels"
+       "k8s.io/apimachinery/pkg/selection"
        "k8s.io/apimachinery/pkg/types"
        "sync"
 )
@@ -96,6 +98,10 @@ func (i Installer) applyManifestSet(manifestSet 
manifest.ManifestSet) error {
        manifests := manifestSet.Manifests
        pi := i.ProgressInfo.NewComponent(componentNames)
        for _, obj := range manifests {
+               obj, err := i.applyLabelsAndAnnotations(obj, componentNames)
+               if err != nil {
+                       return err
+               }
                if err := i.serverSideApply(obj); err != nil {
                        pi.ReportError(err.Error())
                        return err
@@ -126,6 +132,16 @@ func (i Installer) serverSideApply(obj manifest.Manifest) 
error {
        return nil
 }
 
+func (i Installer) applyLabelsAndAnnotations(obj manifest.Manifest, cname 
string) (manifest.Manifest, error) {
+       for k, v := range getOwnerLabels(i.Values, cname) {
+               err := util.SetLabel(obj, k, v)
+               if err != nil {
+                       return manifest.Manifest{}, err
+               }
+       }
+       return manifest.FromObject(obj.Unstructured)
+}
+
 func (i Installer) prune(manifests []manifest.ManifestSet) error {
        if i.DryRun {
                return nil
@@ -144,6 +160,14 @@ func (i Installer) prune(manifests []manifest.ManifestSet) 
error {
                }
        }
 
+       coreLabels := getOwnerLabels(i.Values, "")
+       selector := klabels.Set(coreLabels).AsSelectorPreValidated()
+       compReq, err := klabels.NewRequirement(manifest.DubboComponentLabel, 
selection.Exists, nil)
+       if err != nil {
+               return err
+       }
+       selector = selector.Add(*compReq)
+
        var errs util.Errors
        resources := uninstall.PrunedResourcesSchemas()
        for _, gvk := range resources {
@@ -151,15 +175,22 @@ func (i Installer) prune(manifests 
[]manifest.ManifestSet) error {
                if err != nil {
                        return err
                }
-               objs, err := dc.List(context.Background(), metav1.ListOptions{})
+               objs, err := dc.List(context.Background(), 
metav1.ListOptions{LabelSelector: selector.String()})
                if objs == nil {
                        continue
                }
-               for _, excluded := range excluded {
+               for comp, excluded := range excluded {
+                       compLabels := 
klabels.SelectorFromSet(getOwnerLabels(i.Values, string(comp)))
                        for _, obj := range objs.Items {
                                if excluded.Contains(manifest.ObjectHash(&obj)) 
{
                                        continue
                                }
+                               if 
obj.GetLabels()[manifest.OwningResourceNotPruned] == "true" {
+                                       continue
+                               }
+                               if 
!compLabels.Matches(klabels.Set(obj.GetLabels())) {
+                                       continue
+                               }
                                if err := uninstall.DeleteResource(i.Kube, 
i.DryRun, i.Logger, &obj); err != nil {
                                        errs = append(errs, err)
                                }
@@ -182,3 +213,18 @@ func dependenciesChs() map[component.Name]chan struct{} {
        }
        return r
 }
+
+func getOwnerLabels(dop values.Map, c string) map[string]string {
+       labels := make(map[string]string)
+
+       if n := dop.GetPathString("metadata.name"); n != "" {
+               labels[manifest.OwningResourceName] = n
+       }
+       if n := dop.GetPathString("metadata.namespace"); n != "" {
+               labels[manifest.OwningResourceNamespace] = n
+       }
+       if c != "" {
+               labels[manifest.DubboComponentLabel] = c
+       }
+       return labels
+}
diff --git a/operator/pkg/manifest/manifest.go 
b/operator/pkg/manifest/manifest.go
index a08c49e9..3e22a4c6 100644
--- a/operator/pkg/manifest/manifest.go
+++ b/operator/pkg/manifest/manifest.go
@@ -41,6 +41,17 @@ func FromYAML(y []byte) (Manifest, error) {
        return Manifest{Unstructured: us, Content: string(y)}, nil
 }
 
+func FromObject(us *unstructured.Unstructured) (Manifest, error) {
+       c, err := yaml.Marshal(us)
+       if err != nil {
+               return Manifest{}, err
+       }
+       return Manifest{
+               Unstructured: us,
+               Content:      string(c),
+       }, nil
+}
+
 func Parse(output []string) ([]Manifest, error) {
        result := make([]Manifest, 0, len(output))
        for _, m := range output {
diff --git a/operator/pkg/manifest/name.go b/operator/pkg/manifest/name.go
index 8d26cc4b..5dc0f7c4 100644
--- a/operator/pkg/manifest/name.go
+++ b/operator/pkg/manifest/name.go
@@ -4,4 +4,5 @@ const (
        OwningResourceName      = "install.operator.dubbo.io/owning-resource"
        OwningResourceNamespace = 
"install.operator.dubbo.io/owning-resource-namespace"
        DubboComponentLabel     = "operator.dubbo.io/component"
+       OwningResourceNotPruned = 
"install.operator.dubbo.io/owning-resource-not-pruned"
 )
diff --git a/operator/pkg/uninstall/uninstaller.go 
b/operator/pkg/uninstall/uninstaller.go
index 54e87e96..00b6f49a 100644
--- a/operator/pkg/uninstall/uninstaller.go
+++ b/operator/pkg/uninstall/uninstaller.go
@@ -24,7 +24,7 @@ var (
                gvk.CustomResourceDefinition.Kubernetes())
 )
 
-func GetPrunedResources(kcli kube.CLIClient, dopName, dopNamespace string, 
includeClusterResources bool) ([]*unstructured.UnstructuredList, error) {
+func GetPrunedResources(kc kube.CLIClient, dopName, dopNamespace string, 
includeClusterResources bool) ([]*unstructured.UnstructuredList, error) {
        var usList []*unstructured.UnstructuredList
        labels := make(map[string]string)
        if dopName != "" {
@@ -44,7 +44,7 @@ func GetPrunedResources(kcli kube.CLIClient, dopName, 
dopNamespace string, inclu
                if err != nil {
                        return nil, err
                }
-               c, err := kcli.DynamicClientFor(g, nil, "")
+               c, err := kc.DynamicClientFor(g, nil, "")
                if err != nil {
                        return nil, err
                }
@@ -56,6 +56,7 @@ func GetPrunedResources(kcli kube.CLIClient, dopName, 
dopNamespace string, inclu
                        continue
                }
                usList = append(usList, result)
+
        }
        return usList, nil
 }
@@ -71,8 +72,8 @@ func PrunedResourcesSchemas() []schema.GroupVersionKind {
 
 func DeleteObjectsList(c kube.CLIClient, dryRun bool, log clog.Logger, 
objectsList []*unstructured.UnstructuredList) error {
        var errs util.Errors
-       for _, ul := range objectsList {
-               for _, o := range ul.Items {
+       for _, ol := range objectsList {
+               for _, o := range ol.Items {
                        if err := DeleteResource(c, dryRun, log, &o); err != 
nil {
                                errs = append(errs, err)
                        }
@@ -81,14 +82,14 @@ func DeleteObjectsList(c kube.CLIClient, dryRun bool, log 
clog.Logger, objectsLi
        return errs.ToErrors()
 }
 
-func DeleteResource(clt kube.CLIClient, dryRun bool, log clog.Logger, obj 
*unstructured.Unstructured) error {
+func DeleteResource(kc kube.CLIClient, dryRun bool, log clog.Logger, obj 
*unstructured.Unstructured) error {
        name := fmt.Sprintf("%v/%s.%s", obj.GroupVersionKind(), obj.GetName(), 
obj.GetNamespace())
        if dryRun {
                log.LogAndPrintf("Not pruning object %s because of dry run.", 
name)
                return nil
        }
 
-       c, err := clt.DynamicClientFor(obj.GroupVersionKind(), obj, "")
+       c, err := kc.DynamicClientFor(obj.GroupVersionKind(), obj, "")
        if err != nil {
                return err
        }
@@ -101,6 +102,6 @@ func DeleteResource(clt kube.CLIClient, dryRun bool, log 
clog.Logger, obj *unstr
                return nil
        }
 
-       log.LogAndPrintf("  Removed %s.", name)
+       log.LogAndPrintf(" ✔︎ Removed %s.", name)
        return nil
 }
diff --git a/operator/pkg/util/label.go b/operator/pkg/util/label.go
new file mode 100644
index 00000000..307a5dc0
--- /dev/null
+++ b/operator/pkg/util/label.go
@@ -0,0 +1,35 @@
+// Copyright Istio Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package util
+
+import (
+       "k8s.io/apimachinery/pkg/api/meta"
+       "k8s.io/apimachinery/pkg/runtime"
+)
+
+// SetLabel is a helper function which sets the specified label and value on 
the specified object.
+func SetLabel(resource runtime.Object, label, value string) error {
+       resourceAccessor, err := meta.Accessor(resource)
+       if err != nil {
+               return err
+       }
+       labels := resourceAccessor.GetLabels()
+       if labels == nil {
+               labels = map[string]string{}
+       }
+       labels[label] = value
+       resourceAccessor.SetLabels(labels)
+       return nil
+}

Reply via email to