From d46dfa2f766b9c7206db3ce1cf8174ff1d1d6895 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 12 Jul 2023 16:10:11 +0800 Subject: [PATCH 01/32] v1 pdb --- pkg/controller/pdb.go | 91 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 pkg/controller/pdb.go diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go new file mode 100644 index 00000000000..ec7340282c6 --- /dev/null +++ b/pkg/controller/pdb.go @@ -0,0 +1,91 @@ +// Copyright (C) 2023, MinIO, Inc. +// +// This code is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License, version 3, +// as published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License, version 3, +// along with this program. If not, see + +package controller + +import ( + "context" + "encoding/json" + "fmt" + v2 "github.com/minio/operator/pkg/apis/minio.min.io/v2" + v1 "k8s.io/api/policy/v1" + k8serrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/intstr" + "strings" +) + +func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err error) { + for _, pool := range t.Spec.Pools { + if strings.TrimSpace(pool.Name) == "" { + continue + } + var pdb *v1.PodDisruptionBudget + var isCreate = false + pdb, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Get(ctx, pool.Name, metav1.GetOptions{}) + if err != nil { + if k8serrors.IsNotFound(err) { + pdb = &v1.PodDisruptionBudget{} + isCreate = true + } else { + return err + } + } + if !isCreate { + // exist and as expected + if pdb.Spec.MaxUnavailable != nil && pdb.Spec.MaxUnavailable.IntValue() == (int(pool.Servers/2)) { + return nil + } + } + // set filed we expected + pdb.Name = pool.Name + pdb.Namespace = t.Namespace + maxUnavailable := intstr.FromInt(int(pool.Servers / 2)) + pdb.Spec.MaxUnavailable = &maxUnavailable + pdb.Labels = map[string]string{ + v2.TenantLabel: t.Name, + v2.PoolLabel: pool.Name, + } + pdb.Spec.Selector = metav1.SetAsLabelSelector(labels.Set{ + v2.PoolLabel: pool.Name, + v2.TenantLabel: t.Name, + }) + if isCreate { + _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Create(ctx, pdb, metav1.CreateOptions{}) + if err != nil { + return err + } + } else { + patchData := map[string]interface{}{ + "spec": map[string]interface{}{ + "maxUnavailable": pdb.Spec.MaxUnavailable, + }, + } + pData, err := json.Marshal(patchData) + if err != nil { + return err + } + _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Patch(ctx, t.Name, types.MergePatchType, pData, metav1.PatchOptions{}) + if err != nil { + return nil + } + } + } + if len(t.Spec.Pools) == 0 { + return fmt.Errorf("%s empty pools", t.Name) + } + return nil +} From 11d2c96a143477776f7ff9faedbce1b7887455e2 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 12 Jul 2023 16:39:02 +0800 Subject: [PATCH 02/32] PDBAvailable --- pkg/controller/pdb.go | 44 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index ec7340282c6..c1a69c625d1 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -25,7 +25,9 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/klog/v2" "strings" + "sync" ) func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err error) { @@ -89,3 +91,45 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } return nil } + +type PDBAvailable struct { + v1 bool + v1beta bool +} + +var globalPdbAvailable = PDBAvailable{} +var globalPdbAvailableOnce = sync.Once{} + +func (c *Controller) PDBAvailable() PDBAvailable { + globalPdbAvailableOnce.Do(func() { + defer func() { + if globalPdbAvailable.v1 { + klog.Infof("PodDisruptionBudget: v1") + } else if globalPdbAvailable.v1beta { + klog.Infof("PodDisruptionBudget: v1beta") + } else { + klog.Infof("PodDisruptionBudget: unsupport") + } + }() + resouces, _ := c.kubeClientSet.Discovery().ServerPreferredResources() + for _, r := range resouces { + if r.GroupVersion == "policy/v1" { + for _, api := range r.APIResources { + if api.Kind == "PodDisruptionBudget" { + globalPdbAvailable.v1 = true + return + } + } + } + if r.GroupVersion == "policy/v1beta" { + for _, api := range r.APIResources { + if api.Kind == "PodDisruptionBudget" { + globalPdbAvailable.v1beta = true + return + } + } + } + } + }) + return globalPdbAvailable +} From 25ab91eac250924f435251e05ada58078cce0df7 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 12 Jul 2023 16:41:08 +0800 Subject: [PATCH 03/32] Available --- pkg/controller/pdb.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index c1a69c625d1..738d67dd2fc 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -97,6 +97,10 @@ type PDBAvailable struct { v1beta bool } +func (p *PDBAvailable) Available() bool { + return p.v1 || p.v1beta +} + var globalPdbAvailable = PDBAvailable{} var globalPdbAvailableOnce = sync.Once{} From 24818a585e032ae59900c8ffed46a0dfbb586773 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 12 Jul 2023 16:43:33 +0800 Subject: [PATCH 04/32] Available --- pkg/controller/pdb.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 738d67dd2fc..700f9e911c8 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -31,6 +31,10 @@ import ( ) func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err error) { + available := c.PDBAvailable() + if !available.Available() { + return nil + } for _, pool := range t.Spec.Pools { if strings.TrimSpace(pool.Name) == "" { continue From 4112e5dd06b9614db1231df7ded134c2dfe4652f Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 12 Jul 2023 16:47:07 +0800 Subject: [PATCH 05/32] v1beat --- pkg/controller/pdb.go | 146 ++++++++++++++++++++++++++++++------------ 1 file changed, 105 insertions(+), 41 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 700f9e911c8..0bc2b7d1f37 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -20,6 +20,7 @@ import ( "fmt" v2 "github.com/minio/operator/pkg/apis/minio.min.io/v2" v1 "k8s.io/api/policy/v1" + "k8s.io/api/policy/v1beta1" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -39,56 +40,111 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if strings.TrimSpace(pool.Name) == "" { continue } - var pdb *v1.PodDisruptionBudget - var isCreate = false - pdb, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Get(ctx, pool.Name, metav1.GetOptions{}) - if err != nil { - if k8serrors.IsNotFound(err) { - pdb = &v1.PodDisruptionBudget{} - isCreate = true - } else { - return err + if available.V1Available() { + var pdb *v1.PodDisruptionBudget + var isCreate = false + pdb, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Get(ctx, pool.Name, metav1.GetOptions{}) + if err != nil { + if k8serrors.IsNotFound(err) { + pdb = &v1.PodDisruptionBudget{} + isCreate = true + } else { + return err + } } - } - if !isCreate { - // exist and as expected - if pdb.Spec.MaxUnavailable != nil && pdb.Spec.MaxUnavailable.IntValue() == (int(pool.Servers/2)) { - return nil + if !isCreate { + // exist and as expected + if pdb.Spec.MaxUnavailable != nil && pdb.Spec.MaxUnavailable.IntValue() == (int(pool.Servers/2)) { + return nil + } + } + // set filed we expected + pdb.Name = pool.Name + pdb.Namespace = t.Namespace + maxUnavailable := intstr.FromInt(int(pool.Servers / 2)) + pdb.Spec.MaxUnavailable = &maxUnavailable + pdb.Labels = map[string]string{ + v2.TenantLabel: t.Name, + v2.PoolLabel: pool.Name, + } + pdb.Spec.Selector = metav1.SetAsLabelSelector(labels.Set{ + v2.PoolLabel: pool.Name, + v2.TenantLabel: t.Name, + }) + if isCreate { + _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Create(ctx, pdb, metav1.CreateOptions{}) + if err != nil { + return err + } + } else { + patchData := map[string]interface{}{ + "spec": map[string]interface{}{ + "maxUnavailable": pdb.Spec.MaxUnavailable, + }, + } + pData, err := json.Marshal(patchData) + if err != nil { + return err + } + _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Patch(ctx, t.Name, types.MergePatchType, pData, metav1.PatchOptions{}) + if err != nil { + return nil + } } } - // set filed we expected - pdb.Name = pool.Name - pdb.Namespace = t.Namespace - maxUnavailable := intstr.FromInt(int(pool.Servers / 2)) - pdb.Spec.MaxUnavailable = &maxUnavailable - pdb.Labels = map[string]string{ - v2.TenantLabel: t.Name, - v2.PoolLabel: pool.Name, - } - pdb.Spec.Selector = metav1.SetAsLabelSelector(labels.Set{ - v2.PoolLabel: pool.Name, - v2.TenantLabel: t.Name, - }) - if isCreate { - _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Create(ctx, pdb, metav1.CreateOptions{}) + if available.V1BetaAvailable() { + var pdb *v1beta1.PodDisruptionBudget + var isCreate = false + pdb, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Get(ctx, pool.Name, metav1.GetOptions{}) if err != nil { - return err + if k8serrors.IsNotFound(err) { + pdb = &v1beta1.PodDisruptionBudget{} + isCreate = true + } else { + return err + } } - } else { - patchData := map[string]interface{}{ - "spec": map[string]interface{}{ - "maxUnavailable": pdb.Spec.MaxUnavailable, - }, + if !isCreate { + // exist and as expected + if pdb.Spec.MaxUnavailable != nil && pdb.Spec.MaxUnavailable.IntValue() == (int(pool.Servers/2)) { + return nil + } } - pData, err := json.Marshal(patchData) - if err != nil { - return err + // set filed we expected + pdb.Name = pool.Name + pdb.Namespace = t.Namespace + maxUnavailable := intstr.FromInt(int(pool.Servers / 2)) + pdb.Spec.MaxUnavailable = &maxUnavailable + pdb.Labels = map[string]string{ + v2.TenantLabel: t.Name, + v2.PoolLabel: pool.Name, } - _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Patch(ctx, t.Name, types.MergePatchType, pData, metav1.PatchOptions{}) - if err != nil { - return nil + pdb.Spec.Selector = metav1.SetAsLabelSelector(labels.Set{ + v2.PoolLabel: pool.Name, + v2.TenantLabel: t.Name, + }) + if isCreate { + _, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Create(ctx, pdb, metav1.CreateOptions{}) + if err != nil { + return err + } + } else { + patchData := map[string]interface{}{ + "spec": map[string]interface{}{ + "maxUnavailable": pdb.Spec.MaxUnavailable, + }, + } + pData, err := json.Marshal(patchData) + if err != nil { + return err + } + _, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Patch(ctx, t.Name, types.MergePatchType, pData, metav1.PatchOptions{}) + if err != nil { + return nil + } } } + } if len(t.Spec.Pools) == 0 { return fmt.Errorf("%s empty pools", t.Name) @@ -101,6 +157,14 @@ type PDBAvailable struct { v1beta bool } +func (p *PDBAvailable) V1Available() bool { + return p.v1 +} + +func (p *PDBAvailable) V1BetaAvailable() bool { + return p.v1beta +} + func (p *PDBAvailable) Available() bool { return p.v1 || p.v1beta } From 9143a2e3548bb0774e4da9eeebc154b557e680ae Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 12 Jul 2023 16:54:54 +0800 Subject: [PATCH 06/32] delete --- pkg/controller/pdb.go | 57 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 0bc2b7d1f37..d9eec1e617b 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -18,6 +18,9 @@ import ( "context" "encoding/json" "fmt" + "strings" + "sync" + v2 "github.com/minio/operator/pkg/apis/minio.min.io/v2" v1 "k8s.io/api/policy/v1" "k8s.io/api/policy/v1beta1" @@ -27,10 +30,41 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/klog/v2" - "strings" - "sync" ) +func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { + available := c.PDBAvailable() + if !available.Available() { + return nil + } + if available.V1Available() { + pdbs, err := c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).List(ctx, metav1.ListOptions{}) + if err != nil { + return err + } + for _, pdb := range pdbs.Items { + err := c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Delete(ctx, pdb.Name, metav1.DeleteOptions{}) + if err != nil { + return err + } + } + } + if available.V1BetaAvailable() { + pdbs, err := c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).List(ctx, metav1.ListOptions{}) + if err != nil { + return err + } + for _, pdb := range pdbs.Items { + err := c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Delete(ctx, pdb.Name, metav1.DeleteOptions{}) + if err != nil { + return err + } + } + } + return nil +} + +// CreateOrUpdatePDB - hold PDB as expected func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err error) { available := c.PDBAvailable() if !available.Available() { @@ -157,27 +191,30 @@ type PDBAvailable struct { v1beta bool } +// V1Available - show if it support PDB v1 func (p *PDBAvailable) V1Available() bool { return p.v1 } +// V1BetaAvailable - show if it support PDB v1beta func (p *PDBAvailable) V1BetaAvailable() bool { return p.v1beta } +// Available - show if it support PDB func (p *PDBAvailable) Available() bool { return p.v1 || p.v1beta } -var globalPdbAvailable = PDBAvailable{} -var globalPdbAvailableOnce = sync.Once{} +var globalPDBAvailable = PDBAvailable{} +var globalPDBAvailableOnce = sync.Once{} func (c *Controller) PDBAvailable() PDBAvailable { - globalPdbAvailableOnce.Do(func() { + globalPDBAvailableOnce.Do(func() { defer func() { - if globalPdbAvailable.v1 { + if globalPDBAvailable.v1 { klog.Infof("PodDisruptionBudget: v1") - } else if globalPdbAvailable.v1beta { + } else if globalPDBAvailable.v1beta { klog.Infof("PodDisruptionBudget: v1beta") } else { klog.Infof("PodDisruptionBudget: unsupport") @@ -188,7 +225,7 @@ func (c *Controller) PDBAvailable() PDBAvailable { if r.GroupVersion == "policy/v1" { for _, api := range r.APIResources { if api.Kind == "PodDisruptionBudget" { - globalPdbAvailable.v1 = true + globalPDBAvailable.v1 = true return } } @@ -196,12 +233,12 @@ func (c *Controller) PDBAvailable() PDBAvailable { if r.GroupVersion == "policy/v1beta" { for _, api := range r.APIResources { if api.Kind == "PodDisruptionBudget" { - globalPdbAvailable.v1beta = true + globalPDBAvailable.v1beta = true return } } } } }) - return globalPdbAvailable + return globalPDBAvailable } From 82e593d04ffd831ddfb7c294be93515fc57db8c4 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 12 Jul 2023 16:55:47 +0800 Subject: [PATCH 07/32] deletePDB --- pkg/controller/pdb.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index d9eec1e617b..f2b2c537bcb 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -32,6 +32,7 @@ import ( "k8s.io/klog/v2" ) +// DeletePDB - delete PDB for tenant func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { available := c.PDBAvailable() if !available.Available() { From 72bab32c59dcd53946d3631add58b7e3f326f9f6 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Thu, 13 Jul 2023 17:47:20 +0800 Subject: [PATCH 08/32] deletePDB --- pkg/controller/pdb.go | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index f2b2c537bcb..3d99c028e40 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -39,28 +39,24 @@ func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { return nil } if available.V1Available() { - pdbs, err := c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).List(ctx, metav1.ListOptions{}) + err := c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).DeleteCollection(ctx, metav1.DeleteOptions{}, metav1.ListOptions{ + LabelSelector: metav1.SetAsLabelSelector(labels.Set{ + v2.TenantLabel: t.Name, + }).String(), + }) if err != nil { return err } - for _, pdb := range pdbs.Items { - err := c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Delete(ctx, pdb.Name, metav1.DeleteOptions{}) - if err != nil { - return err - } - } } if available.V1BetaAvailable() { - pdbs, err := c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).List(ctx, metav1.ListOptions{}) + err := c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).DeleteCollection(ctx, metav1.DeleteOptions{}, metav1.ListOptions{ + LabelSelector: metav1.SetAsLabelSelector(labels.Set{ + v2.TenantLabel: t.Name, + }).String(), + }) if err != nil { return err } - for _, pdb := range pdbs.Items { - err := c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Delete(ctx, pdb.Name, metav1.DeleteOptions{}) - if err != nil { - return err - } - } } return nil } From f4e6d9bef6fbafc4ebfc334998ce06d7c9ee2035 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Fri, 14 Jul 2023 09:23:04 +0800 Subject: [PATCH 09/32] lint --- pkg/controller/pdb.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 3d99c028e40..a5c17e9188d 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -183,12 +183,13 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e return nil } +// PDBAvailable - v1 for v1.PDB and v1beta for v1beta.PDB,flag for support or not type PDBAvailable struct { v1 bool v1beta bool } -// V1Available - show if it support PDB v1 +// V1Available - show if it supports PDB v1 func (p *PDBAvailable) V1Available() bool { return p.v1 } @@ -198,7 +199,7 @@ func (p *PDBAvailable) V1BetaAvailable() bool { return p.v1beta } -// Available - show if it support PDB +// Available - show if it supports PDB func (p *PDBAvailable) Available() bool { return p.v1 || p.v1beta } @@ -206,6 +207,7 @@ func (p *PDBAvailable) Available() bool { var globalPDBAvailable = PDBAvailable{} var globalPDBAvailableOnce = sync.Once{} +// PDBAvailable - return globalPDBAvailable func (c *Controller) PDBAvailable() PDBAvailable { globalPDBAvailableOnce.Do(func() { defer func() { From 2f36805b5b3fc08e9dbf4c8314fc448c6b8ccec3 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Fri, 14 Jul 2023 09:23:21 +0800 Subject: [PATCH 10/32] lint --- pkg/controller/pdb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index a5c17e9188d..d4cd36c67be 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -194,7 +194,7 @@ func (p *PDBAvailable) V1Available() bool { return p.v1 } -// V1BetaAvailable - show if it support PDB v1beta +// V1BetaAvailable - show if it supports PDB v1beta func (p *PDBAvailable) V1BetaAvailable() bool { return p.v1beta } From c764fe337fee12c64e60e41d43d0ba2dd67b7fdd Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Fri, 14 Jul 2023 09:29:02 +0800 Subject: [PATCH 11/32] lint --- pkg/controller/pdb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index d4cd36c67be..16bf90e5f2a 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -73,7 +73,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } if available.V1Available() { var pdb *v1.PodDisruptionBudget - var isCreate = false + var isCreate bool pdb, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Get(ctx, pool.Name, metav1.GetOptions{}) if err != nil { if k8serrors.IsNotFound(err) { @@ -125,7 +125,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } if available.V1BetaAvailable() { var pdb *v1beta1.PodDisruptionBudget - var isCreate = false + var isCreate bool pdb, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Get(ctx, pool.Name, metav1.GetOptions{}) if err != nil { if k8serrors.IsNotFound(err) { From 3f26493663e972eaf66d4e463dbfd029e29e7679 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Fri, 14 Jul 2023 10:53:09 +0800 Subject: [PATCH 12/32] lint --- pkg/controller/pdb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 16bf90e5f2a..5cc9afcbd5b 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -204,8 +204,8 @@ func (p *PDBAvailable) Available() bool { return p.v1 || p.v1beta } -var globalPDBAvailable = PDBAvailable{} -var globalPDBAvailableOnce = sync.Once{} +var globalPDBAvailable PDBAvailable +var globalPDBAvailableOnce sync.Once // PDBAvailable - return globalPDBAvailable func (c *Controller) PDBAvailable() PDBAvailable { From 3c091924570815504793a4948d3873639e79a526 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Fri, 14 Jul 2023 11:01:31 +0800 Subject: [PATCH 13/32] lint --- pkg/controller/pdb.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 5cc9afcbd5b..0a86e4da30e 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -204,8 +204,10 @@ func (p *PDBAvailable) Available() bool { return p.v1 || p.v1beta } -var globalPDBAvailable PDBAvailable -var globalPDBAvailableOnce sync.Once +var ( + globalPDBAvailable PDBAvailable + globalPDBAvailableOnce sync.Once +) // PDBAvailable - return globalPDBAvailable func (c *Controller) PDBAvailable() PDBAvailable { From 81d8672907d0667d2d961362e299a903833b167b Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Sat, 15 Jul 2023 23:45:43 +0800 Subject: [PATCH 14/32] Add to controller --- pkg/controller/decomission.go | 4 ++++ pkg/controller/main-controller.go | 6 ++++++ pkg/controller/pdb.go | 19 +++++++++++++++---- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/pkg/controller/decomission.go b/pkg/controller/decomission.go index bbcde372e77..ca5e1bef40a 100644 --- a/pkg/controller/decomission.go +++ b/pkg/controller/decomission.go @@ -51,6 +51,10 @@ func (c *Controller) checkForPoolDecommission(ctx context.Context, key string, t // if the number of pools in the spec is less that what we know in the status, a decomission is taking place if len(tenant.Status.Pools) > len(tenant.Spec.Pools) { + err := c.DeletePDB(ctx, tenant) + if err != nil { + return nil, err + } // check for empty pool names var noDecom bool for _, pool := range tenant.Spec.Pools { diff --git a/pkg/controller/main-controller.go b/pkg/controller/main-controller.go index b79a9fccf13..6732de6bc94 100644 --- a/pkg/controller/main-controller.go +++ b/pkg/controller/main-controller.go @@ -1306,6 +1306,12 @@ func (c *Controller) syncHandler(key string) (Result, error) { c.RegisterEvent(ctx, tenant, corev1.EventTypeNormal, "BucketsCreated", "Buckets created") } + // Create Or Update PDB for tenant + err = c.CreateOrUpdatePDB(ctx, tenant) + if err != nil { + return WrapResult(Result{}, err) + } + // Finally, we update the status block of the Tenant resource to reflect the // current state of the world _, err = c.updateTenantStatus(ctx, tenant, StatusInitialized, totalAvailableReplicas) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 0a86e4da30e..d78393e2511 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -34,7 +34,7 @@ import ( // DeletePDB - delete PDB for tenant func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { - available := c.PDBAvailable() + available := c.GetPDBAvailable() if !available.Available() { return nil } @@ -45,6 +45,11 @@ func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { }).String(), }) if err != nil { + // don't exist + if k8serrors.IsNotFound(err) { + return nil + } + klog.Errorf("Delete tenant %s's V1.PDB failed:%s", t.Name, err.Error()) return err } } @@ -55,6 +60,11 @@ func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { }).String(), }) if err != nil { + // don't exist + if k8serrors.IsNotFound(err) { + return nil + } + klog.Errorf("Delete tenant %s's V1Bata.PDB failed:%s", t.Name, err.Error()) return err } } @@ -63,7 +73,7 @@ func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { // CreateOrUpdatePDB - hold PDB as expected func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err error) { - available := c.PDBAvailable() + available := c.GetPDBAvailable() if !available.Available() { return nil } @@ -209,8 +219,9 @@ var ( globalPDBAvailableOnce sync.Once ) -// PDBAvailable - return globalPDBAvailable -func (c *Controller) PDBAvailable() PDBAvailable { +// GetPDBAvailable - return globalPDBAvailable +// thread safe +func (c *Controller) GetPDBAvailable() PDBAvailable { globalPDBAvailableOnce.Do(func() { defer func() { if globalPDBAvailable.v1 { From 10bf3384ef3c54702783c7656e14be07ad56c4b7 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Mon, 17 Jul 2023 21:38:02 +0800 Subject: [PATCH 15/32] support minAvailable --- pkg/controller/pdb.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index d78393e2511..c3a1cc0fd2e 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -95,15 +95,15 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } if !isCreate { // exist and as expected - if pdb.Spec.MaxUnavailable != nil && pdb.Spec.MaxUnavailable.IntValue() == (int(pool.Servers/2)) { + if pdb.Spec.MinAvailable != nil && pdb.Spec.MinAvailable.IntValue() == (int(pool.Servers/2)) { return nil } } // set filed we expected pdb.Name = pool.Name pdb.Namespace = t.Namespace - maxUnavailable := intstr.FromInt(int(pool.Servers / 2)) - pdb.Spec.MaxUnavailable = &maxUnavailable + minAvailable := intstr.FromInt(int(pool.Servers/2) + 1) + pdb.Spec.MinAvailable = &minAvailable pdb.Labels = map[string]string{ v2.TenantLabel: t.Name, v2.PoolLabel: pool.Name, @@ -120,7 +120,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } else { patchData := map[string]interface{}{ "spec": map[string]interface{}{ - "maxUnavailable": pdb.Spec.MaxUnavailable, + "minAvailable": pdb.Spec.MinAvailable, }, } pData, err := json.Marshal(patchData) @@ -147,15 +147,15 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } if !isCreate { // exist and as expected - if pdb.Spec.MaxUnavailable != nil && pdb.Spec.MaxUnavailable.IntValue() == (int(pool.Servers/2)) { + if pdb.Spec.MinAvailable != nil && pdb.Spec.MinAvailable.IntValue() == (int(pool.Servers/2)) { return nil } } // set filed we expected pdb.Name = pool.Name pdb.Namespace = t.Namespace - maxUnavailable := intstr.FromInt(int(pool.Servers / 2)) - pdb.Spec.MaxUnavailable = &maxUnavailable + minAvailable := intstr.FromInt(int(pool.Servers/2) + 1) + pdb.Spec.MinAvailable = &minAvailable pdb.Labels = map[string]string{ v2.TenantLabel: t.Name, v2.PoolLabel: pool.Name, @@ -172,7 +172,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } else { patchData := map[string]interface{}{ "spec": map[string]interface{}{ - "maxUnavailable": pdb.Spec.MaxUnavailable, + "minAvailable": pdb.Spec.MinAvailable, }, } pData, err := json.Marshal(patchData) From 7e93c822686f5c79436e5923bc294d80d9a4861c Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Mon, 17 Jul 2023 22:12:07 +0800 Subject: [PATCH 16/32] only sts ready can add pdb --- pkg/controller/pdb.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index c3a1cc0fd2e..d9a18b82292 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -64,7 +64,7 @@ func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { if k8serrors.IsNotFound(err) { return nil } - klog.Errorf("Delete tenant %s's V1Bata.PDB failed:%s", t.Name, err.Error()) + klog.Errorf("Delete tenant %s's V1Beta.PDB failed:%s", t.Name, err.Error()) return err } } @@ -81,6 +81,17 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if strings.TrimSpace(pool.Name) == "" { continue } + if available.Available() { + // check sts status first. + ssName := t.PoolStatefulsetName(&pool) + existingStatefulSet, err := c.statefulSetLister.StatefulSets(t.Namespace).Get(ssName) + if err != nil { + return err + } + if existingStatefulSet.Status.ReadyReplicas != existingStatefulSet.Status.Replicas || existingStatefulSet.Status.Replicas == 0 { + return nil + } + } if available.V1Available() { var pdb *v1.PodDisruptionBudget var isCreate bool From 42476f8215f6f72b31c3d841ade015dd67118643 Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 08:49:34 +0800 Subject: [PATCH 17/32] owner --- pkg/controller/pdb.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index d9a18b82292..3853290a13e 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -18,6 +18,7 @@ import ( "context" "encoding/json" "fmt" + "k8s.io/apimachinery/pkg/runtime/schema" "strings" "sync" @@ -123,6 +124,13 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e v2.PoolLabel: pool.Name, v2.TenantLabel: t.Name, }) + pdb.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(t, schema.GroupVersionKind{ + Group: v2.SchemeGroupVersion.Group, + Version: v2.SchemeGroupVersion.Version, + Kind: v2.MinIOCRDResourceKind, + }), + } if isCreate { _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Create(ctx, pdb, metav1.CreateOptions{}) if err != nil { @@ -175,6 +183,13 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e v2.PoolLabel: pool.Name, v2.TenantLabel: t.Name, }) + pdb.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(t, schema.GroupVersionKind{ + Group: v2.SchemeGroupVersion.Group, + Version: v2.SchemeGroupVersion.Version, + Kind: v2.MinIOCRDResourceKind, + }), + } if isCreate { _, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Create(ctx, pdb, metav1.CreateOptions{}) if err != nil { From 3e81cb676855afd513f65bb5fcaebea1f4ba042a Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 08:55:11 +0800 Subject: [PATCH 18/32] lint --- pkg/controller/pdb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 3853290a13e..d820895b505 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "fmt" - "k8s.io/apimachinery/pkg/runtime/schema" "strings" "sync" @@ -28,6 +27,7 @@ import ( k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/klog/v2" From dbaed8c7f4c457a17507bd1a8c5295274079cdb5 Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 10:41:23 +0800 Subject: [PATCH 19/32] runtime --- pkg/controller/pdb.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index d820895b505..402676f2271 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -92,6 +92,9 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if existingStatefulSet.Status.ReadyReplicas != existingStatefulSet.Status.Replicas || existingStatefulSet.Status.Replicas == 0 { return nil } + if t.Status.CurrentState != StatusInitialized { + return nil + } } if available.V1Available() { var pdb *v1.PodDisruptionBudget From 61badd02d2b476c2d143c67f00a610e8f9d7c735 Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 10:44:41 +0800 Subject: [PATCH 20/32] runtime --- pkg/controller/main-controller.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/controller/main-controller.go b/pkg/controller/main-controller.go index 6732de6bc94..b857ffa8984 100644 --- a/pkg/controller/main-controller.go +++ b/pkg/controller/main-controller.go @@ -1306,15 +1306,16 @@ func (c *Controller) syncHandler(key string) (Result, error) { c.RegisterEvent(ctx, tenant, corev1.EventTypeNormal, "BucketsCreated", "Buckets created") } + // Finally, we update the status block of the Tenant resource to reflect the + // current state of the world + tenant, err = c.updateTenantStatus(ctx, tenant, StatusInitialized, totalAvailableReplicas) + // Create Or Update PDB for tenant err = c.CreateOrUpdatePDB(ctx, tenant) if err != nil { return WrapResult(Result{}, err) } - // Finally, we update the status block of the Tenant resource to reflect the - // current state of the world - _, err = c.updateTenantStatus(ctx, tenant, StatusInitialized, totalAvailableReplicas) return WrapResult(Result{}, err) } From 8f7a9f6d657abc1fca98252e8034a8d16d5c6f7d Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 10:51:42 +0800 Subject: [PATCH 21/32] error --- pkg/controller/pdb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 402676f2271..2e2cedcb340 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -151,7 +151,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Patch(ctx, t.Name, types.MergePatchType, pData, metav1.PatchOptions{}) if err != nil { - return nil + return err } } } @@ -210,7 +210,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } _, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Patch(ctx, t.Name, types.MergePatchType, pData, metav1.PatchOptions{}) if err != nil { - return nil + return err } } } From 1e5c470a60e14c57d7b982b8cbb4d3da24a10efb Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 11:22:03 +0800 Subject: [PATCH 22/32] error --- pkg/controller/main-controller.go | 8 ++++---- pkg/controller/pdb.go | 14 ++++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pkg/controller/main-controller.go b/pkg/controller/main-controller.go index b857ffa8984..2be7c60e8f7 100644 --- a/pkg/controller/main-controller.go +++ b/pkg/controller/main-controller.go @@ -1306,16 +1306,16 @@ func (c *Controller) syncHandler(key string) (Result, error) { c.RegisterEvent(ctx, tenant, corev1.EventTypeNormal, "BucketsCreated", "Buckets created") } - // Finally, we update the status block of the Tenant resource to reflect the - // current state of the world - tenant, err = c.updateTenantStatus(ctx, tenant, StatusInitialized, totalAvailableReplicas) - // Create Or Update PDB for tenant err = c.CreateOrUpdatePDB(ctx, tenant) if err != nil { return WrapResult(Result{}, err) } + // Finally, we update the status block of the Tenant resource to reflect the + // current state of the world + _, err = c.updateTenantStatus(ctx, tenant, StatusInitialized, totalAvailableReplicas) + return WrapResult(Result{}, err) } diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 2e2cedcb340..2c45101b03c 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -97,9 +97,10 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } } if available.V1Available() { + pdbName := t.Name + "-" + pool.Name var pdb *v1.PodDisruptionBudget var isCreate bool - pdb, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Get(ctx, pool.Name, metav1.GetOptions{}) + pdb, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Get(ctx, pdbName, metav1.GetOptions{}) if err != nil { if k8serrors.IsNotFound(err) { pdb = &v1.PodDisruptionBudget{} @@ -115,7 +116,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } } // set filed we expected - pdb.Name = pool.Name + pdb.Name = pdbName pdb.Namespace = t.Namespace minAvailable := intstr.FromInt(int(pool.Servers/2) + 1) pdb.Spec.MinAvailable = &minAvailable @@ -149,16 +150,17 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if err != nil { return err } - _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Patch(ctx, t.Name, types.MergePatchType, pData, metav1.PatchOptions{}) + _, err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).Patch(ctx, pdbName, types.MergePatchType, pData, metav1.PatchOptions{}) if err != nil { return err } } } if available.V1BetaAvailable() { + pdbName := t.Name + "-" + pool.Name var pdb *v1beta1.PodDisruptionBudget var isCreate bool - pdb, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Get(ctx, pool.Name, metav1.GetOptions{}) + pdb, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Get(ctx, pdbName, metav1.GetOptions{}) if err != nil { if k8serrors.IsNotFound(err) { pdb = &v1beta1.PodDisruptionBudget{} @@ -174,7 +176,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } } // set filed we expected - pdb.Name = pool.Name + pdb.Name = pdbName pdb.Namespace = t.Namespace minAvailable := intstr.FromInt(int(pool.Servers/2) + 1) pdb.Spec.MinAvailable = &minAvailable @@ -208,7 +210,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if err != nil { return err } - _, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Patch(ctx, t.Name, types.MergePatchType, pData, metav1.PatchOptions{}) + _, err = c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).Patch(ctx, pdbName, types.MergePatchType, pData, metav1.PatchOptions{}) if err != nil { return err } From ba2d0eafc2346efd52f1c4a6c09facf4e0c20caf Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 11:23:39 +0800 Subject: [PATCH 23/32] status --- pkg/controller/pdb.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 2c45101b03c..47e47fecde8 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -92,9 +92,6 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if existingStatefulSet.Status.ReadyReplicas != existingStatefulSet.Status.Replicas || existingStatefulSet.Status.Replicas == 0 { return nil } - if t.Status.CurrentState != StatusInitialized { - return nil - } } if available.V1Available() { pdbName := t.Name + "-" + pool.Name From 036666a70db934077d9abfc687971e91cec94e5a Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 11:42:15 +0800 Subject: [PATCH 24/32] if --- pkg/controller/pdb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 47e47fecde8..e002f90b4aa 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -108,7 +108,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } if !isCreate { // exist and as expected - if pdb.Spec.MinAvailable != nil && pdb.Spec.MinAvailable.IntValue() == (int(pool.Servers/2)) { + if pdb.Spec.MinAvailable != nil && pdb.Spec.MinAvailable.IntValue() == (int(pool.Servers/2)+1) { return nil } } @@ -168,7 +168,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e } if !isCreate { // exist and as expected - if pdb.Spec.MinAvailable != nil && pdb.Spec.MinAvailable.IntValue() == (int(pool.Servers/2)) { + if pdb.Spec.MinAvailable != nil && pdb.Spec.MinAvailable.IntValue() == (int(pool.Servers/2)+1) { return nil } } From daf2d2af559ec5324a1fc771483baedce7d2a599 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Tue, 18 Jul 2023 12:21:11 +0800 Subject: [PATCH 25/32] tenant should --- pkg/controller/main-controller.go | 8 ++++---- pkg/controller/pdb.go | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pkg/controller/main-controller.go b/pkg/controller/main-controller.go index 2be7c60e8f7..b857ffa8984 100644 --- a/pkg/controller/main-controller.go +++ b/pkg/controller/main-controller.go @@ -1306,16 +1306,16 @@ func (c *Controller) syncHandler(key string) (Result, error) { c.RegisterEvent(ctx, tenant, corev1.EventTypeNormal, "BucketsCreated", "Buckets created") } + // Finally, we update the status block of the Tenant resource to reflect the + // current state of the world + tenant, err = c.updateTenantStatus(ctx, tenant, StatusInitialized, totalAvailableReplicas) + // Create Or Update PDB for tenant err = c.CreateOrUpdatePDB(ctx, tenant) if err != nil { return WrapResult(Result{}, err) } - // Finally, we update the status block of the Tenant resource to reflect the - // current state of the world - _, err = c.updateTenantStatus(ctx, tenant, StatusInitialized, totalAvailableReplicas) - return WrapResult(Result{}, err) } diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index e002f90b4aa..bf2c8fa1181 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -92,6 +92,9 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if existingStatefulSet.Status.ReadyReplicas != existingStatefulSet.Status.Replicas || existingStatefulSet.Status.Replicas == 0 { return nil } + if t.Status.CurrentState != StatusInitialized { + return nil + } } if available.V1Available() { pdbName := t.Name + "-" + pool.Name @@ -122,8 +125,8 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e v2.PoolLabel: pool.Name, } pdb.Spec.Selector = metav1.SetAsLabelSelector(labels.Set{ - v2.PoolLabel: pool.Name, v2.TenantLabel: t.Name, + v2.PoolLabel: pool.Name, }) pdb.OwnerReferences = []metav1.OwnerReference{ *metav1.NewControllerRef(t, schema.GroupVersionKind{ @@ -182,8 +185,8 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e v2.PoolLabel: pool.Name, } pdb.Spec.Selector = metav1.SetAsLabelSelector(labels.Set{ - v2.PoolLabel: pool.Name, v2.TenantLabel: t.Name, + v2.PoolLabel: pool.Name, }) pdb.OwnerReferences = []metav1.OwnerReference{ *metav1.NewControllerRef(t, schema.GroupVersionKind{ From ff7aef1754b7024abd0c1a4f82299fa9a2c42a86 Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Tue, 18 Jul 2023 14:22:08 +0800 Subject: [PATCH 26/32] suggest --- pkg/controller/pdb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index bf2c8fa1181..e0aeaa0a982 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -260,7 +260,7 @@ func (c *Controller) GetPDBAvailable() PDBAvailable { } else if globalPDBAvailable.v1beta { klog.Infof("PodDisruptionBudget: v1beta") } else { - klog.Infof("PodDisruptionBudget: unsupport") + klog.Infof("PodDisruptionBudget: not supported") } }() resouces, _ := c.kubeClientSet.Discovery().ServerPreferredResources() From 05ba1180f96aa2eefb95a433870c55f713bc469e Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Tue, 18 Jul 2023 19:24:07 +0800 Subject: [PATCH 27/32] update serviceCount --- helm/operator/templates/cluster-role.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/helm/operator/templates/cluster-role.yaml b/helm/operator/templates/cluster-role.yaml index 0b81deff385..9c425470c12 100644 --- a/helm/operator/templates/cluster-role.yaml +++ b/helm/operator/templates/cluster-role.yaml @@ -164,3 +164,14 @@ rules: - get - update - create + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - create + - delete + - get + - list + - patch + - update \ No newline at end of file From f049a4c0b47b03ba805ba244886a48bffa048721 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Tue, 18 Jul 2023 19:41:01 +0800 Subject: [PATCH 28/32] update serviceCount --- resources/base/cluster-role.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/resources/base/cluster-role.yaml b/resources/base/cluster-role.yaml index bc3fee66b01..bb1a59d8a8d 100644 --- a/resources/base/cluster-role.yaml +++ b/resources/base/cluster-role.yaml @@ -163,3 +163,14 @@ rules: - get - update - create + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - create + - delete + - get + - list + - patch + - update From bcdfe1735b86b1e3024a312f8e1f5fb8bc4eeaa2 Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Wed, 19 Jul 2023 18:33:31 +0800 Subject: [PATCH 29/32] fix --- pkg/controller/pdb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index e0aeaa0a982..f19dc6db2fe 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -112,7 +112,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if !isCreate { // exist and as expected if pdb.Spec.MinAvailable != nil && pdb.Spec.MinAvailable.IntValue() == (int(pool.Servers/2)+1) { - return nil + continue } } // set filed we expected @@ -172,7 +172,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e if !isCreate { // exist and as expected if pdb.Spec.MinAvailable != nil && pdb.Spec.MinAvailable.IntValue() == (int(pool.Servers/2)+1) { - return nil + continue } } // set filed we expected From b9c2f30314a4847418223a4a8c81b24bac389603 Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Wed, 19 Jul 2023 18:34:32 +0800 Subject: [PATCH 30/32] fix --- pkg/controller/pdb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index f19dc6db2fe..539b7e1fa4c 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -90,7 +90,7 @@ func (c *Controller) CreateOrUpdatePDB(ctx context.Context, t *v2.Tenant) (err e return err } if existingStatefulSet.Status.ReadyReplicas != existingStatefulSet.Status.Replicas || existingStatefulSet.Status.Replicas == 0 { - return nil + continue } if t.Status.CurrentState != StatusInitialized { return nil From 290f4b8ae0b7a672afc20ca0bc40b5c1e9f95ee6 Mon Sep 17 00:00:00 2001 From: "guozhi.li" Date: Wed, 19 Jul 2023 18:45:22 +0800 Subject: [PATCH 31/32] fix --- pkg/controller/pdb.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/pkg/controller/pdb.go b/pkg/controller/pdb.go index 539b7e1fa4c..0e8a7e9d5b8 100644 --- a/pkg/controller/pdb.go +++ b/pkg/controller/pdb.go @@ -40,10 +40,8 @@ func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { return nil } if available.V1Available() { - err := c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).DeleteCollection(ctx, metav1.DeleteOptions{}, metav1.ListOptions{ - LabelSelector: metav1.SetAsLabelSelector(labels.Set{ - v2.TenantLabel: t.Name, - }).String(), + err = c.kubeClientSet.PolicyV1().PodDisruptionBudgets(t.Namespace).DeleteCollection(ctx, metav1.DeleteOptions{}, metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", v2.TenantLabel, t.Name), }) if err != nil { // don't exist @@ -56,9 +54,7 @@ func (c *Controller) DeletePDB(ctx context.Context, t *v2.Tenant) (err error) { } if available.V1BetaAvailable() { err := c.kubeClientSet.PolicyV1beta1().PodDisruptionBudgets(t.Namespace).DeleteCollection(ctx, metav1.DeleteOptions{}, metav1.ListOptions{ - LabelSelector: metav1.SetAsLabelSelector(labels.Set{ - v2.TenantLabel: t.Name, - }).String(), + LabelSelector: fmt.Sprintf("%s=%s", v2.TenantLabel, t.Name), }) if err != nil { // don't exist From 63d05c5abedecdba0614ebed571fdc13b3e08cae Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 19 Jul 2023 19:52:11 +0800 Subject: [PATCH 32/32] update serviceCount --- helm/operator/templates/cluster-role.yaml | 3 ++- resources/base/cluster-role.yaml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/helm/operator/templates/cluster-role.yaml b/helm/operator/templates/cluster-role.yaml index 9c425470c12..36c6e4d9f13 100644 --- a/helm/operator/templates/cluster-role.yaml +++ b/helm/operator/templates/cluster-role.yaml @@ -174,4 +174,5 @@ rules: - get - list - patch - - update \ No newline at end of file + - update + - deletecollection \ No newline at end of file diff --git a/resources/base/cluster-role.yaml b/resources/base/cluster-role.yaml index bb1a59d8a8d..22a8dcad694 100644 --- a/resources/base/cluster-role.yaml +++ b/resources/base/cluster-role.yaml @@ -174,3 +174,4 @@ rules: - list - patch - update + - deletecollection