Skip to content

Commit 8c828d1

Browse files
authored
K8SPG-560: Create bootstrap restore object (#888)
* Create bootstrap restore object. * Update demand-backup test. * Cleanup * Update tests. * Update rbac. * Improve * Fix
1 parent 269e31b commit 8c828d1

File tree

11 files changed

+86
-6
lines changed

11 files changed

+86
-6
lines changed

config/rbac/cluster/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ rules:
163163
resources:
164164
- perconapgrestores
165165
verbs:
166+
- create
166167
- get
167168
- list
168169
- watch

config/rbac/namespace/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ rules:
163163
resources:
164164
- perconapgrestores
165165
verbs:
166+
- create
166167
- get
167168
- list
168169
- watch

deploy/bundle.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45581,6 +45581,7 @@ rules:
4558145581
resources:
4558245582
- perconapgrestores
4558345583
verbs:
45584+
- create
4558445585
- get
4558545586
- list
4558645587
- watch

deploy/cw-bundle.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45581,6 +45581,7 @@ rules:
4558145581
resources:
4558245582
- perconapgrestores
4558345583
verbs:
45584+
- create
4558445585
- get
4558545586
- list
4558645587
- watch

deploy/cw-rbac.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ rules:
167167
resources:
168168
- perconapgrestores
169169
verbs:
170+
- create
170171
- get
171172
- list
172173
- watch

deploy/rbac.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ rules:
167167
resources:
168168
- perconapgrestores
169169
verbs:
170+
- create
170171
- get
171172
- list
172173
- watch

e2e-tests/tests/start-from-backup/01-assert.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,14 @@ status:
107107
ready: 3
108108
size: 3
109109
state: ready
110+
---
111+
apiVersion: pgv2.percona.com/v2
112+
kind: PerconaPGRestore
113+
metadata:
114+
name: start-from-backup-bootstrap
115+
spec:
116+
pgCluster: start-from-backup
117+
repoName: repo1
118+
status:
119+
state: Succeeded
120+

percona/controller/pgcluster/controller.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ func (r *PGClusterReconciler) Reconcile(ctx context.Context, request reconcile.R
225225
return reconcile.Result{}, errors.Wrap(err, "reconcile backups")
226226
}
227227

228+
if err := r.createBootstrapRestoreObject(ctx, cr); err != nil {
229+
return reconcile.Result{}, errors.Wrap(err, "reconcile restore")
230+
}
231+
228232
if err := r.reconcilePMM(ctx, cr); err != nil {
229233
return reconcile.Result{}, errors.Wrap(err, "failed to add pmm sidecar")
230234
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package pgcluster
2+
3+
import (
4+
"context"
5+
6+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
9+
pNaming "github.com/percona/percona-postgresql-operator/percona/naming"
10+
v2 "github.com/percona/percona-postgresql-operator/pkg/apis/pgv2.percona.com/v2"
11+
)
12+
13+
// createBootstrapRestoreObject creates a PerconaPGRestore object for the bootstrap restore
14+
func (r *PGClusterReconciler) createBootstrapRestoreObject(ctx context.Context, cr *v2.PerconaPGCluster) error {
15+
if cr.Spec.DataSource == nil || (cr.Spec.DataSource.PGBackRest == nil &&
16+
cr.Spec.DataSource.PostgresCluster == nil &&
17+
cr.Spec.DataSource.Volumes == nil) {
18+
return nil
19+
}
20+
21+
pgrName := cr.Name + "-bootstrap"
22+
repoName := ""
23+
24+
if cr.Spec.DataSource.PGBackRest != nil {
25+
repoName = cr.Spec.DataSource.PGBackRest.Repo.Name
26+
}
27+
if cr.Spec.DataSource.PostgresCluster != nil {
28+
repoName = cr.Spec.DataSource.PostgresCluster.RepoName
29+
}
30+
31+
pgr := &v2.PerconaPGRestore{
32+
ObjectMeta: metav1.ObjectMeta{
33+
Name: pgrName,
34+
Namespace: cr.Namespace,
35+
Annotations: map[string]string{
36+
pNaming.AnnotationClusterBootstrapRestore: "true",
37+
},
38+
},
39+
Spec: v2.PerconaPGRestoreSpec{
40+
PGCluster: cr.Name,
41+
RepoName: repoName,
42+
},
43+
}
44+
45+
err := r.Client.Create(ctx, pgr)
46+
if err != nil && !k8serrors.IsAlreadyExists(err) {
47+
return err
48+
}
49+
50+
return nil
51+
}

percona/controller/pgrestore/controller.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/percona/percona-postgresql-operator/internal/logging"
1919
"github.com/percona/percona-postgresql-operator/internal/naming"
2020
"github.com/percona/percona-postgresql-operator/percona/controller"
21+
pNaming "github.com/percona/percona-postgresql-operator/percona/naming"
2122
v2 "github.com/percona/percona-postgresql-operator/pkg/apis/pgv2.percona.com/v2"
2223
"github.com/percona/percona-postgresql-operator/pkg/apis/postgres-operator.crunchydata.com/v1beta1"
2324
)
@@ -40,7 +41,7 @@ func (r *PGRestoreReconciler) SetupWithManager(mgr manager.Manager) error {
4041
return builder.ControllerManagedBy(mgr).For(&v2.PerconaPGRestore{}).Complete(r)
4142
}
4243

43-
// +kubebuilder:rbac:groups=pgv2.percona.com,resources=perconapgrestores,verbs=get;list;watch
44+
// +kubebuilder:rbac:groups=pgv2.percona.com,resources=perconapgrestores,verbs=get;list;watch;create
4445
// +kubebuilder:rbac:groups=pgv2.percona.com,resources=perconapgrestores/status,verbs=patch;update
4546
// +kubebuilder:rbac:groups=pgv2.percona.com,resources=perconapgclusters,verbs=get;list;create;update;patch;watch
4647
// +kubebuilder:rbac:groups=postgres-operator.crunchydata.com,resources=postgresclusters,verbs=get;list;create;update;patch;watch
@@ -82,11 +83,12 @@ func (r *PGRestoreReconciler) Reconcile(ctx context.Context, request reconcile.R
8283
return reconcile.Result{}, errors.Wrap(err, "update PGRestore status")
8384
}
8485

85-
if err := startRestore(ctx, r.Client, pgCluster, pgRestore); err != nil {
86-
return reconcile.Result{}, errors.Wrap(err, "start restore")
86+
if _, ok := pgRestore.Annotations[pNaming.AnnotationClusterBootstrapRestore]; !ok {
87+
if err := startRestore(ctx, r.Client, pgCluster, pgRestore); err != nil {
88+
return reconcile.Result{}, errors.Wrap(err, "start restore")
89+
}
8790
}
8891

89-
log.Info("Restore is starting")
9092
return reconcile.Result{}, nil
9193
case v2.RestoreStarting:
9294
job := &batchv1.Job{}
@@ -124,8 +126,10 @@ func (r *PGRestoreReconciler) Reconcile(ctx context.Context, request reconcile.R
124126
return reconcile.Result{RequeueAfter: time.Second * 5}, nil
125127
}
126128

127-
if err := disableRestore(ctx, r.Client, pgCluster); err != nil {
128-
return reconcile.Result{}, errors.Wrap(err, "disable restore")
129+
if _, ok := pgRestore.Annotations[pNaming.AnnotationClusterBootstrapRestore]; !ok {
130+
if err := disableRestore(ctx, r.Client, pgCluster); err != nil {
131+
return reconcile.Result{}, errors.Wrap(err, "disable restore")
132+
}
129133
}
130134

131135
// Don't add code after the status update.

0 commit comments

Comments
 (0)