mirror of
https://github.com/offen/docker-volume-backup.git
synced 2024-11-24 22:20:28 +01:00
Test for dropbox integration
This commit is contained in:
parent
894608fff4
commit
cd49b8c38e
@ -70,6 +70,7 @@ type Config struct {
|
|||||||
AzureStorageContainerName string `split_words:"true"`
|
AzureStorageContainerName string `split_words:"true"`
|
||||||
AzureStoragePath string `split_words:"true"`
|
AzureStoragePath string `split_words:"true"`
|
||||||
AzureStorageEndpoint string `split_words:"true" default:"https://{{ .AccountName }}.blob.core.windows.net/"`
|
AzureStorageEndpoint string `split_words:"true" default:"https://{{ .AccountName }}.blob.core.windows.net/"`
|
||||||
|
DropboxEndpoint string `split_words:"true" default:"https://api.dropbox.com/"`
|
||||||
DropboxRefreshToken string `split_words:"true"`
|
DropboxRefreshToken string `split_words:"true"`
|
||||||
DropboxAppKey string `split_words:"true"`
|
DropboxAppKey string `split_words:"true"`
|
||||||
DropboxAppSecret string `split_words:"true"`
|
DropboxAppSecret string `split_words:"true"`
|
||||||
|
@ -222,6 +222,7 @@ func newScript() (*script, error) {
|
|||||||
|
|
||||||
if s.c.DropboxRefreshToken != "" && s.c.DropboxAppKey != "" && s.c.DropboxAppSecret != "" {
|
if s.c.DropboxRefreshToken != "" && s.c.DropboxAppKey != "" && s.c.DropboxAppSecret != "" {
|
||||||
dropboxConfig := dropbox.Config{
|
dropboxConfig := dropbox.Config{
|
||||||
|
Endpoint: s.c.DropboxEndpoint,
|
||||||
RefreshToken: s.c.DropboxRefreshToken,
|
RefreshToken: s.c.DropboxRefreshToken,
|
||||||
AppKey: s.c.DropboxAppKey,
|
AppKey: s.c.DropboxAppKey,
|
||||||
AppSecret: s.c.DropboxAppSecret,
|
AppSecret: s.c.DropboxAppSecret,
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -26,6 +27,7 @@ type dropboxStorage struct {
|
|||||||
|
|
||||||
// Config allows to configure a Dropbox storage backend.
|
// Config allows to configure a Dropbox storage backend.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
Endpoint string
|
||||||
RefreshToken string
|
RefreshToken string
|
||||||
AppKey string
|
AppKey string
|
||||||
AppSecret string
|
AppSecret string
|
||||||
@ -35,24 +37,41 @@ type Config struct {
|
|||||||
|
|
||||||
// NewStorageBackend creates and initializes a new Dropbox storage backend.
|
// NewStorageBackend creates and initializes a new Dropbox storage backend.
|
||||||
func NewStorageBackend(opts Config, logFunc storage.Log) (storage.Backend, error) {
|
func NewStorageBackend(opts Config, logFunc storage.Log) (storage.Backend, error) {
|
||||||
|
tokenUrl, _ := url.JoinPath(opts.Endpoint, "oauth2/token")
|
||||||
|
|
||||||
conf := &oauth2.Config{
|
conf := &oauth2.Config{
|
||||||
ClientID: opts.AppKey,
|
ClientID: opts.AppKey,
|
||||||
ClientSecret: opts.AppSecret,
|
ClientSecret: opts.AppSecret,
|
||||||
Endpoint: oauth2.Endpoint{
|
Endpoint: oauth2.Endpoint{
|
||||||
TokenURL: "https://api.dropbox.com/oauth2/token",
|
TokenURL: tokenUrl,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isCITest := opts.Endpoint != "https://api.dropbox.com/"
|
||||||
|
|
||||||
logFunc(storage.LogLevelInfo, "Dropbox", "Fetching fresh access token for Dropbox storage backend.")
|
logFunc(storage.LogLevelInfo, "Dropbox", "Fetching fresh access token for Dropbox storage backend.")
|
||||||
tkSource := conf.TokenSource(context.TODO(), &oauth2.Token{RefreshToken: opts.RefreshToken})
|
token := &oauth2.Token{RefreshToken: opts.RefreshToken}
|
||||||
token, err := tkSource.Token()
|
if !isCITest {
|
||||||
if err != nil {
|
tkSource := conf.TokenSource(context.TODO(), &oauth2.Token{RefreshToken: opts.RefreshToken})
|
||||||
return nil, fmt.Errorf("(*dropboxStorage).NewStorageBackend: Error refreshing token: %w", err)
|
var err error
|
||||||
|
token, err = tkSource.Token()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("(*dropboxStorage).NewStorageBackend: Error refreshing token: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client := files.New(dropbox.Config{
|
dbxConfig := dropbox.Config{}
|
||||||
Token: token.AccessToken,
|
|
||||||
})
|
if isCITest {
|
||||||
|
dbxConfig.Token = opts.RefreshToken
|
||||||
|
dbxConfig.URLGenerator = func(hostType string, namespace string, route string) string {
|
||||||
|
return fmt.Sprintf("%s/%d/%s/%s", opts.Endpoint, 2, namespace, route)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dbxConfig.Token = token.AccessToken
|
||||||
|
}
|
||||||
|
|
||||||
|
client := files.New(dbxConfig)
|
||||||
|
|
||||||
if opts.ConcurrencyLevel < 1 {
|
if opts.ConcurrencyLevel < 1 {
|
||||||
logFunc(storage.LogLevelWarning, "Dropbox", "Concurrency level must be at least 1! Using 1 instead of %d.", opts.ConcurrencyLevel)
|
logFunc(storage.LogLevelWarning, "Dropbox", "Concurrency level must be at least 1! Using 1 instead of %d.", opts.ConcurrencyLevel)
|
||||||
|
25
test/dropbox/openapi-mock.yaml
Normal file
25
test/dropbox/openapi-mock.yaml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# OpenAPI specification options
|
||||||
|
openapi:
|
||||||
|
specification_url: '/etc/openapi/user_v2.yaml'
|
||||||
|
|
||||||
|
# web server options
|
||||||
|
http:
|
||||||
|
cors_enabled: false
|
||||||
|
port: 8080
|
||||||
|
response_timeout: 1.0
|
||||||
|
|
||||||
|
# application specific options
|
||||||
|
application:
|
||||||
|
debug: false
|
||||||
|
log_format: tty
|
||||||
|
log_level: info
|
||||||
|
|
||||||
|
# options to control generation process
|
||||||
|
generation:
|
||||||
|
default_min_float: -1.073741823e+09
|
||||||
|
default_max_float: 1.073741823e+09
|
||||||
|
default_min_int: 0
|
||||||
|
default_max_int: 2147483647
|
||||||
|
null_probability: 0
|
||||||
|
suppress_errors: false
|
||||||
|
use_examples: 'if_present'
|
50
test/dropbox/run.sh
Normal file
50
test/dropbox/run.sh
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
. ../util.sh
|
||||||
|
current_test=$(basename $(pwd))
|
||||||
|
|
||||||
|
docker compose up -d
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
docker compose exec backup backup
|
||||||
|
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
expect_running_containers "3"
|
||||||
|
|
||||||
|
dvb_logs=$(docker logs backup-1 2>&1)
|
||||||
|
if $dvb_logs | grep "ERROR"
|
||||||
|
then
|
||||||
|
fail "Backup failed, errors reported: $dvb_logs"
|
||||||
|
else
|
||||||
|
pass "Backup succeeded, no errors reported."
|
||||||
|
fi
|
||||||
|
|
||||||
|
dbx_logs=$(docker logs openapi_mock-1 2>&1)
|
||||||
|
if $dbx_logs | grep "ERROR"
|
||||||
|
then
|
||||||
|
fail "Backup failed, errors reported: $dvb_logs"
|
||||||
|
else
|
||||||
|
pass "Backup succeeded, no errors reported."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# The second part of this test checks if backups get deleted when the retention
|
||||||
|
# is set to 0 days (which it should not as it would mean all backups get deleted)
|
||||||
|
# TODO: find out if we can test actual deletion without having to wait for a day
|
||||||
|
BACKUP_RETENTION_DAYS="0" docker compose up -d
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
docker compose exec backup backup
|
||||||
|
|
||||||
|
dvb_logs=$(docker logs backup-1 2>&1)
|
||||||
|
if $dvb_logs | grep "Refusing to do so, please check your configuratio"
|
||||||
|
then
|
||||||
|
pass "Remote backups have not been deleted."
|
||||||
|
else
|
||||||
|
fail "Remote backups would have been deleted: $dvb_logs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker compose down --volumes
|
12753
test/dropbox/user_v2.yaml
Normal file
12753
test/dropbox/user_v2.yaml
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user