Skip to content

Commit 2a6bf06

Browse files
egeguneseleo007
authored andcommitted
K8SPSMDB-1274: Disable balancer before restore
1 parent afb9dbe commit 2a6bf06

File tree

8 files changed

+143
-89
lines changed

8 files changed

+143
-89
lines changed

e2e-tests/balancer/run

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,13 @@ check_backup_and_restore() {
5252

5353
log "running restore: restore-${backup_name}"
5454
run_restore "${backup_name}"
55-
log "checking if balancer status is not changed"
56-
check_balancer ${cluster} "${balancer_end_state}" 4
5755

58-
wait_restore ${backup_name} ${cluster} "ready"
56+
wait_restore ${backup_name} ${cluster} "requested" 0
57+
58+
log "checking if balancer is disabled"
59+
check_balancer ${cluster} "false"
60+
61+
wait_restore ${backup_name} ${cluster} "ready" 1
5962

6063
log "checking if balancer is ${balancer_end_state} after restore"
6164
check_balancer ${cluster} ${balancer_end_state} 10

pkg/controller/perconaservermongodb/connections.go

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55

66
"github.com/pkg/errors"
77
corev1 "k8s.io/api/core/v1"
8-
"sigs.k8s.io/controller-runtime/pkg/client"
98

109
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
1110
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb"
@@ -20,42 +19,11 @@ type MongoClientProvider interface {
2019

2120
func (r *ReconcilePerconaServerMongoDB) MongoClientProvider() MongoClientProvider {
2221
if r.mongoClientProvider == nil {
23-
return &mongoClientProvider{r.client}
22+
return &psmdb.MongoClientProvider{K8sClient: r.client}
2423
}
2524
return r.mongoClientProvider
2625
}
2726

28-
type mongoClientProvider struct {
29-
k8sclient client.Client
30-
}
31-
32-
func (p *mongoClientProvider) Mongo(ctx context.Context, cr *api.PerconaServerMongoDB, rs *api.ReplsetSpec, role api.SystemUserRole) (mongo.Client, error) {
33-
c, err := getInternalCredentials(ctx, p.k8sclient, cr, role)
34-
if err != nil {
35-
return nil, errors.Wrap(err, "failed to get credentials")
36-
}
37-
38-
return psmdb.MongoClient(ctx, p.k8sclient, cr, rs, c)
39-
}
40-
41-
func (p *mongoClientProvider) Mongos(ctx context.Context, cr *api.PerconaServerMongoDB, role api.SystemUserRole) (mongo.Client, error) {
42-
c, err := getInternalCredentials(ctx, p.k8sclient, cr, role)
43-
if err != nil {
44-
return nil, errors.Wrap(err, "failed to get credentials")
45-
}
46-
47-
return psmdb.MongosClient(ctx, p.k8sclient, cr, c)
48-
}
49-
50-
func (p *mongoClientProvider) Standalone(ctx context.Context, cr *api.PerconaServerMongoDB, role api.SystemUserRole, host string, tlsEnabled bool) (mongo.Client, error) {
51-
c, err := getInternalCredentials(ctx, p.k8sclient, cr, role)
52-
if err != nil {
53-
return nil, errors.Wrap(err, "failed to get credentials")
54-
}
55-
56-
return psmdb.StandaloneClient(ctx, p.k8sclient, cr, c, host, tlsEnabled)
57-
}
58-
5927
func (r *ReconcilePerconaServerMongoDB) mongoClientWithRole(ctx context.Context, cr *api.PerconaServerMongoDB, rs *api.ReplsetSpec, role api.SystemUserRole) (mongo.Client, error) {
6028
return r.MongoClientProvider().Mongo(ctx, cr, rs, role)
6129
}

pkg/controller/perconaservermongodb/mgo.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ func (r *ReconcilePerconaServerMongoDB) handleReplsetInit(ctx context.Context, c
713713
time.Sleep(time.Second * 5)
714714

715715
log.Info("creating user admin", "replset", replsetName, "pod", pod.Name, "user", api.RoleUserAdmin)
716-
userAdmin, err := getInternalCredentials(ctx, r.client, cr, api.RoleUserAdmin)
716+
userAdmin, err := psmdb.GetInternalCredentials(ctx, r.client, cr, api.RoleUserAdmin)
717717
if err != nil {
718718
return nil, nil, errors.Wrap(err, "failed to get userAdmin credentials")
719719
}
@@ -983,7 +983,7 @@ func (r *ReconcilePerconaServerMongoDB) createOrUpdateSystemUsers(ctx context.Co
983983
}
984984

985985
for _, role := range users {
986-
creds, err := getInternalCredentials(ctx, r.client, cr, role)
986+
creds, err := psmdb.GetInternalCredentials(ctx, r.client, cr, role)
987987
if err != nil {
988988
log.Error(err, "failed to get credentials", "role", role)
989989
continue

pkg/controller/perconaservermongodb/secrets.go

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -10,58 +10,12 @@ import (
1010
k8serrors "k8s.io/apimachinery/pkg/api/errors"
1111
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1212
"k8s.io/apimachinery/pkg/types"
13-
"sigs.k8s.io/controller-runtime/pkg/client"
1413

1514
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
1615
"github.com/percona/percona-server-mongodb-operator/pkg/naming"
17-
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb"
1816
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/secret"
1917
)
2018

21-
func getUserSecret(ctx context.Context, cl client.Reader, cr *api.PerconaServerMongoDB, name string) (corev1.Secret, error) {
22-
secrets := corev1.Secret{}
23-
err := cl.Get(ctx, types.NamespacedName{Name: name, Namespace: cr.Namespace}, &secrets)
24-
return secrets, errors.Wrap(err, "get user secrets")
25-
}
26-
27-
func getInternalCredentials(ctx context.Context, cl client.Reader, cr *api.PerconaServerMongoDB, role api.SystemUserRole) (psmdb.Credentials, error) {
28-
return getCredentials(ctx, cl, cr, api.UserSecretName(cr), role)
29-
}
30-
31-
func getCredentials(ctx context.Context, cl client.Reader, cr *api.PerconaServerMongoDB, name string, role api.SystemUserRole) (psmdb.Credentials, error) {
32-
creds := psmdb.Credentials{}
33-
usersSecret, err := getUserSecret(ctx, cl, cr, name)
34-
if err != nil {
35-
return creds, errors.Wrap(err, "failed to get user secret")
36-
}
37-
38-
switch role {
39-
case api.RoleDatabaseAdmin:
40-
creds.Username = string(usersSecret.Data[api.EnvMongoDBDatabaseAdminUser])
41-
creds.Password = string(usersSecret.Data[api.EnvMongoDBDatabaseAdminPassword])
42-
case api.RoleClusterAdmin:
43-
creds.Username = string(usersSecret.Data[api.EnvMongoDBClusterAdminUser])
44-
creds.Password = string(usersSecret.Data[api.EnvMongoDBClusterAdminPassword])
45-
case api.RoleUserAdmin:
46-
creds.Username = string(usersSecret.Data[api.EnvMongoDBUserAdminUser])
47-
creds.Password = string(usersSecret.Data[api.EnvMongoDBUserAdminPassword])
48-
case api.RoleClusterMonitor:
49-
creds.Username = string(usersSecret.Data[api.EnvMongoDBClusterMonitorUser])
50-
creds.Password = string(usersSecret.Data[api.EnvMongoDBClusterMonitorPassword])
51-
case api.RoleBackup:
52-
creds.Username = string(usersSecret.Data[api.EnvMongoDBBackupUser])
53-
creds.Password = string(usersSecret.Data[api.EnvMongoDBBackupPassword])
54-
default:
55-
return creds, errors.Errorf("not implemented for role: %s", role)
56-
}
57-
58-
if creds.Username == "" || creds.Password == "" {
59-
return creds, errors.Errorf("can't find credentials for role %s", role)
60-
}
61-
62-
return creds, nil
63-
}
64-
6519
func (r *ReconcilePerconaServerMongoDB) reconcileUsersSecret(ctx context.Context, cr *api.PerconaServerMongoDB) error {
6620
secretObj := corev1.Secret{}
6721
err := r.client.Get(ctx,

pkg/controller/perconaservermongodbrestore/perconaservermongodbrestore_controller.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,23 @@ func (r *ReconcilePerconaServerMongoDBRestore) Reconcile(ctx context.Context, re
187187
}
188188

189189
if err == nil {
190+
provider := psmdb.NewClientProvider(r.client)
191+
mongos, err := provider.Mongos(ctx, cluster, psmdbv1.RoleClusterAdmin)
192+
if err != nil {
193+
return rr, errors.Wrap(err, "get mongos session")
194+
}
195+
defer func() {
196+
err := mongos.Disconnect(ctx)
197+
if err != nil {
198+
log.Error(err, "disconnect from mongos")
199+
}
200+
}()
201+
202+
log.Info("Stopping balancer")
203+
if err := mongos.StopBalancer(ctx); err != nil {
204+
return rr, errors.Wrap(err, "stop balancer")
205+
}
206+
190207
log.Info("Terminating mongos pods")
191208
err = r.client.Delete(ctx, psmdb.MongosStatefulset(cluster))
192209
if err != nil && !k8serrors.IsNotFound(err) {
@@ -195,6 +212,16 @@ func (r *ReconcilePerconaServerMongoDBRestore) Reconcile(ctx context.Context, re
195212

196213
return rr, nil
197214
}
215+
216+
mongosPods, err := psmdb.GetMongosPods(ctx, r.client, cluster)
217+
if err != nil {
218+
return rr, errors.Wrap(err, "get mongos pods")
219+
}
220+
221+
if len(mongosPods.Items) > 0 {
222+
log.Info("Waiting for mongos pods to terminate")
223+
return rr, nil
224+
}
198225
}
199226

200227
err = r.validate(ctx, cr, cluster)

pkg/psmdb/client.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ import (
1111
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/tls"
1212
)
1313

14-
type Credentials struct {
15-
Username string
16-
Password string
17-
}
18-
1914
func MongoClient(ctx context.Context, k8sclient client.Client, cr *api.PerconaServerMongoDB, rs *api.ReplsetSpec, c Credentials) (mongo.Client, error) {
2015
pods, err := GetRSPods(ctx, k8sclient, cr, rs.Name)
2116
if err != nil {

pkg/psmdb/connections.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package psmdb
2+
3+
import (
4+
"context"
5+
6+
"github.com/pkg/errors"
7+
"sigs.k8s.io/controller-runtime/pkg/client"
8+
9+
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
10+
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/mongo"
11+
)
12+
13+
type MongoClientProvider struct {
14+
K8sClient client.Client
15+
}
16+
17+
func NewClientProvider(k8sclient client.Client) *MongoClientProvider {
18+
return &MongoClientProvider{k8sclient}
19+
}
20+
21+
func (p *MongoClientProvider) Mongo(ctx context.Context, cr *api.PerconaServerMongoDB, rs *api.ReplsetSpec, role api.SystemUserRole) (mongo.Client, error) {
22+
c, err := GetInternalCredentials(ctx, p.K8sClient, cr, role)
23+
if err != nil {
24+
return nil, errors.Wrap(err, "failed to get credentials")
25+
}
26+
27+
return MongoClient(ctx, p.K8sClient, cr, rs, c)
28+
}
29+
30+
func (p *MongoClientProvider) Mongos(ctx context.Context, cr *api.PerconaServerMongoDB, role api.SystemUserRole) (mongo.Client, error) {
31+
c, err := GetInternalCredentials(ctx, p.K8sClient, cr, role)
32+
if err != nil {
33+
return nil, errors.Wrap(err, "failed to get credentials")
34+
}
35+
36+
return MongosClient(ctx, p.K8sClient, cr, c)
37+
}
38+
39+
func (p *MongoClientProvider) Standalone(ctx context.Context, cr *api.PerconaServerMongoDB, role api.SystemUserRole, host string, tlsEnabled bool) (mongo.Client, error) {
40+
c, err := GetInternalCredentials(ctx, p.K8sClient, cr, role)
41+
if err != nil {
42+
return nil, errors.Wrap(err, "failed to get credentials")
43+
}
44+
45+
return StandaloneClient(ctx, p.K8sClient, cr, c, host, tlsEnabled)
46+
}

pkg/psmdb/credentials.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package psmdb
2+
3+
import (
4+
"context"
5+
6+
"github.com/pkg/errors"
7+
corev1 "k8s.io/api/core/v1"
8+
"k8s.io/apimachinery/pkg/types"
9+
"sigs.k8s.io/controller-runtime/pkg/client"
10+
11+
psmdbv1 "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
12+
)
13+
14+
type Credentials struct {
15+
Username string
16+
Password string
17+
}
18+
19+
func GetUserSecret(ctx context.Context, cl client.Reader, cr *psmdbv1.PerconaServerMongoDB, name string) (corev1.Secret, error) {
20+
secrets := corev1.Secret{}
21+
err := cl.Get(ctx, types.NamespacedName{Name: name, Namespace: cr.Namespace}, &secrets)
22+
return secrets, errors.Wrap(err, "get user secrets")
23+
}
24+
25+
func GetCredentials(ctx context.Context, cl client.Reader, cr *psmdbv1.PerconaServerMongoDB, name string, role psmdbv1.SystemUserRole) (Credentials, error) {
26+
creds := Credentials{}
27+
usersSecret, err := GetUserSecret(ctx, cl, cr, name)
28+
if err != nil {
29+
return creds, errors.Wrap(err, "failed to get user secret")
30+
}
31+
32+
switch role {
33+
case psmdbv1.RoleDatabaseAdmin:
34+
creds.Username = string(usersSecret.Data[psmdbv1.EnvMongoDBDatabaseAdminUser])
35+
creds.Password = string(usersSecret.Data[psmdbv1.EnvMongoDBDatabaseAdminPassword])
36+
case psmdbv1.RoleClusterAdmin:
37+
creds.Username = string(usersSecret.Data[psmdbv1.EnvMongoDBClusterAdminUser])
38+
creds.Password = string(usersSecret.Data[psmdbv1.EnvMongoDBClusterAdminPassword])
39+
case psmdbv1.RoleUserAdmin:
40+
creds.Username = string(usersSecret.Data[psmdbv1.EnvMongoDBUserAdminUser])
41+
creds.Password = string(usersSecret.Data[psmdbv1.EnvMongoDBUserAdminPassword])
42+
case psmdbv1.RoleClusterMonitor:
43+
creds.Username = string(usersSecret.Data[psmdbv1.EnvMongoDBClusterMonitorUser])
44+
creds.Password = string(usersSecret.Data[psmdbv1.EnvMongoDBClusterMonitorPassword])
45+
case psmdbv1.RoleBackup:
46+
creds.Username = string(usersSecret.Data[psmdbv1.EnvMongoDBBackupUser])
47+
creds.Password = string(usersSecret.Data[psmdbv1.EnvMongoDBBackupPassword])
48+
default:
49+
return creds, errors.Errorf("not implemented for role: %s", role)
50+
}
51+
52+
if creds.Username == "" || creds.Password == "" {
53+
return creds, errors.Errorf("can't find credentials for role %s", role)
54+
}
55+
56+
return creds, nil
57+
}
58+
59+
func GetInternalCredentials(ctx context.Context, cl client.Reader, cr *psmdbv1.PerconaServerMongoDB, role psmdbv1.SystemUserRole) (Credentials, error) {
60+
return GetCredentials(ctx, cl, cr, psmdbv1.UserSecretName(cr), role)
61+
}

0 commit comments

Comments
 (0)