@@ -18,6 +18,7 @@ import (
1818 "github.com/robfig/cron/v3"
1919 appsv1 "k8s.io/api/apps/v1"
2020 corev1 "k8s.io/api/core/v1"
21+ eventsv1 "k8s.io/api/events/v1"
2122 k8serrors "k8s.io/apimachinery/pkg/api/errors"
2223 "k8s.io/apimachinery/pkg/api/meta"
2324 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -36,6 +37,7 @@ import (
3637
3738 "github.com/percona/percona-server-mongodb-operator/clientcmd"
3839 api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
40+ k8sutils "github.com/percona/percona-server-mongodb-operator/pkg/k8s"
3941 "github.com/percona/percona-server-mongodb-operator/pkg/naming"
4042 "github.com/percona/percona-server-mongodb-operator/pkg/psmdb"
4143 "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/backup"
@@ -51,6 +53,19 @@ import (
5153 "github.com/percona/percona-server-mongodb-operator/pkg/version"
5254)
5355
56+ const eventRegardingNameIndex = "regarding.name"
57+
58+ func eventRegardingNameIndexer (o client.Object ) []string {
59+ evt , ok := o .(* eventsv1.Event )
60+ if ! ok {
61+ return nil
62+ }
63+ if evt .Regarding .Name == "" {
64+ return nil
65+ }
66+ return []string {evt .Regarding .Name }
67+ }
68+
5469// Add creates a new PerconaServerMongoDB Controller and adds it to the Manager. The Manager will set fields on the Controller
5570// and Start it when the Manager is Started.
5671func Add (mgr manager.Manager ) error {
@@ -59,6 +74,13 @@ func Add(mgr manager.Manager) error {
5974 return err
6075 }
6176
77+ // the volume resize logic lists PVC events through the cached client,
78+ // which requires the field to be indexed
79+ err = mgr .GetFieldIndexer ().IndexField (context .TODO (), & eventsv1.Event {}, eventRegardingNameIndex , eventRegardingNameIndexer )
80+ if err != nil {
81+ return errors .Wrapf (err , "index events by %s" , eventRegardingNameIndex )
82+ }
83+
6284 return add (mgr , r )
6385}
6486
@@ -81,22 +103,12 @@ func newReconciler(mgr manager.Manager) (reconcile.Reconciler, error) {
81103 return nil , errors .Wrap (err , "failed to get operator pod image" )
82104 }
83105
84- client , err := client .New (mgr .GetConfig (), client.Options {
85- Scheme : mgr .GetScheme (),
86- Cache : & client.CacheOptions {
87- DisableFor : []client.Object {& corev1.Node {}},
88- },
89- })
90- if err != nil {
91- return nil , errors .Wrap (err , "create client" )
92- }
93-
94106 secretProviders := []pkgSecret.Provider {
95107 new (vault.Provider ),
96108 }
97109
98110 return & ReconcilePerconaServerMongoDB {
99- client : client ,
111+ client : mgr . GetClient () ,
100112 scheme : mgr .GetScheme (),
101113 serverVersion : sv ,
102114 reconcileIn : getReconcileInterval (),
@@ -532,10 +544,8 @@ func (r *ReconcilePerconaServerMongoDB) reconcileReplset(ctx context.Context, cr
532544 return err
533545 }
534546 } else {
535- err := r .client .Delete (ctx , psmdb .NewStatefulSet (naming .ArbiterStatefulSetName (cr , replset ), cr .Namespace ))
536- if err != nil && ! k8serrors .IsNotFound (err ) {
537- err = errors .Errorf ("delete arbiter in replset %s: %v" , replset .Name , err )
538- return err
547+ if err := k8sutils .DeleteIfExists (ctx , r .client , psmdb .NewStatefulSet (naming .ArbiterStatefulSetName (cr , replset ), cr .Namespace )); err != nil {
548+ return errors .Wrapf (err , "failed to delete arbiter statefulset: %s" , naming .ArbiterStatefulSetName (cr , replset ))
539549 }
540550 }
541551
@@ -547,25 +557,21 @@ func (r *ReconcilePerconaServerMongoDB) reconcileReplset(ctx context.Context, cr
547557 return err
548558 }
549559 } else {
550- err := r .client .Delete (ctx , psmdb .NewStatefulSet (naming .NonVotingStatefulSetName (cr , replset ), cr .Namespace ))
551- if err != nil && ! k8serrors .IsNotFound (err ) {
552- err = errors .Errorf ("delete nonVoting statefulset %s: %v" , replset .Name , err )
553- return err
560+ if err := k8sutils .DeleteIfExists (ctx , r .client , psmdb .NewStatefulSet (naming .NonVotingStatefulSetName (cr , replset ), cr .Namespace )); err != nil {
561+ return errors .Wrapf (err , "failed to delete non voting statefulset: %s" , naming .NonVotingStatefulSetName (cr , replset ))
554562 }
555563 }
556564
557565 if replset .Hidden .Enabled {
558566 matchLabels = naming .HiddenLabels (cr , replset )
559567 _ , err := r .reconcileStatefulSet (ctx , cr , replset , matchLabels )
560568 if err != nil {
561- err = errors .Errorf ("reconcile nonVoting StatefulSet for %s: %v" , replset .Name , err )
569+ err = errors .Errorf ("reconcile hidden StatefulSet for %s: %v" , replset .Name , err )
562570 return err
563571 }
564572 } else {
565- err := r .client .Delete (ctx , psmdb .NewStatefulSet (naming .HiddenStatefulSetName (cr , replset ), cr .Namespace ))
566- if err != nil && ! k8serrors .IsNotFound (err ) {
567- err = errors .Errorf ("delete hidden statefulset %s: %v" , replset .Name , err )
568- return err
573+ if err := k8sutils .DeleteIfExists (ctx , r .client , psmdb .NewStatefulSet (naming .HiddenStatefulSetName (cr , replset ), cr .Namespace )); err != nil {
574+ return errors .Wrapf (err , "failed to delete hidden statefulset: %s" , naming .HiddenStatefulSetName (cr , replset ))
569575 }
570576 }
571577
@@ -1062,24 +1068,18 @@ func (r *ReconcilePerconaServerMongoDB) deleteCfgIfNeeded(ctx context.Context, c
10621068
10631069 sfsName := cr .Name + "-" + api .ConfigReplSetName
10641070 sfs := psmdb .NewStatefulSet (sfsName , cr .Namespace )
1065-
1066- if err := r .client .Delete (ctx , sfs ); err != nil && ! k8serrors .IsNotFound (err ) {
1071+ if err := k8sutils .DeleteIfExists (ctx , r .client , sfs ); err != nil {
10671072 return errors .Wrapf (err , "failed to delete sfs: %s" , sfs .Name )
10681073 }
10691074
1070- svc := corev1.Service {}
1071- err = r .client .Get (ctx , types.NamespacedName {Name : cr .Name + "-" + api .ConfigReplSetName , Namespace : cr .Namespace }, & svc )
1072- if err != nil && ! k8serrors .IsNotFound (err ) {
1073- return errors .Wrap (err , "failed to get config service" )
1074- }
1075-
1076- if k8serrors .IsNotFound (err ) {
1077- return nil
1075+ svc := corev1.Service {
1076+ ObjectMeta : metav1.ObjectMeta {
1077+ Name : cr .Name + "-" + api .ConfigReplSetName ,
1078+ Namespace : cr .Namespace ,
1079+ },
10781080 }
1079-
1080- err = r .client .Delete (ctx , & svc )
1081- if err != nil {
1082- return errors .Wrap (err , "failed to delete config service" )
1081+ if err := k8sutils .DeleteIfExists (ctx , r .client , & svc ); err != nil {
1082+ return errors .Wrapf (err , "failed to delete config service: %s" , svc .Name )
10831083 }
10841084
10851085 return nil
@@ -1117,15 +1117,6 @@ func (r *ReconcilePerconaServerMongoDB) upgradeFCVIfNeeded(ctx context.Context,
11171117 return errors .Wrap (err , "failed to set FCV" )
11181118}
11191119
1120- func (r * ReconcilePerconaServerMongoDB ) deleteMongos (ctx context.Context , cr * api.PerconaServerMongoDB ) error {
1121- err := r .client .Delete (ctx , psmdb .MongosStatefulset (cr ))
1122- if err != nil && ! k8serrors .IsNotFound (err ) {
1123- return errors .Wrap (err , "failed to delete mongos statefulset" )
1124- }
1125-
1126- return nil
1127- }
1128-
11291120func (r * ReconcilePerconaServerMongoDB ) deleteMongosIfNeeded (ctx context.Context , cr * api.PerconaServerMongoDB ) error {
11301121 if cr .Spec .Sharding .Enabled {
11311122 return nil
@@ -1152,7 +1143,10 @@ func (r *ReconcilePerconaServerMongoDB) deleteMongosIfNeeded(ctx context.Context
11521143 }
11531144 }
11541145
1155- return r .deleteMongos (ctx , cr )
1146+ if err := k8sutils .DeleteIfExists (ctx , r .client , psmdb .MongosStatefulset (cr )); err != nil {
1147+ return errors .Wrap (err , "failed to delete mongos statefulset" )
1148+ }
1149+ return nil
11561150}
11571151
11581152func (r * ReconcilePerconaServerMongoDB ) reconcileMongodConfigMaps (ctx context.Context , cr * api.PerconaServerMongoDB , repls []* api.ReplsetSpec ) error {
0 commit comments