From 4b5fcfdde8a05c0102a4995c012f9cd6848c3e4f Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 25 Aug 2023 15:59:59 +0200 Subject: [PATCH] First pass!! --- .github/workflows/docker.yaml | 22 +++ Makefile | 3 +- cmd/internal/database/rethinkdb/rethinkdb.go | 102 +++++----- deploy/rethinkdb-test.yaml | 2 + go.mod | 16 +- go.sum | 34 ---- integration/main_test.go | 4 +- integration/port-forwarding_test.go | 98 --------- integration/rethinkdb_test.go | 198 +++++++------------ kind.yaml | 15 ++ 10 files changed, 173 insertions(+), 321 deletions(-) delete mode 100644 integration/port-forwarding_test.go create mode 100644 kind.yaml diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 148852a..b2ff6a2 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -57,3 +57,25 @@ jobs: context: . push: true tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.tag }} + + integration: + name: Integration Test + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Go 1.21 + uses: actions/setup-go@v4 + with: + go-version: '1.21.x' + + - name: Create k8s Kind Cluster + uses: helm/kind-action@v1.5.0 + with: + install_only: true + + - name: Test + run: | + make test diff --git a/Makefile b/Makefile index 8be7046..6beb97c 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ all: strip bin/backup-restore-sidecar .PHONY: test-integration -test-integration: +test-integration: dockerimage kind --name backup-restore-sidecar load docker-image ghcr.io/metal-stack/backup-restore-sidecar:latest KUBECONFIG=$(KUBECONFIG) go test -v -p 1 -timeout 10m ./integration/... @@ -71,6 +71,7 @@ kind-cluster-create: dockerimage @if ! kind get clusters | grep backup-restore-sidecar > /dev/null; then \ kind create cluster \ --name backup-restore-sidecar \ + --config kind.yaml \ --kubeconfig $(KUBECONFIG); fi .PHONY: cleanup diff --git a/cmd/internal/database/rethinkdb/rethinkdb.go b/cmd/internal/database/rethinkdb/rethinkdb.go index 3260776..cbdb3e2 100644 --- a/cmd/internal/database/rethinkdb/rethinkdb.go +++ b/cmd/internal/database/rethinkdb/rethinkdb.go @@ -3,7 +3,6 @@ package rethinkdb import ( "context" "fmt" - "net" "os" "os/exec" "path/filepath" @@ -17,12 +16,14 @@ import ( "github.com/metal-stack/backup-restore-sidecar/cmd/internal/utils" "github.com/metal-stack/backup-restore-sidecar/pkg/constants" "go.uber.org/zap" + "golang.org/x/sync/errgroup" + + r "gopkg.in/rethinkdb/rethinkdb-go.v6" ) const ( - connectionTimeout = 1 * time.Second - restoreDatabaseStartupTimeout = 30 * time.Second - restoreDatabaseShutdownTimeout = 10 * time.Second + connectionTimeout = 1 * time.Second + restoreDatabaseStartupTimeout = 30 * time.Second rethinkDBCmd = "rethinkdb" rethinkDBDumpCmd = "rethinkdb-dump" @@ -112,44 +113,45 @@ func (db *RethinkDB) Recover() error { return fmt.Errorf("restore file not present: %s", rethinkDBRestoreFilePath) } + passwordRaw, err := os.ReadFile(db.passwordFile) + if err != nil { + return fmt.Errorf("unable to read rethinkdb password file at %s: %w", db.passwordFile, err) + } + // rethinkdb requires to be running when restoring a backup. // however, if we let the real database container start, we cannot interrupt it anymore in case // an issue occurs during the restoration. therefore, we spin up an own instance of rethinkdb // inside the sidecar against which we can restore. - db.log.Infow("starting rethinkdb database within sidecar for restore") - //nolint - cmd := exec.Command(rethinkDBCmd, "--bind", "all", "--driver-port", "1", "--directory", db.datadir) - if err := cmd.Start(); err != nil { - return fmt.Errorf("unable to start database within sidecar for restore: %w", err) - } - defer func() { - _ = cmd.Process.Kill() - }() + var ( + cmd *exec.Cmd + g, _ = errgroup.WithContext(context.Background()) + ) - db.log.Infow("waiting for rethinkdb database to come up") + g.Go(func() error { + args := []string{"--bind", "all", "--driver-port", "1", "--directory", db.datadir, "--initial-password", strings.TrimSpace(string(passwordRaw))} + db.log.Infow("execute rethinkdb", "args", args) - restoreDB := New(db.ctx, db.log, db.datadir, "localhost:1", "") + cmd = exec.Command(rethinkDBCmd, args...) // nolint:gosec + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err := cmd.Run() + if err != nil { + return fmt.Errorf("unable to run rethinkdb: %w", err) + } + + db.log.Info("rethinkdb finished") - done := make(chan bool) - defer close(done) + return nil + }) + db.log.Infow("waiting for rethinkdb database to come up") probeCtx, probeCancel := context.WithTimeout(context.Background(), restoreDatabaseStartupTimeout) defer probeCancel() - - var err error - go func() { - err = probe.Start(probeCtx, restoreDB.log, restoreDB) - done <- true - }() - select { - case <-done: - if err != nil { - return fmt.Errorf("error while probing: %w", err) - } - db.log.Infow("rethinkdb in sidecar is now available, now triggering restore commands...") - case <-probeCtx.Done(): - return errors.New("rethinkdb database did not come up in time") + restoreDB := New(db.ctx, db.log, db.datadir, "localhost:1", db.passwordFile) + err = probe.Start(probeCtx, restoreDB.log, restoreDB) + if err != nil { + return fmt.Errorf("rethinkdb did not come up: %w", err) } args := []string{} @@ -166,20 +168,16 @@ func (db *RethinkDB) Recover() error { return fmt.Errorf("error running restore command: %s %w", out, err) } + db.log.Infow("successfully restored rethinkdb database", "output", out) + if err := cmd.Process.Signal(syscall.SIGTERM); err != nil { return fmt.Errorf("failed to send sigterm signal to rethinkdb: %w", err) } - wait := make(chan error) - go func() { wait <- cmd.Wait() }() - select { - case err := <-wait: - if err != nil { - return fmt.Errorf("rethinkdb did not shutdown cleanly: %w", err) - } - db.log.Infow("successfully restored rethinkdb database", "output", out) - case <-time.After(restoreDatabaseShutdownTimeout): - return fmt.Errorf("rethinkdb did not shutdown cleanly after %s", restoreDatabaseShutdownTimeout) + err = g.Wait() + if err != nil { + // sending a TERM signal will always result in a error response. + db.log.Errorw("importing dump terminated but reported an error which can be ignored", "error", err) } return nil @@ -187,11 +185,27 @@ func (db *RethinkDB) Recover() error { // Probe figures out if the database is running and available for taking backups. func (db *RethinkDB) Probe() error { - conn, err := net.DialTimeout("tcp", db.url, connectionTimeout) + passwordRaw, err := os.ReadFile(db.passwordFile) + if err != nil { + return fmt.Errorf("unable to read rethinkdb password file at %s: %w", db.passwordFile, err) + } + + session, err := r.Connect(r.ConnectOpts{ + Addresses: []string{db.url}, + Username: "admin", + Password: strings.TrimSpace(string(passwordRaw)), + MaxIdle: 10, + MaxOpen: 20, + }) + if err != nil { + return fmt.Errorf("cannot create rethinkdb client: %w", err) + } + + _, err = r.DB("rethinkdb").Table("server_status").Run(session) if err != nil { - return fmt.Errorf("connection error: %w", err) + return fmt.Errorf("error retrieving rethinkdb server status: %w", err) } - defer conn.Close() + return nil } diff --git a/deploy/rethinkdb-test.yaml b/deploy/rethinkdb-test.yaml index d613e6a..9289116 100644 --- a/deploy/rethinkdb-test.yaml +++ b/deploy/rethinkdb-test.yaml @@ -3,6 +3,7 @@ data: config.yaml: | --- + bind-addr: 0.0.0.0 db: rethinkdb db-data-directory: /data/rethinkdb/ backup-provider: local @@ -116,6 +117,7 @@ spec: - mountPath: /usr/local/bin/rethinkdb-restore name: bin-provision subPath: rethinkdb-restore + hostNetwork: true initContainers: - command: - cp diff --git a/go.mod b/go.mod index 381c83d..90a5d90 100644 --- a/go.mod +++ b/go.mod @@ -18,13 +18,13 @@ require ( github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.25.0 + golang.org/x/sync v0.3.0 google.golang.org/api v0.137.0 google.golang.org/grpc v1.57.0 google.golang.org/protobuf v1.31.0 gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.2 k8s.io/api v0.28.1 k8s.io/apimachinery v0.28.1 - k8s.io/cli-runtime v0.28.1 k8s.io/client-go v0.28.1 sigs.k8s.io/controller-runtime v0.16.0 sigs.k8s.io/yaml v1.3.0 @@ -41,10 +41,8 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-errors/errors v1.4.2 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -53,16 +51,13 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.1.2 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.5 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.16 // indirect @@ -72,21 +67,17 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/klauspost/pgzip v1.2.6 // indirect - github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moby/spdystream v0.2.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nwaples/rardecode v1.1.3 // indirect github.com/opentracing/opentracing-go v1.1.0 // indirect github.com/pelletier/go-toml/v2 v2.0.9 // indirect - github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.18 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -102,14 +93,11 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/ulikunitz/xz v0.5.11 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect - github.com/xlab/treeprint v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect - go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.12.0 // indirect golang.org/x/net v0.14.0 // indirect golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.11.0 // indirect golang.org/x/term v0.11.0 // indirect golang.org/x/text v0.12.0 // indirect @@ -128,7 +116,5 @@ require ( k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect - sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect ) diff --git a/go.sum b/go.sum index 158de38..5cec748 100644 --- a/go.sum +++ b/go.sum @@ -54,8 +54,6 @@ github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/avast/retry-go/v4 v4.5.0 h1:QoRAZZ90cj5oni2Lsgl2GW8mNTnUCnmpx/iKpwVisHg= github.com/avast/retry-go/v4 v4.5.0/go.mod h1:7hLEXp0oku2Nir2xBAsg0PTphp9z71bN5Aq1fboC3+I= github.com/aws/aws-sdk-go v1.44.324 h1:/uja9PtgeeqrZCPOJTenjMLNpciIMuzaRKooq+erG4A= @@ -101,8 +99,6 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= @@ -111,8 +107,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -172,8 +166,6 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -213,8 +205,6 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.5 h1:8IYp3w9nysqv3JH+NJgXJzGbDHzLOTj43BmSkp+O7qg= github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -225,9 +215,6 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -275,8 +262,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -294,15 +279,11 @@ github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Cl github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -324,8 +305,6 @@ github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsq github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= @@ -354,8 +333,6 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= @@ -396,8 +373,6 @@ github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= -github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -412,8 +387,6 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= @@ -582,7 +555,6 @@ golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= @@ -813,8 +785,6 @@ k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPON k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= k8s.io/apimachinery v0.28.1 h1:EJD40og3GizBSV3mkIoXQBsws32okPOy+MkRyzh6nPY= k8s.io/apimachinery v0.28.1/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw= -k8s.io/cli-runtime v0.28.1 h1:7Njc4eD5kaO4tYdSYVJJEs54koYD/vT6gxOq8dEVf9g= -k8s.io/cli-runtime v0.28.1/go.mod h1:yIThSWkAVLqeRs74CMkq6lNFW42GyJmvMtcNn01SZho= k8s.io/client-go v0.28.1 h1:pRhMzB8HyLfVwpngWKE8hDcXRqifh1ga2Z/PU9SXVK8= k8s.io/client-go v0.28.1/go.mod h1:pEZA3FqOsVkCc07pFVzK076R+P/eXqsgx5zuuRWukNE= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= @@ -830,10 +800,6 @@ sigs.k8s.io/controller-runtime v0.16.0 h1:5koYaaRVBHDr0LZAJjO5dWzUjMsh6cwa7q1Mmu sigs.k8s.io/controller-runtime v0.16.0/go.mod h1:77DnuwA8+J7AO0njzv3wbNlMOnGuLrwFr8JPNwx3J7g= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= -sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3/go.mod h1:9n16EZKMhXBNSiUC5kSdFQJkdH3zbxS/JoO619G1VAY= -sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM7vh3b7HvGNfXrJ/xL6BDMS0v1V/HHg5U= -sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/integration/main_test.go b/integration/main_test.go index ed1c362..33a1016 100644 --- a/integration/main_test.go +++ b/integration/main_test.go @@ -137,7 +137,7 @@ func waitForPodRunnig(ctx context.Context, name, namespace string) error { } return nil - }, retry.Context(ctx)) + }, retry.Context(ctx), retry.Attempts(0)) } func waitUntilNotFound(ctx context.Context, obj client.Object) error { @@ -151,5 +151,5 @@ func waitUntilNotFound(ctx context.Context, obj client.Object) error { } return fmt.Errorf("resource is still running: %s", obj.GetName()) - }, retry.Context(ctx)) + }, retry.Context(ctx), retry.Attempts(0)) } diff --git a/integration/port-forwarding_test.go b/integration/port-forwarding_test.go deleted file mode 100644 index cbe0746..0000000 --- a/integration/port-forwarding_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package integration_test - -import ( - "fmt" - "io" - "net/http" - "net/url" - "strings" - - v1 "k8s.io/api/core/v1" - "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/portforward" - "k8s.io/client-go/transport/spdy" -) - -// taken from https://github.com/gianarb/kube-port-forward - -type portForwardAPodRequest struct { - // RestConfig is the kubernetes config - RestConfig *rest.Config - // Pod is the selected pod for this port forwarding - Pod v1.Pod - // LocalPort is the local port that will be selected to expose the PodPort - LocalPort int - // PodPort is the target port for the pod - PodPort int - // Steams configures where to write or read input from - Streams genericclioptions.IOStreams - // StopCh is the channel used to manage the port forward lifecycle - StopCh <-chan struct{} - // ReadyCh communicates when the tunnel is ready to receive traffic - ReadyCh chan struct{} -} - -func portForwardAPod(req portForwardAPodRequest) error { - path := fmt.Sprintf("/api/v1/namespaces/%s/pods/%s/portforward", - req.Pod.Namespace, req.Pod.Name) - hostIP := strings.TrimLeft(req.RestConfig.Host, "htps:/") - - transport, upgrader, err := spdy.RoundTripperFor(req.RestConfig) - if err != nil { - return err - } - - dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, http.MethodPost, &url.URL{Scheme: "https", Path: path, Host: hostIP}) - fw, err := portforward.New(dialer, []string{fmt.Sprintf("%d:%d", req.LocalPort, req.PodPort)}, req.StopCh, req.ReadyCh, req.Streams.Out, req.Streams.ErrOut) - if err != nil { - return err - } - return fw.ForwardPorts() -} - -type runInPodForwardingRequest struct { - // RestConfig is the kubernetes config - RestConfig *rest.Config - // Pod is the selected pod for this port forwarding - Pod v1.Pod - // LocalPort is the local port that will be selected to expose the PodPort - LocalPort int - // PodPort is the target port for the pod - PodPort int -} - -func runInPodForwarding(req runInPodForwardingRequest, fn func()) { - stopCh := make(chan struct{}, 1) - readyCh := make(chan struct{}) - stream := genericclioptions.IOStreams{ - // for debugging: - // In: os.Stdout, - // Out: os.Stdout, - // ErrOut: os.Stdout, - In: nil, - Out: io.Discard, - ErrOut: io.Discard, - } - - go func() { - err := portForwardAPod(portForwardAPodRequest{ - RestConfig: restConfig, - Pod: req.Pod, - LocalPort: req.LocalPort, - PodPort: req.PodPort, - Streams: stream, - StopCh: stopCh, - ReadyCh: readyCh, - }) - if err != nil { - panic(err) - } - }() - - <-readyCh - - fn() - - stopCh <- struct{}{} -} diff --git a/integration/rethinkdb_test.go b/integration/rethinkdb_test.go index 2f9ba80..0e19de8 100644 --- a/integration/rethinkdb_test.go +++ b/integration/rethinkdb_test.go @@ -42,6 +42,8 @@ func Test_RethinkDB(t *testing.T) { defer cancel() cleanup := func() { + t.Log("running cleanup") + err := c.Delete(ctx, ns) require.NoError(t, client.IgnoreNotFound(err), "cleanup did not succeed") @@ -67,6 +69,7 @@ func Test_RethinkDB(t *testing.T) { }, Data: map[string]string{ "config.yaml": `--- +bind-addr: 0.0.0.0 db: rethinkdb db-data-directory: /data/rethinkdb/ backup-provider: local @@ -151,6 +154,7 @@ post-exec-cmds: }, }, Spec: corev1.PodSpec{ + HostNetwork: true, Containers: []corev1.Container{ { Name: "rethinkdb", @@ -345,6 +349,8 @@ post-exec-cmds: } ) + t.Log("applying resource manifests") + objects := []client.Object{cm(), secret(), service(), sts()} dumpToExamples(t, "rethinkdb-test.yaml", objects...) for _, o := range objects { @@ -356,104 +362,78 @@ post-exec-cmds: err = waitForPodRunnig(ctx, rethinkdbPodName, ns.Name) require.NoError(t, err) - // filling up the database - - runInPodForwarding(runInPodForwardingRequest{ - RestConfig: restConfig, - Pod: corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: rethinkdbPodName, - Namespace: ns.Name, - }, - }, - LocalPort: 28015, - PodPort: 28015, - }, func() { - var session *r.Session - err = retry.Do(func() error { - var err error - session, err = r.Connect(r.ConnectOpts{ - Addresses: []string{"localhost:28015"}, - Database: db, - Username: "admin", - Password: rethinkdbPassword, - MaxIdle: 10, - MaxOpen: 20, - }) - if err != nil { - return fmt.Errorf("cannot connect to DB: %w", err) - } + t.Log("adding test data to database") + + var session *r.Session + err = retry.Do(func() error { + var err error + session, err = r.Connect(r.ConnectOpts{ + Addresses: []string{"localhost:28015"}, + Database: db, + Username: "admin", + Password: rethinkdbPassword, + MaxIdle: 10, + MaxOpen: 20, + }) + if err != nil { + return fmt.Errorf("cannot connect to DB: %w", err) + } - return nil - }, retry.Context(ctx)) - require.NoError(t, err) + return nil + }, retry.Context(ctx), retry.Attempts(0)) + require.NoError(t, err) - _, _ = r.DBDrop(db).RunWrite(session) + _, _ = r.DBDrop(db).RunWrite(session) - _, err = r.DBCreate(db).RunWrite(session) - require.NoError(t, err) + _, err = r.DBCreate(db).RunWrite(session) + require.NoError(t, err) - _, err = r.DB(db).TableCreate(table).RunWrite(session) - require.NoError(t, err) + _, err = r.DB(db).TableCreate(table).RunWrite(session) + require.NoError(t, err) - type testData struct { - ID string `rethinkdb:"id"` - Data string `rethinkdb:"data"` - } + type testData struct { + ID string `rethinkdb:"id"` + Data string `rethinkdb:"data"` + } - _, err = r.DB(db).Table(table).Insert(testData{ - ID: "1", - Data: "i am precious", - }).RunWrite(session) - require.NoError(t, err) + _, err = r.DB(db).Table(table).Insert(testData{ + ID: "1", + Data: "i am precious", + }).RunWrite(session) + require.NoError(t, err) - cursor, err := r.DB(db).Table(table).Get("1").Run(session) - require.NoError(t, err) + cursor, err := r.DB(db).Table(table).Get("1").Run(session) + require.NoError(t, err) - var d testData - err = cursor.One(&d) - require.NoError(t, err) - require.Equal(t, "i am precious", d.Data) - }) + var d1 testData + err = cursor.One(&d1) + require.NoError(t, err) + require.Equal(t, "i am precious", d1.Data) - // check backups are made + t.Log("waiting for backup to be created") - runInPodForwarding(runInPodForwardingRequest{ - RestConfig: restConfig, - Pod: corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: rethinkdbPodName, - Namespace: ns.Name, - }, - }, - LocalPort: 8000, - PodPort: 8000, - }, func() { - brsc, err := brsclient.New(ctx, "http://localhost:8000") - require.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 - } + brsc, err := brsclient.New(ctx, "http://localhost:8000") + require.NoError(t, err) - if len(backups.Backups) == 0 { - return fmt.Errorf("no backups were made yet") - } + var backup *v1.Backup + err = retry.Do(func() error { + backups, err := brsc.BackupServiceClient().ListBackups(ctx, &v1.Empty{}) + if err != nil { + return err + } - backup = backups.Backups[0] + if len(backups.Backups) == 0 { + return fmt.Errorf("no backups were made yet") + } - return nil - }, retry.Context(ctx)) - require.NoError(t, err) - require.NotNil(t, backup) - }) + backup = backups.Backups[0] - // delete sts and remove data pvc + return nil + }, retry.Context(ctx), retry.Attempts(0), retry.MaxDelay(2*time.Second)) + require.NoError(t, err) + require.NotNil(t, backup) - t.FailNow() + t.Log("remove sts and delete data volume") err = c.Delete(ctx, sts()) require.NoError(t, err) @@ -474,7 +454,7 @@ post-exec-cmds: }) require.NoError(t, err) - // re-deploy sts + t.Log("recreate sts") err = c.Create(ctx, sts()) require.NoError(t, err) @@ -482,49 +462,13 @@ post-exec-cmds: err = waitForPodRunnig(ctx, rethinkdbPodName, ns.Name) require.NoError(t, err) - // check that restore is done + t.Log("verify that data gets restored") - runInPodForwarding(runInPodForwardingRequest{ - RestConfig: restConfig, - Pod: corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: rethinkdbPodName, - Namespace: ns.Name, - }, - }, - LocalPort: 28015, - PodPort: 28015, - }, func() { - var session *r.Session - err = retry.Do(func() error { - var err error - session, err = r.Connect(r.ConnectOpts{ - Addresses: []string{"localhost:28015"}, - Database: db, - Username: "admin", - Password: rethinkdbPassword, - MaxIdle: 10, - MaxOpen: 20, - }) - if err != nil { - return fmt.Errorf("cannot connect to DB: %w", err) - } - - return nil - }, retry.Context(ctx)) - require.NoError(t, err) - - type testData struct { - ID string `rethinkdb:"id"` - Data string `rethinkdb:"data"` - } - - cursor, err := r.DB(db).Table(table).Get("1").Run(session) - require.NoError(t, err) + cursor, err = r.DB(db).Table(table).Get("1").Run(session) + require.NoError(t, err) - var d testData - err = cursor.One(&d) - require.NoError(t, err) - require.Equal(t, "i am precious", d.Data) - }) + var d2 testData + err = cursor.One(&d2) + require.NoError(t, err) + require.Equal(t, "i am precious", d2.Data) } diff --git a/kind.yaml b/kind.yaml new file mode 100644 index 0000000..1f9cfa9 --- /dev/null +++ b/kind.yaml @@ -0,0 +1,15 @@ +--- +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +networking: + apiServerPort: 6443 + apiServerAddress: 0.0.0.0 +nodes: +- role: control-plane + extraPortMappings: + - containerPort: 8000 + hostPort: 8000 + listenAddress: 0.0.0.0 + - containerPort: 28015 + hostPort: 28015 + listenAddress: 0.0.0.0