Skip to content

Commit

Permalink
Abstract away generic test steps.
Browse files Browse the repository at this point in the history
  • Loading branch information
Gerrit91 committed Aug 25, 2023
1 parent 73773df commit 7b7f256
Show file tree
Hide file tree
Showing 3 changed files with 312 additions and 276 deletions.
104 changes: 52 additions & 52 deletions deploy/rethinkdb-local.yaml
Original file line number Diff line number Diff line change
@@ -1,52 +1,5 @@
# DO NOT EDIT! This is auto-generated by the integration tests
---
data:
config.yaml: |
---
bind-addr: 0.0.0.0
db: rethinkdb
db-data-directory: /data/rethinkdb/
backup-provider: local
rethinkdb-passwordfile: /rethinkdb-secret/rethinkdb-password.txt
backup-cron-schedule: "*/1 * * * *"
object-prefix: rethinkdb-test
post-exec-cmds:
# IMPORTANT: the --directory needs to point to the exact sidecar data dir, otherwise the database will be restored to the wrong location
- rethinkdb --bind all --directory /data/rethinkdb --initial-password ${RETHINKDB_PASSWORD}
metadata:
creationTimestamp: null
name: backup-restore-sidecar-config-rethinkdb
namespace: test-rethinkdb
---
metadata:
creationTimestamp: null
name: rethinkdb
namespace: test-rethinkdb
stringData:
rethinkdb-password: test123!
---
metadata:
creationTimestamp: null
labels:
app: rethinkdb
name: rethinkdb
namespace: test-rethinkdb
spec:
ports:
- name: "10080"
port: 10080
targetPort: 10080
- name: "28015"
port: 28015
targetPort: 28015
- name: metrics
port: 2112
targetPort: 2112
selector:
app: rethinkdb
status:
loadBalancer: {}
---
metadata:
creationTimestamp: null
labels:
Expand Down Expand Up @@ -83,7 +36,7 @@ spec:
resources: {}
volumeMounts:
- mountPath: /data
name: rethinkdb
name: data
- mountPath: /usr/local/bin/backup-restore-sidecar
name: bin-provision
subPath: backup-restore-sidecar
Expand All @@ -103,7 +56,7 @@ spec:
- mountPath: /backup
name: backup
- mountPath: /data
name: rethinkdb
name: data
- mountPath: /rethinkdb-secret
name: rethinkdb-credentials
- mountPath: /etc/backup-restore-sidecar
Expand Down Expand Up @@ -132,9 +85,9 @@ spec:
- mountPath: /bin-provision
name: bin-provision
volumes:
- name: rethinkdb
- name: data
persistentVolumeClaim:
claimName: rethinkdb
claimName: data
- name: backup
persistentVolumeClaim:
claimName: backup
Expand All @@ -153,7 +106,7 @@ spec:
volumeClaimTemplates:
- metadata:
creationTimestamp: null
name: rethinkdb
name: data
spec:
accessModes:
- ReadWriteOnce
Expand All @@ -174,3 +127,50 @@ spec:
status:
availableReplicas: 0
replicas: 0
---
data:
config.yaml: |
---
bind-addr: 0.0.0.0
db: rethinkdb
db-data-directory: /data/rethinkdb/
backup-provider: local
rethinkdb-passwordfile: /rethinkdb-secret/rethinkdb-password.txt
backup-cron-schedule: "*/1 * * * *"
object-prefix: rethinkdb-test
post-exec-cmds:
# IMPORTANT: the --directory needs to point to the exact sidecar data dir, otherwise the database will be restored to the wrong location
- rethinkdb --bind all --directory /data/rethinkdb --initial-password ${RETHINKDB_PASSWORD}
metadata:
creationTimestamp: null
name: backup-restore-sidecar-config-rethinkdb
namespace: test-rethinkdb
---
metadata:
creationTimestamp: null
name: rethinkdb
namespace: test-rethinkdb
stringData:
rethinkdb-password: test123!
---
metadata:
creationTimestamp: null
labels:
app: rethinkdb
name: rethinkdb
namespace: test-rethinkdb
spec:
ports:
- name: "10080"
port: 10080
targetPort: 10080
- name: "28015"
port: 28015
targetPort: 28015
- name: metrics
port: 2112
targetPort: 2112
selector:
app: rethinkdb
status:
loadBalancer: {}
121 changes: 121 additions & 0 deletions integration/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ import (
"runtime"
"strings"
"testing"
"time"

"github.com/avast/retry-go/v4"
v1 "github.com/metal-stack/backup-restore-sidecar/api/v1"
brsclient "github.com/metal-stack/backup-restore-sidecar/pkg/client"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/config"
Expand Down Expand Up @@ -159,3 +163,120 @@ func waitUntilNotFound(ctx context.Context, obj client.Object) error {
return fmt.Errorf("resource is still running: %s", obj.GetName())
}, retry.Context(ctx), retry.Attempts(0))
}

type flowSpec struct {
databaseType string
sts func(namespace string) *appsv1.StatefulSet
backingResources func(namespace string) []client.Object
addTestData func(t *testing.T, ctx context.Context)
verifyTestData func(t *testing.T, ctx context.Context)
}

func restoreFlow(t *testing.T, spec *flowSpec) {
var (
ctx, cancel = context.WithTimeout(context.Background(), 10*time.Minute)
ns = testNamespace(t)
)

defer cancel()

cleanup := func() {
t.Log("running cleanup")

err := c.Delete(ctx, ns)
require.NoError(t, client.IgnoreNotFound(err), "cleanup did not succeed")

err = waitUntilNotFound(ctx, &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: ns.Name,
},
})
require.NoError(t, err, "cleanup did not succeed")
}
cleanup()
defer cleanup()

err := c.Create(ctx, ns)
require.NoError(t, client.IgnoreAlreadyExists(err))

t.Log("applying resource manifests")

objects := []client.Object{spec.sts(ns.Name)}
objects = append(objects, spec.backingResources(ns.Name)...)

dumpToExamples(t, "rethinkdb-local.yaml", objects...)

for _, o := range objects {
o := o
err = c.Create(ctx, o)
require.NoError(t, err)
}

podName := spec.sts(ns.Name).Name + "-0"

err = waitForPodRunnig(ctx, podName, ns.Name)
require.NoError(t, err)

t.Log("adding test data to database")

spec.addTestData(t, ctx)

t.Log("taking a backup")

brsc, err := brsclient.New(ctx, "http://localhost:8000")
require.NoError(t, err)

_, err = brsc.DatabaseServiceClient().CreateBackup(ctx, &v1.Empty{})
assert.NoError(t, err)

var backup *v1.Backup
err = retry.Do(func() error {
backups, err := brsc.BackupServiceClient().ListBackups(ctx, &v1.Empty{})
if err != nil {
return err
}

if len(backups.Backups) == 0 {
return fmt.Errorf("no backups were made yet")
}

backup = backups.Backups[0]

return nil
}, retry.Context(ctx), retry.Attempts(0), retry.MaxDelay(2*time.Second))
require.NoError(t, err)
require.NotNil(t, backup)

t.Log("remove sts and delete data volume")

err = c.Delete(ctx, spec.sts(ns.Name))
require.NoError(t, err)

err = c.Delete(ctx, &corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: "data-" + podName,
Namespace: ns.Name,
},
})
require.NoError(t, err)

err = waitUntilNotFound(ctx, &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Namespace: ns.Name,
},
})
require.NoError(t, err)

t.Log("recreate sts")

err = c.Create(ctx, spec.sts(ns.Name))
require.NoError(t, err)

err = waitForPodRunnig(ctx, podName, ns.Name)
require.NoError(t, err)

t.Log("verify that data gets restored")

spec.verifyTestData(t, ctx)
}
Loading

0 comments on commit 7b7f256

Please sign in to comment.