assert correct error on s3 conn bad configs e2e (#4387)
#### Does this PR need a docs update or release note? - [x] ⛔ No #### Type of change - [x] 🐛 Bugfix - [x] 🤖 Supportability/Tests #### Test Plan - [x] 💚 E2E
This commit is contained in:
parent
9e0d464854
commit
5258ef0f36
@ -140,11 +140,9 @@ func prepM365Test(
|
|||||||
recorder = strings.Builder{}
|
recorder = strings.Builder{}
|
||||||
)
|
)
|
||||||
|
|
||||||
sc, err := st.StorageConfig()
|
cfg, err := st.ToS3Config()
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
force := map[string]string{
|
force := map[string]string{
|
||||||
tconfig.TestCfgAccountProvider: account.ProviderM365.String(),
|
tconfig.TestCfgAccountProvider: account.ProviderM365.String(),
|
||||||
tconfig.TestCfgStorageProvider: storage.ProviderS3.String(),
|
tconfig.TestCfgStorageProvider: storage.ProviderS3.String(),
|
||||||
|
|||||||
@ -54,7 +54,7 @@ func configureAccount(
|
|||||||
if matchFromConfig {
|
if matchFromConfig {
|
||||||
providerType := vpr.GetString(account.AccountProviderTypeKey)
|
providerType := vpr.GetString(account.AccountProviderTypeKey)
|
||||||
if providerType != account.ProviderM365.String() {
|
if providerType != account.ProviderM365.String() {
|
||||||
return acct, clues.New("unsupported account provider: " + providerType)
|
return acct, clues.New("unsupported account provider: [" + providerType + "]")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := mustMatchConfig(vpr, m365Overrides(overrides)); err != nil {
|
if err := mustMatchConfig(vpr, m365Overrides(overrides)); err != nil {
|
||||||
|
|||||||
@ -279,8 +279,7 @@ func getStorageAndAccountWithViper(
|
|||||||
|
|
||||||
// possibly read the prior config from a .corso file
|
// possibly read the prior config from a .corso file
|
||||||
if readFromFile {
|
if readFromFile {
|
||||||
err = vpr.ReadInConfig()
|
if err := vpr.ReadInConfig(); err != nil {
|
||||||
if err != nil {
|
|
||||||
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
|
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
|
||||||
return config, clues.Wrap(err, "reading corso config file: "+vpr.ConfigFileUsed())
|
return config, clues.Wrap(err, "reading corso config file: "+vpr.ConfigFileUsed())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -356,10 +356,9 @@ func (suite *ConfigSuite) TestReadFromFlags() {
|
|||||||
|
|
||||||
m365Config, _ := repoDetails.Account.M365Config()
|
m365Config, _ := repoDetails.Account.M365Config()
|
||||||
|
|
||||||
sc, err := repoDetails.Storage.StorageConfig()
|
s3Cfg, err := repoDetails.Storage.ToS3Config()
|
||||||
require.NoError(t, err, "reading s3 config from storage", clues.ToCore(err))
|
require.NoError(t, err, "reading s3 config from storage", clues.ToCore(err))
|
||||||
|
|
||||||
s3Cfg := sc.(*storage.S3Config)
|
|
||||||
commonConfig, _ := repoDetails.Storage.CommonConfig()
|
commonConfig, _ := repoDetails.Storage.CommonConfig()
|
||||||
pass := commonConfig.Corso.CorsoPassphrase
|
pass := commonConfig.Corso.CorsoPassphrase
|
||||||
|
|
||||||
@ -425,17 +424,21 @@ func (suite *ConfigIntegrationSuite) TestGetStorageAndAccount() {
|
|||||||
err = writeRepoConfigWithViper(vpr, s3Cfg, m365, repository.Options{}, "repoid")
|
err = writeRepoConfigWithViper(vpr, s3Cfg, m365, repository.Options{}, "repoid")
|
||||||
require.NoError(t, err, "writing repo config", clues.ToCore(err))
|
require.NoError(t, err, "writing repo config", clues.ToCore(err))
|
||||||
|
|
||||||
|
require.Equal(
|
||||||
|
t,
|
||||||
|
account.ProviderM365.String(),
|
||||||
|
vpr.GetString(account.AccountProviderTypeKey),
|
||||||
|
"viper should have m365 as the account provider")
|
||||||
|
|
||||||
err = vpr.ReadInConfig()
|
err = vpr.ReadInConfig()
|
||||||
require.NoError(t, err, "reading repo config", clues.ToCore(err))
|
require.NoError(t, err, "reading repo config", clues.ToCore(err))
|
||||||
|
|
||||||
cfg, err := getStorageAndAccountWithViper(vpr, storage.ProviderS3, true, true, nil)
|
cfg, err := getStorageAndAccountWithViper(vpr, storage.ProviderS3, true, true, nil)
|
||||||
require.NoError(t, err, "getting storage and account from config", clues.ToCore(err))
|
require.NoError(t, err, "getting storage and account from config", clues.ToCore(err))
|
||||||
|
|
||||||
sc, err := cfg.Storage.StorageConfig()
|
readS3Cfg, err := cfg.Storage.ToS3Config()
|
||||||
require.NoError(t, err, "reading s3 config from storage", clues.ToCore(err))
|
require.NoError(t, err, "reading s3 config from storage", clues.ToCore(err))
|
||||||
|
|
||||||
readS3Cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
assert.Equal(t, readS3Cfg.Bucket, s3Cfg.Bucket)
|
assert.Equal(t, readS3Cfg.Bucket, s3Cfg.Bucket)
|
||||||
assert.Equal(t, readS3Cfg.Endpoint, s3Cfg.Endpoint)
|
assert.Equal(t, readS3Cfg.Endpoint, s3Cfg.Endpoint)
|
||||||
assert.Equal(t, readS3Cfg.Prefix, s3Cfg.Prefix)
|
assert.Equal(t, readS3Cfg.Prefix, s3Cfg.Prefix)
|
||||||
@ -482,11 +485,9 @@ func (suite *ConfigIntegrationSuite) TestGetStorageAndAccount_noFileOnlyOverride
|
|||||||
cfg, err := getStorageAndAccountWithViper(vpr, storage.ProviderS3, false, true, overrides)
|
cfg, err := getStorageAndAccountWithViper(vpr, storage.ProviderS3, false, true, overrides)
|
||||||
require.NoError(t, err, "getting storage and account from config", clues.ToCore(err))
|
require.NoError(t, err, "getting storage and account from config", clues.ToCore(err))
|
||||||
|
|
||||||
sc, err := cfg.Storage.StorageConfig()
|
readS3Cfg, err := cfg.Storage.ToS3Config()
|
||||||
require.NoError(t, err, "reading s3 config from storage", clues.ToCore(err))
|
require.NoError(t, err, "reading s3 config from storage", clues.ToCore(err))
|
||||||
|
|
||||||
readS3Cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
assert.Equal(t, readS3Cfg.Bucket, bkt)
|
assert.Equal(t, readS3Cfg.Bucket, bkt)
|
||||||
assert.Equal(t, cfg.RepoID, "")
|
assert.Equal(t, cfg.RepoID, "")
|
||||||
assert.Equal(t, readS3Cfg.Endpoint, end)
|
assert.Equal(t, readS3Cfg.Endpoint, end)
|
||||||
|
|||||||
@ -96,13 +96,11 @@ func initFilesystemCmd(cmd *cobra.Command, args []string) error {
|
|||||||
cfg.Account.ID(),
|
cfg.Account.ID(),
|
||||||
opt)
|
opt)
|
||||||
|
|
||||||
sc, err := cfg.Storage.StorageConfig()
|
storageCfg, err := cfg.Storage.ToFilesystemConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Retrieving filesystem configuration"))
|
return Only(ctx, clues.Wrap(err, "Retrieving filesystem configuration"))
|
||||||
}
|
}
|
||||||
|
|
||||||
storageCfg := sc.(*storage.FilesystemConfig)
|
|
||||||
|
|
||||||
m365, err := cfg.Account.M365Config()
|
m365, err := cfg.Account.M365Config()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to parse m365 account config"))
|
return Only(ctx, clues.Wrap(err, "Failed to parse m365 account config"))
|
||||||
@ -123,14 +121,20 @@ func initFilesystemCmd(cmd *cobra.Command, args []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to initialize a new filesystem repository"))
|
return Only(ctx, clues.Stack(ErrInitializingRepo, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
defer utils.CloseRepo(ctx, r)
|
defer utils.CloseRepo(ctx, r)
|
||||||
|
|
||||||
Infof(ctx, "Initialized a repository at path %s", storageCfg.Path)
|
Infof(ctx, "Initialized a repository at path %s", storageCfg.Path)
|
||||||
|
|
||||||
if err = config.WriteRepoConfig(ctx, sc, m365, opt.Repo, r.GetID()); err != nil {
|
err = config.WriteRepoConfig(
|
||||||
|
ctx,
|
||||||
|
storageCfg,
|
||||||
|
m365,
|
||||||
|
opt.Repo,
|
||||||
|
r.GetID())
|
||||||
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to write repository configuration"))
|
return Only(ctx, clues.Wrap(err, "Failed to write repository configuration"))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,13 +185,11 @@ func connectFilesystemCmd(cmd *cobra.Command, args []string) error {
|
|||||||
repoID = events.RepoIDNotFound
|
repoID = events.RepoIDNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
sc, err := cfg.Storage.StorageConfig()
|
storageCfg, err := cfg.Storage.ToFilesystemConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Retrieving filesystem configuration"))
|
return Only(ctx, clues.Wrap(err, "Retrieving filesystem configuration"))
|
||||||
}
|
}
|
||||||
|
|
||||||
storageCfg := sc.(*storage.FilesystemConfig)
|
|
||||||
|
|
||||||
m365, err := cfg.Account.M365Config()
|
m365, err := cfg.Account.M365Config()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to parse m365 account config"))
|
return Only(ctx, clues.Wrap(err, "Failed to parse m365 account config"))
|
||||||
@ -206,14 +208,20 @@ func connectFilesystemCmd(cmd *cobra.Command, args []string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := r.Connect(ctx); err != nil {
|
if err := r.Connect(ctx); err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to connect to the filesystem repository"))
|
return Only(ctx, clues.Stack(ErrConnectingRepo, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
defer utils.CloseRepo(ctx, r)
|
defer utils.CloseRepo(ctx, r)
|
||||||
|
|
||||||
Infof(ctx, "Connected to repository at path %s", storageCfg.Path)
|
Infof(ctx, "Connected to repository at path %s", storageCfg.Path)
|
||||||
|
|
||||||
if err = config.WriteRepoConfig(ctx, sc, m365, opts.Repo, r.GetID()); err != nil {
|
err = config.WriteRepoConfig(
|
||||||
|
ctx,
|
||||||
|
storageCfg,
|
||||||
|
m365,
|
||||||
|
opts.Repo,
|
||||||
|
r.GetID())
|
||||||
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to write repository configuration"))
|
return Only(ctx, clues.Wrap(err, "Failed to write repository configuration"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -56,9 +56,8 @@ func (suite *FilesystemE2ESuite) TestInitFilesystemCmd() {
|
|||||||
|
|
||||||
st := storeTD.NewFilesystemStorage(t)
|
st := storeTD.NewFilesystemStorage(t)
|
||||||
|
|
||||||
sc, err := st.StorageConfig()
|
cfg, err := st.ToFilesystemConfig()
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
cfg := sc.(*storage.FilesystemConfig)
|
|
||||||
|
|
||||||
force := map[string]string{
|
force := map[string]string{
|
||||||
tconfig.TestCfgStorageProvider: storage.ProviderFilesystem.String(),
|
tconfig.TestCfgStorageProvider: storage.ProviderFilesystem.String(),
|
||||||
@ -113,9 +112,8 @@ func (suite *FilesystemE2ESuite) TestConnectFilesystemCmd() {
|
|||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
st := storeTD.NewFilesystemStorage(t)
|
st := storeTD.NewFilesystemStorage(t)
|
||||||
sc, err := st.StorageConfig()
|
cfg, err := st.ToFilesystemConfig()
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
cfg := sc.(*storage.FilesystemConfig)
|
|
||||||
|
|
||||||
force := map[string]string{
|
force := map[string]string{
|
||||||
tconfig.TestCfgAccountProvider: account.ProviderM365.String(),
|
tconfig.TestCfgAccountProvider: account.ProviderM365.String(),
|
||||||
|
|||||||
@ -20,6 +20,11 @@ const (
|
|||||||
maintenanceCommand = "maintenance"
|
maintenanceCommand = "maintenance"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrConnectingRepo = clues.New("connecting repository")
|
||||||
|
ErrInitializingRepo = clues.New("initializing repository")
|
||||||
|
)
|
||||||
|
|
||||||
var repoCommands = []func(cmd *cobra.Command) *cobra.Command{
|
var repoCommands = []func(cmd *cobra.Command) *cobra.Command{
|
||||||
addS3Commands,
|
addS3Commands,
|
||||||
addFilesystemCommands,
|
addFilesystemCommands,
|
||||||
|
|||||||
@ -111,13 +111,11 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
cfg.Account.ID(),
|
cfg.Account.ID(),
|
||||||
opt)
|
opt)
|
||||||
|
|
||||||
sc, err := cfg.Storage.StorageConfig()
|
s3Cfg, err := cfg.Storage.ToS3Config()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Retrieving s3 configuration"))
|
return Only(ctx, clues.Wrap(err, "Retrieving s3 configuration"))
|
||||||
}
|
}
|
||||||
|
|
||||||
s3Cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
if strings.HasPrefix(s3Cfg.Endpoint, "http://") || strings.HasPrefix(s3Cfg.Endpoint, "https://") {
|
if strings.HasPrefix(s3Cfg.Endpoint, "http://") || strings.HasPrefix(s3Cfg.Endpoint, "https://") {
|
||||||
invalidEndpointErr := "endpoint doesn't support specifying protocol. " +
|
invalidEndpointErr := "endpoint doesn't support specifying protocol. " +
|
||||||
"pass --disable-tls flag to use http:// instead of default https://"
|
"pass --disable-tls flag to use http:// instead of default https://"
|
||||||
@ -145,7 +143,7 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to initialize a new S3 repository"))
|
return Only(ctx, clues.Stack(ErrInitializingRepo, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
defer utils.CloseRepo(ctx, r)
|
defer utils.CloseRepo(ctx, r)
|
||||||
@ -194,13 +192,11 @@ func connectS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
repoID = events.RepoIDNotFound
|
repoID = events.RepoIDNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
sc, err := cfg.Storage.StorageConfig()
|
s3Cfg, err := cfg.Storage.ToS3Config()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Retrieving s3 configuration"))
|
return Only(ctx, clues.Wrap(err, "Retrieving s3 configuration"))
|
||||||
}
|
}
|
||||||
|
|
||||||
s3Cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
m365, err := cfg.Account.M365Config()
|
m365, err := cfg.Account.M365Config()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to parse m365 account config"))
|
return Only(ctx, clues.Wrap(err, "Failed to parse m365 account config"))
|
||||||
@ -226,7 +222,7 @@ func connectS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := r.Connect(ctx); err != nil {
|
if err := r.Connect(ctx); err != nil {
|
||||||
return Only(ctx, clues.Wrap(err, "Failed to connect to the S3 repository"))
|
return Only(ctx, clues.Stack(ErrConnectingRepo, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
defer utils.CloseRepo(ctx, r)
|
defer utils.CloseRepo(ctx, r)
|
||||||
|
|||||||
@ -8,10 +8,12 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
"golang.org/x/exp/maps"
|
||||||
|
|
||||||
"github.com/alcionai/corso/src/cli"
|
"github.com/alcionai/corso/src/cli"
|
||||||
"github.com/alcionai/corso/src/cli/config"
|
"github.com/alcionai/corso/src/cli/config"
|
||||||
cliTD "github.com/alcionai/corso/src/cli/testdata"
|
cliTD "github.com/alcionai/corso/src/cli/testdata"
|
||||||
|
"github.com/alcionai/corso/src/internal/common/str"
|
||||||
"github.com/alcionai/corso/src/internal/tester"
|
"github.com/alcionai/corso/src/internal/tester"
|
||||||
"github.com/alcionai/corso/src/internal/tester/tconfig"
|
"github.com/alcionai/corso/src/internal/tester/tconfig"
|
||||||
"github.com/alcionai/corso/src/pkg/account"
|
"github.com/alcionai/corso/src/pkg/account"
|
||||||
@ -64,9 +66,8 @@ func (suite *S3E2ESuite) TestInitS3Cmd() {
|
|||||||
|
|
||||||
st := storeTD.NewPrefixedS3Storage(t)
|
st := storeTD.NewPrefixedS3Storage(t)
|
||||||
|
|
||||||
sc, err := st.StorageConfig()
|
cfg, err := st.ToS3Config()
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
vpr, configFP := tconfig.MakeTempTestConfigClone(t, nil)
|
vpr, configFP := tconfig.MakeTempTestConfigClone(t, nil)
|
||||||
if !test.hasConfigFile {
|
if !test.hasConfigFile {
|
||||||
@ -102,10 +103,9 @@ func (suite *S3E2ESuite) TestInitMultipleTimes() {
|
|||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
st := storeTD.NewPrefixedS3Storage(t)
|
st := storeTD.NewPrefixedS3Storage(t)
|
||||||
sc, err := st.StorageConfig()
|
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
|
||||||
|
|
||||||
cfg := sc.(*storage.S3Config)
|
cfg, err := st.ToS3Config()
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
vpr, configFP := tconfig.MakeTempTestConfigClone(t, nil)
|
vpr, configFP := tconfig.MakeTempTestConfigClone(t, nil)
|
||||||
|
|
||||||
@ -134,11 +134,9 @@ func (suite *S3E2ESuite) TestInitS3Cmd_missingBucket() {
|
|||||||
|
|
||||||
st := storeTD.NewPrefixedS3Storage(t)
|
st := storeTD.NewPrefixedS3Storage(t)
|
||||||
|
|
||||||
sc, err := st.StorageConfig()
|
cfg, err := st.ToS3Config()
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
force := map[string]string{
|
force := map[string]string{
|
||||||
tconfig.TestCfgBucket: "",
|
tconfig.TestCfgBucket: "",
|
||||||
}
|
}
|
||||||
@ -189,9 +187,9 @@ func (suite *S3E2ESuite) TestConnectS3Cmd() {
|
|||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
st := storeTD.NewPrefixedS3Storage(t)
|
st := storeTD.NewPrefixedS3Storage(t)
|
||||||
sc, err := st.StorageConfig()
|
|
||||||
|
cfg, err := st.ToS3Config()
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
force := map[string]string{
|
force := map[string]string{
|
||||||
tconfig.TestCfgAccountProvider: account.ProviderM365.String(),
|
tconfig.TestCfgAccountProvider: account.ProviderM365.String(),
|
||||||
@ -234,58 +232,63 @@ func (suite *S3E2ESuite) TestConnectS3Cmd() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *S3E2ESuite) TestConnectS3Cmd_BadBucket() {
|
func (suite *S3E2ESuite) TestConnectS3Cmd_badInputs() {
|
||||||
t := suite.T()
|
table := []struct {
|
||||||
ctx, flush := tester.NewContext(t)
|
name string
|
||||||
|
bucket string
|
||||||
|
prefix string
|
||||||
|
expectErr func(t *testing.T, err error)
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "bucket",
|
||||||
|
bucket: "wrong",
|
||||||
|
expectErr: func(t *testing.T, err error) {
|
||||||
|
assert.ErrorIs(t, err, storage.ErrVerifyingConfigStorage, clues.ToCore(err))
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "prefix",
|
||||||
|
prefix: "wrong",
|
||||||
|
expectErr: func(t *testing.T, err error) {
|
||||||
|
assert.ErrorIs(t, err, storage.ErrVerifyingConfigStorage, clues.ToCore(err))
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, test := range table {
|
||||||
|
suite.Run(test.name, func() {
|
||||||
|
t := suite.T()
|
||||||
|
|
||||||
defer flush()
|
ctx, flush := tester.NewContext(t)
|
||||||
|
defer flush()
|
||||||
|
|
||||||
st := storeTD.NewPrefixedS3Storage(t)
|
st := storeTD.NewPrefixedS3Storage(t)
|
||||||
sc, err := st.StorageConfig()
|
cfg, err := st.ToS3Config()
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
cfg := sc.(*storage.S3Config)
|
bucket := str.First(test.bucket, cfg.Bucket)
|
||||||
|
prefix := str.First(test.prefix, cfg.Prefix)
|
||||||
|
|
||||||
vpr, configFP := tconfig.MakeTempTestConfigClone(t, nil)
|
over := map[string]string{}
|
||||||
|
acct := tconfig.NewM365Account(t)
|
||||||
|
|
||||||
ctx = config.SetViper(ctx, vpr)
|
maps.Copy(over, acct.Config)
|
||||||
|
over[account.AccountProviderTypeKey] = account.ProviderM365.String()
|
||||||
|
over[storage.StorageProviderTypeKey] = storage.ProviderS3.String()
|
||||||
|
|
||||||
cmd := cliTD.StubRootCmd(
|
vpr, configFP := tconfig.MakeTempTestConfigClone(t, over)
|
||||||
"repo", "connect", "s3",
|
ctx = config.SetViper(ctx, vpr)
|
||||||
"--config-file", configFP,
|
|
||||||
"--bucket", "wrong",
|
|
||||||
"--prefix", cfg.Prefix)
|
|
||||||
cli.BuildCommandTree(cmd)
|
|
||||||
|
|
||||||
// run the command
|
cmd := cliTD.StubRootCmd(
|
||||||
err = cmd.ExecuteContext(ctx)
|
"repo", "connect", "s3",
|
||||||
require.Error(t, err, clues.ToCore(err))
|
"--config-file", configFP,
|
||||||
}
|
"--bucket", bucket,
|
||||||
|
"--prefix", prefix)
|
||||||
func (suite *S3E2ESuite) TestConnectS3Cmd_BadPrefix() {
|
cli.BuildCommandTree(cmd)
|
||||||
t := suite.T()
|
|
||||||
ctx, flush := tester.NewContext(t)
|
// run the command
|
||||||
|
err = cmd.ExecuteContext(ctx)
|
||||||
defer flush()
|
require.Error(t, err, clues.ToCore(err))
|
||||||
|
test.expectErr(t, err)
|
||||||
st := storeTD.NewPrefixedS3Storage(t)
|
})
|
||||||
sc, err := st.StorageConfig()
|
}
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
|
||||||
|
|
||||||
cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
vpr, configFP := tconfig.MakeTempTestConfigClone(t, nil)
|
|
||||||
|
|
||||||
ctx = config.SetViper(ctx, vpr)
|
|
||||||
|
|
||||||
cmd := cliTD.StubRootCmd(
|
|
||||||
"repo", "connect", "s3",
|
|
||||||
"--config-file", configFP,
|
|
||||||
"--bucket", cfg.Bucket,
|
|
||||||
"--prefix", "wrong")
|
|
||||||
cli.BuildCommandTree(cmd)
|
|
||||||
|
|
||||||
// run the command
|
|
||||||
err = cmd.ExecuteContext(ctx)
|
|
||||||
require.Error(t, err, clues.ToCore(err))
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,11 +66,9 @@ func (suite *RestoreExchangeE2ESuite) SetupSuite() {
|
|||||||
suite.acct = tconfig.NewM365Account(t)
|
suite.acct = tconfig.NewM365Account(t)
|
||||||
suite.st = storeTD.NewPrefixedS3Storage(t)
|
suite.st = storeTD.NewPrefixedS3Storage(t)
|
||||||
|
|
||||||
sc, err := suite.st.StorageConfig()
|
cfg, err := suite.st.ToS3Config()
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
force := map[string]string{
|
force := map[string]string{
|
||||||
tconfig.TestCfgAccountProvider: account.ProviderM365.String(),
|
tconfig.TestCfgAccountProvider: account.ProviderM365.String(),
|
||||||
tconfig.TestCfgStorageProvider: storage.ProviderS3.String(),
|
tconfig.TestCfgStorageProvider: storage.ProviderS3.String(),
|
||||||
|
|||||||
@ -197,13 +197,11 @@ func handleCheckerCommand(cmd *cobra.Command, args []string, f flags) error {
|
|||||||
return clues.Wrap(err, "getting storage config")
|
return clues.Wrap(err, "getting storage config")
|
||||||
}
|
}
|
||||||
|
|
||||||
sc, err := repoDetails.Storage.StorageConfig()
|
cfg, err := repoDetails.Storage.ToS3Config()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return clues.Wrap(err, "getting S3 config")
|
return clues.Wrap(err, "getting S3 config")
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
endpoint := defaultS3Endpoint
|
endpoint := defaultS3Endpoint
|
||||||
if len(cfg.Endpoint) > 0 {
|
if len(cfg.Endpoint) > 0 {
|
||||||
endpoint = cfg.Endpoint
|
endpoint = cfg.Endpoint
|
||||||
|
|||||||
@ -205,7 +205,7 @@ func (w *conn) commonConnect(
|
|||||||
bst,
|
bst,
|
||||||
password,
|
password,
|
||||||
kopiaOpts); err != nil {
|
kopiaOpts); err != nil {
|
||||||
return clues.Wrap(err, "connecting to repo").WithClues(ctx)
|
return clues.Wrap(err, "connecting to kopia repo").WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := w.open(ctx, cfgFile, password); err != nil {
|
if err := w.open(ctx, cfgFile, password); err != nil {
|
||||||
|
|||||||
@ -16,12 +16,11 @@ func filesystemStorage(
|
|||||||
repoOpts repository.Options,
|
repoOpts repository.Options,
|
||||||
s storage.Storage,
|
s storage.Storage,
|
||||||
) (blob.Storage, error) {
|
) (blob.Storage, error) {
|
||||||
cfg, err := s.StorageConfig()
|
fsCfg, err := s.ToFilesystemConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, clues.Stack(err).WithClues(ctx)
|
return nil, clues.Stack(err).WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
fsCfg := cfg.(*storage.FilesystemConfig)
|
|
||||||
opts := filesystem.Options{
|
opts := filesystem.Options{
|
||||||
Path: fsCfg.Path,
|
Path: fsCfg.Path,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,13 +20,11 @@ func s3BlobStorage(
|
|||||||
repoOpts repository.Options,
|
repoOpts repository.Options,
|
||||||
s storage.Storage,
|
s storage.Storage,
|
||||||
) (blob.Storage, error) {
|
) (blob.Storage, error) {
|
||||||
sc, err := s.StorageConfig()
|
cfg, err := s.ToS3Config()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, clues.Stack(err).WithClues(ctx)
|
return nil, clues.Stack(err).WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := sc.(*storage.S3Config)
|
|
||||||
|
|
||||||
endpoint := defaultS3Endpoint
|
endpoint := defaultS3Endpoint
|
||||||
if len(cfg.Endpoint) > 0 {
|
if len(cfg.Endpoint) > 0 {
|
||||||
endpoint = cfg.Endpoint
|
endpoint = cfg.Endpoint
|
||||||
|
|||||||
@ -187,6 +187,8 @@ func (r *repository) Initialize(
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
observe.Message(ctx, "Initializing repository")
|
||||||
|
|
||||||
kopiaRef := kopia.NewConn(r.Storage)
|
kopiaRef := kopia.NewConn(r.Storage)
|
||||||
if err := kopiaRef.Initialize(ctx, r.Opts.Repo, retentionOpts); err != nil {
|
if err := kopiaRef.Initialize(ctx, r.Opts.Repo, retentionOpts); err != nil {
|
||||||
// replace common internal errors so that sdk users can check results with errors.Is()
|
// replace common internal errors so that sdk users can check results with errors.Is()
|
||||||
@ -237,8 +239,7 @@ func (r *repository) Connect(ctx context.Context) (err error) {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
progressBar := observe.MessageWithCompletion(ctx, "Connecting to repository")
|
observe.Message(ctx, "Connecting to repository")
|
||||||
defer close(progressBar)
|
|
||||||
|
|
||||||
kopiaRef := kopia.NewConn(r.Storage)
|
kopiaRef := kopia.NewConn(r.Storage)
|
||||||
if err := kopiaRef.Connect(ctx, r.Opts.Repo); err != nil {
|
if err := kopiaRef.Connect(ctx, r.Opts.Repo); err != nil {
|
||||||
|
|||||||
@ -7,16 +7,17 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
|
"github.com/alcionai/corso/src/internal/tester"
|
||||||
"github.com/alcionai/corso/src/pkg/credentials"
|
"github.com/alcionai/corso/src/pkg/credentials"
|
||||||
"github.com/alcionai/corso/src/pkg/storage"
|
"github.com/alcionai/corso/src/pkg/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CommonCfgSuite struct {
|
type CommonCfgUnitSuite struct {
|
||||||
suite.Suite
|
tester.Suite
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCommonCfgSuite(t *testing.T) {
|
func TestCommonCfgUnitSuite(t *testing.T) {
|
||||||
suite.Run(t, new(CommonCfgSuite))
|
suite.Run(t, &CommonCfgUnitSuite{Suite: tester.NewUnitSuite(t)})
|
||||||
}
|
}
|
||||||
|
|
||||||
var goodCommonConfig = storage.CommonConfig{
|
var goodCommonConfig = storage.CommonConfig{
|
||||||
@ -25,7 +26,7 @@ var goodCommonConfig = storage.CommonConfig{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *CommonCfgSuite) TestCommonConfig_Config() {
|
func (suite *CommonCfgUnitSuite) TestCommonConfig_Config() {
|
||||||
cfg := goodCommonConfig
|
cfg := goodCommonConfig
|
||||||
c, err := cfg.StringConfig()
|
c, err := cfg.StringConfig()
|
||||||
assert.NoError(suite.T(), err, clues.ToCore(err))
|
assert.NoError(suite.T(), err, clues.ToCore(err))
|
||||||
@ -43,7 +44,7 @@ func (suite *CommonCfgSuite) TestCommonConfig_Config() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *CommonCfgSuite) TestStorage_CommonConfig() {
|
func (suite *CommonCfgUnitSuite) TestStorage_CommonConfig() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
|
|
||||||
in := goodCommonConfig
|
in := goodCommonConfig
|
||||||
@ -55,7 +56,7 @@ func (suite *CommonCfgSuite) TestStorage_CommonConfig() {
|
|||||||
assert.Equal(t, in.CorsoPassphrase, out.CorsoPassphrase)
|
assert.Equal(t, in.CorsoPassphrase, out.CorsoPassphrase)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *CommonCfgSuite) TestStorage_CommonConfig_InvalidCases() {
|
func (suite *CommonCfgUnitSuite) TestStorage_CommonConfig_InvalidCases() {
|
||||||
// missing required properties
|
// missing required properties
|
||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
|
|||||||
@ -20,6 +20,10 @@ type FilesystemConfig struct {
|
|||||||
Path string
|
Path string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s Storage) ToFilesystemConfig() (*FilesystemConfig, error) {
|
||||||
|
return buildFilesystemConfigFromMap(s.Config)
|
||||||
|
}
|
||||||
|
|
||||||
func buildFilesystemConfigFromMap(config map[string]string) (*FilesystemConfig, error) {
|
func buildFilesystemConfigFromMap(config map[string]string) (*FilesystemConfig, error) {
|
||||||
c := &FilesystemConfig{}
|
c := &FilesystemConfig{}
|
||||||
|
|
||||||
@ -69,7 +73,7 @@ func (c *FilesystemConfig) ApplyConfigOverrides(
|
|||||||
if matchFromConfig {
|
if matchFromConfig {
|
||||||
providerType := cast.ToString(g.Get(StorageProviderTypeKey))
|
providerType := cast.ToString(g.Get(StorageProviderTypeKey))
|
||||||
if providerType != ProviderFilesystem.String() {
|
if providerType != ProviderFilesystem.String() {
|
||||||
return clues.New("unsupported storage provider in config file: " + providerType)
|
return clues.New("unsupported storage provider in config file: [" + providerType + "]")
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is matching override values from config file.
|
// This is matching override values from config file.
|
||||||
|
|||||||
@ -62,6 +62,28 @@ var s3constToTomlKeyMap = map[string]string{
|
|||||||
StorageProviderTypeKey: StorageProviderTypeKey,
|
StorageProviderTypeKey: StorageProviderTypeKey,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s Storage) ToS3Config() (*S3Config, error) {
|
||||||
|
return buildS3ConfigFromMap(s.Config)
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildS3ConfigFromMap(config map[string]string) (*S3Config, error) {
|
||||||
|
c := &S3Config{}
|
||||||
|
|
||||||
|
if len(config) > 0 {
|
||||||
|
c.AccessKey = orEmptyString(config[keyS3AccessKey])
|
||||||
|
c.SecretKey = orEmptyString(config[keyS3SecretKey])
|
||||||
|
c.SessionToken = orEmptyString(config[keyS3SessionToken])
|
||||||
|
|
||||||
|
c.Bucket = orEmptyString(config[keyS3Bucket])
|
||||||
|
c.Endpoint = orEmptyString(config[keyS3Endpoint])
|
||||||
|
c.Prefix = orEmptyString(config[keyS3Prefix])
|
||||||
|
c.DoNotUseTLS = str.ParseBool(config[keyS3DoNotUseTLS])
|
||||||
|
c.DoNotVerifyTLS = str.ParseBool(config[keyS3DoNotVerifyTLS])
|
||||||
|
}
|
||||||
|
|
||||||
|
return c, c.validate()
|
||||||
|
}
|
||||||
|
|
||||||
func (c *S3Config) normalize() S3Config {
|
func (c *S3Config) normalize() S3Config {
|
||||||
return S3Config{
|
return S3Config{
|
||||||
Bucket: common.NormalizeBucket(c.Bucket),
|
Bucket: common.NormalizeBucket(c.Bucket),
|
||||||
@ -91,24 +113,6 @@ func (c *S3Config) StringConfig() (map[string]string, error) {
|
|||||||
return cfg, cn.validate()
|
return cfg, cn.validate()
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildS3ConfigFromMap(config map[string]string) (*S3Config, error) {
|
|
||||||
c := &S3Config{}
|
|
||||||
|
|
||||||
if len(config) > 0 {
|
|
||||||
c.AccessKey = orEmptyString(config[keyS3AccessKey])
|
|
||||||
c.SecretKey = orEmptyString(config[keyS3SecretKey])
|
|
||||||
c.SessionToken = orEmptyString(config[keyS3SessionToken])
|
|
||||||
|
|
||||||
c.Bucket = orEmptyString(config[keyS3Bucket])
|
|
||||||
c.Endpoint = orEmptyString(config[keyS3Endpoint])
|
|
||||||
c.Prefix = orEmptyString(config[keyS3Prefix])
|
|
||||||
c.DoNotUseTLS = str.ParseBool(config[keyS3DoNotUseTLS])
|
|
||||||
c.DoNotVerifyTLS = str.ParseBool(config[keyS3DoNotVerifyTLS])
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, c.validate()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c S3Config) validate() error {
|
func (c S3Config) validate() error {
|
||||||
check := map[string]string{
|
check := map[string]string{
|
||||||
Bucket: c.Bucket,
|
Bucket: c.Bucket,
|
||||||
@ -169,11 +173,11 @@ func (c *S3Config) ApplyConfigOverrides(
|
|||||||
if matchFromConfig {
|
if matchFromConfig {
|
||||||
providerType := cast.ToString(kvg.Get(StorageProviderTypeKey))
|
providerType := cast.ToString(kvg.Get(StorageProviderTypeKey))
|
||||||
if providerType != ProviderS3.String() {
|
if providerType != ProviderS3.String() {
|
||||||
return clues.New("unsupported storage provider: " + providerType)
|
return clues.New("unsupported storage provider: [" + providerType + "]")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := mustMatchConfig(kvg, s3constToTomlKeyMap, s3Overrides(overrides)); err != nil {
|
if err := mustMatchConfig(kvg, s3constToTomlKeyMap, s3Overrides(overrides)); err != nil {
|
||||||
return clues.Wrap(err, "verifying s3 configs in corso config file")
|
return clues.Stack(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,15 +8,16 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
|
"github.com/alcionai/corso/src/internal/tester"
|
||||||
"github.com/alcionai/corso/src/pkg/credentials"
|
"github.com/alcionai/corso/src/pkg/credentials"
|
||||||
)
|
)
|
||||||
|
|
||||||
type S3CfgSuite struct {
|
type S3CfgUnitSuite struct {
|
||||||
suite.Suite
|
tester.Suite
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestS3CfgSuite(t *testing.T) {
|
func TestS3CfgUnitSuite(t *testing.T) {
|
||||||
suite.Run(t, new(S3CfgSuite))
|
suite.Run(t, &S3CfgUnitSuite{Suite: tester.NewUnitSuite(t)})
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -41,7 +42,7 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func (suite *S3CfgSuite) TestS3Config_Config() {
|
func (suite *S3CfgUnitSuite) TestS3Config_Config() {
|
||||||
s3 := goodS3Config
|
s3 := goodS3Config
|
||||||
|
|
||||||
c, err := s3.StringConfig()
|
c, err := s3.StringConfig()
|
||||||
@ -60,16 +61,16 @@ func (suite *S3CfgSuite) TestS3Config_Config() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *S3CfgSuite) TestStorage_S3Config() {
|
func (suite *S3CfgUnitSuite) TestStorage_S3Config() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
|
|
||||||
in := goodS3Config
|
in := goodS3Config
|
||||||
|
|
||||||
s, err := NewStorage(ProviderS3, &in)
|
s, err := NewStorage(ProviderS3, &in)
|
||||||
assert.NoError(t, err, clues.ToCore(err))
|
assert.NoError(t, err, clues.ToCore(err))
|
||||||
sc, err := s.StorageConfig()
|
|
||||||
|
out, err := s.ToS3Config()
|
||||||
assert.NoError(t, err, clues.ToCore(err))
|
assert.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
out := sc.(*S3Config)
|
|
||||||
assert.Equal(t, in.Bucket, out.Bucket)
|
assert.Equal(t, in.Bucket, out.Bucket)
|
||||||
assert.Equal(t, in.Endpoint, out.Endpoint)
|
assert.Equal(t, in.Endpoint, out.Endpoint)
|
||||||
assert.Equal(t, in.Prefix, out.Prefix)
|
assert.Equal(t, in.Prefix, out.Prefix)
|
||||||
@ -84,7 +85,7 @@ func makeTestS3Cfg(bkt, end, pre, access, secret, session string) S3Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *S3CfgSuite) TestStorage_S3Config_invalidCases() {
|
func (suite *S3CfgUnitSuite) TestStorage_S3Config_invalidCases() {
|
||||||
// missing required properties
|
// missing required properties
|
||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
@ -118,13 +119,14 @@ func (suite *S3CfgSuite) TestStorage_S3Config_invalidCases() {
|
|||||||
st, err := NewStorage(ProviderUnknown, &goodS3Config)
|
st, err := NewStorage(ProviderUnknown, &goodS3Config)
|
||||||
assert.NoError(t, err, clues.ToCore(err))
|
assert.NoError(t, err, clues.ToCore(err))
|
||||||
test.amend(st)
|
test.amend(st)
|
||||||
_, err = st.StorageConfig()
|
|
||||||
assert.Error(t, err)
|
_, err = st.ToS3Config()
|
||||||
|
assert.Error(t, err, clues.ToCore(err))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *S3CfgSuite) TestStorage_S3Config_StringConfig() {
|
func (suite *S3CfgUnitSuite) TestStorage_S3Config_StringConfig() {
|
||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
input S3Config
|
input S3Config
|
||||||
@ -178,7 +180,7 @@ func (suite *S3CfgSuite) TestStorage_S3Config_StringConfig() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *S3CfgSuite) TestStorage_S3Config_Normalize() {
|
func (suite *S3CfgUnitSuite) TestStorage_S3Config_Normalize() {
|
||||||
const (
|
const (
|
||||||
prefixedBkt = "s3://bkt"
|
prefixedBkt = "s3://bkt"
|
||||||
normalBkt = "bkt"
|
normalBkt = "bkt"
|
||||||
|
|||||||
@ -9,6 +9,8 @@ import (
|
|||||||
"github.com/alcionai/corso/src/internal/common"
|
"github.com/alcionai/corso/src/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ErrVerifyingConfigStorage = clues.New("verifying configs in corso config file")
|
||||||
|
|
||||||
type ProviderType int
|
type ProviderType int
|
||||||
|
|
||||||
//go:generate stringer -type=ProviderType -linecomment
|
//go:generate stringer -type=ProviderType -linecomment
|
||||||
@ -102,7 +104,7 @@ func (s Storage) StorageConfig() (Configurer, error) {
|
|||||||
return buildFilesystemConfigFromMap(s.Config)
|
return buildFilesystemConfigFromMap(s.Config)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, clues.New("unsupported storage provider: " + s.Provider.String())
|
return nil, clues.New("unsupported storage provider: [" + s.Provider.String() + "]")
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewStorageConfig(provider ProviderType) (Configurer, error) {
|
func NewStorageConfig(provider ProviderType) (Configurer, error) {
|
||||||
@ -113,7 +115,7 @@ func NewStorageConfig(provider ProviderType) (Configurer, error) {
|
|||||||
return &FilesystemConfig{}, nil
|
return &FilesystemConfig{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, clues.New("unsupported storage provider: " + provider.String())
|
return nil, clues.New("unsupported storage provider: [" + provider.String() + "]")
|
||||||
}
|
}
|
||||||
|
|
||||||
type Getter interface {
|
type Getter interface {
|
||||||
@ -167,7 +169,8 @@ func mustMatchConfig(
|
|||||||
|
|
||||||
vv := cast.ToString(g.Get(tomlK))
|
vv := cast.ToString(g.Get(tomlK))
|
||||||
if v != vv {
|
if v != vv {
|
||||||
return clues.New("value of " + k + " (" + v + ") does not match corso configuration value (" + vv + ")")
|
err := clues.New("value of " + k + " (" + v + ") does not match corso configuration value (" + vv + ")")
|
||||||
|
return clues.Stack(ErrVerifyingConfigStorage, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,8 @@ import (
|
|||||||
"github.com/alcionai/clues"
|
"github.com/alcionai/clues"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
|
"github.com/alcionai/corso/src/internal/tester"
|
||||||
)
|
)
|
||||||
|
|
||||||
type testConfig struct {
|
type testConfig struct {
|
||||||
@ -17,15 +19,15 @@ func (c testConfig) StringConfig() (map[string]string, error) {
|
|||||||
return map[string]string{"expect": c.expect}, c.err
|
return map[string]string{"expect": c.expect}, c.err
|
||||||
}
|
}
|
||||||
|
|
||||||
type StorageSuite struct {
|
type StorageUnitSuite struct {
|
||||||
suite.Suite
|
tester.Suite
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStorageSuite(t *testing.T) {
|
func TestStorageUnitSuite(t *testing.T) {
|
||||||
suite.Run(t, new(StorageSuite))
|
suite.Run(t, &StorageUnitSuite{Suite: tester.NewUnitSuite(t)})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *StorageSuite) TestNewStorage() {
|
func (suite *StorageUnitSuite) TestNewStorage() {
|
||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
p ProviderType
|
p ProviderType
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user