Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package modstgs3 | |
import ( | |
"context" | |
"net/http" | |
"os" | |
"strings" | |
"github.com/pkg/errors" | |
"github.com/sirupsen/logrus" | |
"github.com/weaviate/weaviate/entities/modulecapabilities" | |
"github.com/weaviate/weaviate/entities/moduletools" | |
) | |
const ( | |
Name = "backup-s3" | |
AltName1 = "s3" | |
s3Endpoint = "BACKUP_S3_ENDPOINT" | |
s3Bucket = "BACKUP_S3_BUCKET" | |
s3UseSSL = "BACKUP_S3_USE_SSL" | |
// this is an optional value, allowing for | |
// the backup to be stored in a specific | |
// directory inside the provided bucket. | |
// | |
// if left unset, the backup files will | |
// be stored directly in the root of the | |
// bucket. | |
s3Path = "BACKUP_S3_PATH" | |
) | |
type Module struct { | |
*s3Client | |
logger logrus.FieldLogger | |
dataPath string | |
} | |
func New() *Module { | |
return &Module{} | |
} | |
func (m *Module) Name() string { | |
return Name | |
} | |
func (m *Module) IsExternal() bool { | |
return true | |
} | |
func (m *Module) AltNames() []string { | |
return []string{AltName1} | |
} | |
func (m *Module) Type() modulecapabilities.ModuleType { | |
return modulecapabilities.Backup | |
} | |
func (m *Module) Init(ctx context.Context, | |
params moduletools.ModuleInitParams, | |
) error { | |
m.logger = params.GetLogger() | |
m.dataPath = params.GetStorageProvider().DataPath() | |
bucket := os.Getenv(s3Bucket) | |
if bucket == "" { | |
return errors.Errorf("backup init: '%s' must be set", s3Bucket) | |
} | |
// SSL on by default | |
useSSL := strings.ToLower(os.Getenv(s3UseSSL)) != "false" | |
config := newConfig(os.Getenv(s3Endpoint), bucket, os.Getenv(s3Path), useSSL) | |
client, err := newClient(config, m.logger, m.dataPath) | |
if err != nil { | |
return errors.Wrap(err, "initialize S3 backup module") | |
} | |
m.s3Client = client | |
return nil | |
} | |
func (m *Module) RootHandler() http.Handler { | |
// TODO: remove once this is a capability interface | |
return nil | |
} | |
func (m *Module) MetaInfo() (map[string]interface{}, error) { | |
metaInfo := make(map[string]interface{}, 4) | |
metaInfo["endpoint"] = m.config.Endpoint | |
metaInfo["bucketName"] = m.config.Bucket | |
if root := m.config.BackupPath; root != "" { | |
metaInfo["rootName"] = root | |
} | |
metaInfo["useSSL"] = m.config.UseSSL | |
return metaInfo, nil | |
} | |
// verify we implement the modules.Module interface | |
var ( | |
_ = modulecapabilities.Module(New()) | |
_ = modulecapabilities.BackupBackend(New()) | |
_ = modulecapabilities.MetaProvider(New()) | |
) | |