From 3f35acf47c2dd75af2161d7f382e31a4300abc9f Mon Sep 17 00:00:00 2001 From: Anthony Landreth Date: Wed, 25 Oct 2023 10:47:49 -0400 Subject: [PATCH] Use force-conflicts instead of overwrite --- ...pport_export_2023-10-24-162950-0400.tar.gz | Bin 41381 -> 0 bytes docs/content/reference/pgo_backup.md | 12 ++-- docs/content/reference/pgo_restore.md | 4 ++ internal/cmd/backup.go | 22 ++++---- internal/cmd/restore.go | 30 ++++++++-- .../12--backup-with-force-conflicts.yaml | 43 ++++++++++++++ .../e2e/backup/12--backup-with-overwrite.yaml | 7 --- .../e2e/restore/31--force-conflicts.yaml | 53 ++++++++++++++++++ 8 files changed, 141 insertions(+), 30 deletions(-) delete mode 100644 crunchy_k8s_support_export_2023-10-24-162950-0400.tar.gz create mode 100644 testing/kuttl/e2e/backup/12--backup-with-force-conflicts.yaml delete mode 100644 testing/kuttl/e2e/backup/12--backup-with-overwrite.yaml create mode 100644 testing/kuttl/e2e/restore/31--force-conflicts.yaml diff --git a/crunchy_k8s_support_export_2023-10-24-162950-0400.tar.gz b/crunchy_k8s_support_export_2023-10-24-162950-0400.tar.gz deleted file mode 100644 index bc5485c343310123f1fa48ac704b8f038b3a5fa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41381 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 diff --git a/docs/content/reference/pgo_backup.md b/docs/content/reference/pgo_backup.md index d5f3c2ca..35a71068 100644 --- a/docs/content/reference/pgo_backup.md +++ b/docs/content/reference/pgo_backup.md @@ -7,9 +7,9 @@ Backup cluster ### Synopsis -Backup allows you to take a backup of a PostgreSQL cluster, either using -the current "spec.backups.pgbackrest.manual" settings on the PostgreSQL cluster -or by overwriting those settings using the flags +Backup allows you to take a backup of a PostgreSQL cluster, using +the current "spec.backups.pgbackrest.manual" settings on the PostgreSQL cluster. +Overwriting those settings requires the --force-conflicts flag. #### RBAC Requirements Resources Verbs @@ -31,16 +31,16 @@ pgo backup CLUSTER_NAME [flags] # on the 'hippo' postgrescluster and trigger a backup pgo backup hippo --repoName="repo1" --options="--type=full" - # When receiving an ownership conflict message - pgo backup hippo --overwrite + # Resolve ownership conflict + pgo backup hippo --force-conflicts ``` ### Options ``` + --force-conflicts take ownership and overwrite the backup annotation -h, --help help for backup --options stringArray options for taking a backup; can be used multiple times - --overwrite overwrite the backup annotation --repoName string repoName to backup to ``` diff --git a/docs/content/reference/pgo_restore.md b/docs/content/reference/pgo_restore.md index 6b109899..e7935382 100644 --- a/docs/content/reference/pgo_restore.md +++ b/docs/content/reference/pgo_restore.md @@ -26,11 +26,15 @@ pgo restore CLUSTER_NAME [flags] # Restore the 'hippo' cluster to a specific point in time pgo restore hippo --repoName repo1 --options '--type=time --target="2021-06-09 14:15:11-04"' + + # Resolve ownership conflict + pgo restore hippo --force-conflicts ``` ### Options ``` + --force-conflicts take ownership and overwrite the restore annotation -h, --help help for restore --options stringArray options to pass to the "pgbackrest restore" command; can be used multiple times --repoName string repository to restore from diff --git a/internal/cmd/backup.go b/internal/cmd/backup.go index 8bbbdac5..100ad01e 100644 --- a/internal/cmd/backup.go +++ b/internal/cmd/backup.go @@ -35,9 +35,9 @@ func newBackupCommand(config *internal.Config) *cobra.Command { cmdBackup := &cobra.Command{ Use: "backup CLUSTER_NAME", Short: "Backup cluster", - Long: `Backup allows you to take a backup of a PostgreSQL cluster, either using -the current "spec.backups.pgbackrest.manual" settings on the PostgreSQL cluster -or by overwriting those settings using the flags + Long: `Backup allows you to take a backup of a PostgreSQL cluster, using +the current "spec.backups.pgbackrest.manual" settings on the PostgreSQL cluster. +Overwriting those settings requires the --force-conflicts flag. #### RBAC Requirements Resources Verbs @@ -54,18 +54,18 @@ pgo backup hippo # on the 'hippo' postgrescluster and trigger a backup pgo backup hippo --repoName="repo1" --options="--type=full" -# When receiving an ownership conflict message -pgo backup hippo --overwrite +# Resolve ownership conflict +pgo backup hippo --force-conflicts `) // Limit the number of args, that is, only one cluster name cmdBackup.Args = cobra.ExactArgs(1) - // `backup` command accepts `repoName`, `overwrite` and `options` flags; + // `backup` command accepts `repoName`, `force-conflicts` and `options` flags; // multiple options flags can be used, with each becoming a new line // in the options array on the spec backup := pgBackRestBackup{} - cmdBackup.Flags().BoolVar(&backup.Overwrite, "overwrite", false, "overwrite the backup annotation") + cmdBackup.Flags().BoolVar(&backup.ForceConflicts, "force-conflicts", false, "take ownership and overwrite the backup annotation") cmdBackup.Flags().StringVar(&backup.RepoName, "repoName", "", "repoName to backup to") cmdBackup.Flags().StringArrayVar(&backup.Options, "options", []string{}, "options for taking a backup; can be used multiple times") @@ -112,7 +112,7 @@ pgo backup hippo --overwrite // Update the spec/annotate // TODO(benjaminjb): Would we want to allow a dry-run option here? patchOptions := metav1.PatchOptions{} - if backup.Overwrite { + if backup.ForceConflicts { b := true patchOptions.Force = &b } @@ -139,9 +139,9 @@ pgo backup hippo --overwrite } type pgBackRestBackup struct { - Options []string - RepoName string - Overwrite bool + Options []string + RepoName string + ForceConflicts bool } func (config pgBackRestBackup) modifyIntent( diff --git a/internal/cmd/restore.go b/internal/cmd/restore.go index 5a698a3a..2ad72ae0 100644 --- a/internal/cmd/restore.go +++ b/internal/cmd/restore.go @@ -47,6 +47,9 @@ pgo restore hippo --repoName repo1 # Restore the 'hippo' cluster to a specific point in time pgo restore hippo --repoName repo1 --options '--type=time --target="2021-06-09 14:15:11-04"' + +# Resolve ownership conflict +pgo restore hippo --force-conflicts `) restore := pgBackRestRestore{Config: config} @@ -57,6 +60,8 @@ pgo restore hippo --repoName repo1 --options '--type=time --target="2021-06-09 1 cmd.Flags().StringVar(&restore.RepoName, "repoName", "", "repository to restore from") + cmd.Flags().BoolVar(&restore.ForceConflicts, "force-conflicts", false, "take ownership and overwrite the restore annotation") + // Only one positional argument: the PostgresCluster name. cmd.Args = cobra.ExactArgs(1) @@ -104,8 +109,9 @@ This is recommended after your restore is complete. Running "pgo restore" will e type pgBackRestRestore struct { *internal.Config - Options []string - RepoName string + Options []string + RepoName string + ForceConflicts bool PostgresCluster string } @@ -153,14 +159,20 @@ func (config pgBackRestRestore) Run(ctx context.Context) error { if err != nil { return err } + patchOptions := metav1.PatchOptions{ + DryRun: []string{metav1.DryRunAll}, + } + + if config.ForceConflicts { + b := true + patchOptions.Force = &b + } // Perform a dry-run patch to understand what settings will be used should // the restore proceed. cluster, err = client.Namespace(namespace).Patch(ctx, config.PostgresCluster, types.ApplyPatchType, patch, - config.Patch.PatchOptions(metav1.PatchOptions{ - DryRun: []string{metav1.DryRunAll}, - })) + config.Patch.PatchOptions(patchOptions)) if err != nil { return err } @@ -176,10 +188,16 @@ func (config pgBackRestRestore) Run(ctx context.Context) error { return nil } + patchOptions = metav1.PatchOptions{} + if config.ForceConflicts { + b := true + patchOptions.Force = &b + } + // They agreed to continue. Send the patch again without dry-run. _, err = client.Namespace(namespace).Patch(ctx, config.PostgresCluster, types.ApplyPatchType, patch, - config.Patch.PatchOptions(metav1.PatchOptions{})) + config.Patch.PatchOptions(patchOptions)) if err == nil { fmt.Fprintf(config.Out, "%s/%s patched\n", diff --git a/testing/kuttl/e2e/backup/12--backup-with-force-conflicts.yaml b/testing/kuttl/e2e/backup/12--backup-with-force-conflicts.yaml new file mode 100644 index 00000000..76602e4b --- /dev/null +++ b/testing/kuttl/e2e/backup/12--backup-with-force-conflicts.yaml @@ -0,0 +1,43 @@ +--- +# The cluster should not have changed. +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: backup-cluster +spec: + backups: + pgbackrest: + manual: + options: + - --type=full + repoName: repo4 + +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: +- script: | + pgbackrest_backup_annotation() { + kubectl get --namespace "${NAMESPACE}" postgrescluster/backup-cluster \ + --output 'go-template={{ index .metadata.annotations "postgres-operator.crunchydata.com/pgbackrest-backup" }}' + } + + kubectl --namespace "${NAMESPACE}" annotate postgrescluster/backup-cluster \ + postgres-operator.crunchydata.com/pgbackrest-backup="$(date)" --overwrite || exit + + PRIOR=$(pgbackrest_backup_annotation) + RESULT=$(kubectl-pgo --namespace "${NAMESPACE}" backup backup-cluster --force-conflicts) + CURRENT=$(pgbackrest_backup_annotation) + + if [ "${CURRENT}" = "${PRIOR}" ]; then + printf 'Expected annotation to change, got %q' "${CURRENT}" + exit 1 + fi + + echo "RESULT from taking backup: ${RESULT}" + + if [[ -n $RESULT && "$RESULT" == "postgresclusters/backup-cluster backup initiated" ]]; then + exit 0 + fi + + exit 1 diff --git a/testing/kuttl/e2e/backup/12--backup-with-overwrite.yaml b/testing/kuttl/e2e/backup/12--backup-with-overwrite.yaml deleted file mode 100644 index c3c95bab..00000000 --- a/testing/kuttl/e2e/backup/12--backup-with-overwrite.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: -- script: | - kubectl annotate -n "${NAMESPACE}" postgrescluster backup-cluster postgres-operator.crunchydata.com/pgbackrest-backup="$(date)" --overwrite - # The --overwrite flag ensures that ownership of the annotation passes back to kubectl-pgo. - kubectl-pgo --namespace "${NAMESPACE}" backup backup-cluster --overwrite diff --git a/testing/kuttl/e2e/restore/31--force-conflicts.yaml b/testing/kuttl/e2e/restore/31--force-conflicts.yaml new file mode 100644 index 00000000..523ca3e8 --- /dev/null +++ b/testing/kuttl/e2e/restore/31--force-conflicts.yaml @@ -0,0 +1,53 @@ +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: restore-cluster +spec: + postgresVersion: 14 + instances: + - name: instance1 + dataVolumeClaimSpec: + accessModes: [ReadWriteOnce] + resources: { requests: { storage: 1Gi } } + backups: + pgbackrest: + repos: + - name: repo2 + volume: + volumeClaimSpec: + accessModes: [ReadWriteOnce] + resources: { requests: { storage: 1Gi } } + restore: + enabled: true + repoName: repo2 + options: + - --db-include=restore-cluster + +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: +- script: | + pgbackrest_restore_annotation() { + kubectl --namespace "${NAMESPACE}" get postgrescluster/restore-cluster \ + --output "jsonpath-as-json={.metadata.annotations['postgres-operator\.crunchydata\.com/pgbackrest-restore']}" + } + + kubectl --namespace "${NAMESPACE}" annotate postgrescluster/restore-cluster \ + postgres-operator.crunchydata.com/pgbackrest-restore="$(date)" --overwrite || exit + + + PRIOR=$(pgbackrest_restore_annotation) + # Running restore will update the annotation. + echo yes | kubectl-pgo --namespace="${NAMESPACE}" restore restore-cluster --options="--db-include=restore-cluster" --repoName="repo2" --force-conflicts + CURRENT=$(pgbackrest_restore_annotation) + + if [ "${CURRENT}" != "${PRIOR}" ]; then + exit 0 + fi + + printf 'Expected annotation to change, got PRIOR %q CURRENT %q' "${PRIOR}" "${CURRENT}" + echo "RESULT from taking restore: ${RESULT}" + + exit 1