remove repository.Account (#229)
* remove repository.Account Now that account.Account exists, we can replace the deprecated repository.Account struct with the account version.
This commit is contained in:
parent
902294b70d
commit
108065df75
@ -8,7 +8,6 @@ import (
|
|||||||
|
|
||||||
"github.com/alcionai/corso/cli/config"
|
"github.com/alcionai/corso/cli/config"
|
||||||
"github.com/alcionai/corso/cli/utils"
|
"github.com/alcionai/corso/cli/utils"
|
||||||
"github.com/alcionai/corso/pkg/credentials"
|
|
||||||
"github.com/alcionai/corso/pkg/logger"
|
"github.com/alcionai/corso/pkg/logger"
|
||||||
"github.com/alcionai/corso/pkg/repository"
|
"github.com/alcionai/corso/pkg/repository"
|
||||||
)
|
)
|
||||||
@ -47,19 +46,14 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
s, cfgTenantID, err := config.MakeS3Config(true, nil)
|
s, acct, err := config.GetStorageAndAccount(true, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
m365 := credentials.GetM365()
|
m365, err := acct.M365Config()
|
||||||
a := repository.Account{
|
if err != nil {
|
||||||
TenantID: m365.TenantID,
|
return errors.Wrap(err, "Failed to parse m365 account config")
|
||||||
ClientID: m365.ClientID,
|
|
||||||
ClientSecret: m365.ClientSecret,
|
|
||||||
}
|
|
||||||
if len(cfgTenantID) > 0 {
|
|
||||||
a.TenantID = cfgTenantID
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Ctx(ctx).Debugw(
|
logger.Ctx(ctx).Debugw(
|
||||||
@ -68,7 +62,7 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
|
|||||||
"clientID", m365.ClientID,
|
"clientID", m365.ClientID,
|
||||||
"hasClientSecret", len(m365.ClientSecret) > 0)
|
"hasClientSecret", len(m365.ClientSecret) > 0)
|
||||||
|
|
||||||
r, err := repository.Connect(ctx, a, s)
|
r, err := repository.Connect(ctx, acct, s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "Failed to connect to the %s repository", s.Provider)
|
return errors.Wrapf(err, "Failed to connect to the %s repository", s.Provider)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,8 +9,8 @@ import (
|
|||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
|
|
||||||
"github.com/alcionai/corso/cli/utils"
|
"github.com/alcionai/corso/cli/utils"
|
||||||
|
"github.com/alcionai/corso/pkg/account"
|
||||||
"github.com/alcionai/corso/pkg/credentials"
|
"github.com/alcionai/corso/pkg/credentials"
|
||||||
"github.com/alcionai/corso/pkg/repository"
|
|
||||||
"github.com/alcionai/corso/pkg/storage"
|
"github.com/alcionai/corso/pkg/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ func InitConfig(configFilePath string) error {
|
|||||||
|
|
||||||
// WriteRepoConfig currently just persists corso config to the config file
|
// WriteRepoConfig currently just persists corso config to the config file
|
||||||
// It does not check for conflicts or existing data.
|
// It does not check for conflicts or existing data.
|
||||||
func WriteRepoConfig(s3Config storage.S3Config, account repository.Account) error {
|
func WriteRepoConfig(s3Config storage.S3Config, account account.M365Config) error {
|
||||||
// Rudimentary support for persisting repo config
|
// Rudimentary support for persisting repo config
|
||||||
// TODO: Handle conflicts, support other config types
|
// TODO: Handle conflicts, support other config types
|
||||||
viper.Set(ProviderTypeKey, storage.ProviderS3.String())
|
viper.Set(ProviderTypeKey, storage.ProviderS3.String())
|
||||||
@ -79,44 +79,61 @@ func WriteRepoConfig(s3Config storage.S3Config, account repository.Account) erro
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadRepoConfig() (s3Config storage.S3Config, account repository.Account, err error) {
|
func ReadRepoConfig() (storage.S3Config, account.Account, error) {
|
||||||
|
var (
|
||||||
|
s3Config storage.S3Config
|
||||||
|
acct account.Account
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
if err = viper.ReadInConfig(); err != nil {
|
if err = viper.ReadInConfig(); err != nil {
|
||||||
return s3Config, account, errors.Wrap(err, "reading config file: "+viper.ConfigFileUsed())
|
return s3Config, acct, errors.Wrap(err, "reading config file: "+viper.ConfigFileUsed())
|
||||||
}
|
}
|
||||||
|
|
||||||
if providerType := viper.GetString(ProviderTypeKey); providerType != storage.ProviderS3.String() {
|
if providerType := viper.GetString(ProviderTypeKey); providerType != storage.ProviderS3.String() {
|
||||||
return s3Config, account, errors.New("Unsupported storage provider: " + providerType)
|
return s3Config, acct, errors.New("Unsupported storage provider: " + providerType)
|
||||||
}
|
}
|
||||||
|
|
||||||
s3Config.Bucket = viper.GetString(BucketNameKey)
|
s3Config.Bucket = viper.GetString(BucketNameKey)
|
||||||
s3Config.Endpoint = viper.GetString(EndpointKey)
|
s3Config.Endpoint = viper.GetString(EndpointKey)
|
||||||
s3Config.Prefix = viper.GetString(PrefixKey)
|
s3Config.Prefix = viper.GetString(PrefixKey)
|
||||||
account.TenantID = viper.GetString(TenantIDKey)
|
|
||||||
|
|
||||||
return s3Config, account, nil
|
m365Creds := credentials.GetM365()
|
||||||
|
cfgTenantID := viper.GetString(TenantIDKey)
|
||||||
|
if len(cfgTenantID) > 0 {
|
||||||
|
m365Creds.TenantID = cfgTenantID
|
||||||
|
}
|
||||||
|
acct, err = account.NewAccount(
|
||||||
|
account.ProviderM365,
|
||||||
|
account.M365Config{
|
||||||
|
M365: m365Creds,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
return s3Config, acct, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// MakeS3Config creates a storage instance by mediating all the possible
|
// GetStorageAndAccount creates a storage and account instance by mediating all the possible
|
||||||
// data sources (config file, env vars, flag overrides) in the config.
|
// data sources (config file, env vars, flag overrides) and the config file.
|
||||||
func MakeS3Config(readFromFile bool, overrides map[string]string) (storage.Storage, string, error) {
|
func GetStorageAndAccount(readFromFile bool, overrides map[string]string) (storage.Storage, account.Account, error) {
|
||||||
var (
|
var (
|
||||||
s3Cfg storage.S3Config
|
s3Cfg storage.S3Config
|
||||||
account repository.Account
|
acct account.Account
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
// possibly read the prior config from a .corso file
|
// possibly read the prior config from a .corso file
|
||||||
if readFromFile {
|
if readFromFile {
|
||||||
s3Cfg, account, err = ReadRepoConfig()
|
s3Cfg, acct, err = ReadRepoConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return storage.Storage{}, "", errors.Wrap(err, "reading corso config file")
|
return storage.Storage{}, acct, errors.Wrap(err, "reading corso config file")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// compose the s3 storage config and credentials
|
// compose the s3 storage config and credentials
|
||||||
aws := credentials.GetAWS(overrides)
|
aws := credentials.GetAWS(overrides)
|
||||||
if err := aws.Validate(); err != nil {
|
if err := aws.Validate(); err != nil {
|
||||||
return storage.Storage{}, "", errors.Wrap(err, "validating aws credentials")
|
return storage.Storage{}, acct, errors.Wrap(err, "validating aws credentials")
|
||||||
}
|
}
|
||||||
s3Cfg = storage.S3Config{
|
s3Cfg = storage.S3Config{
|
||||||
AWS: aws,
|
AWS: aws,
|
||||||
@ -128,7 +145,7 @@ func MakeS3Config(readFromFile bool, overrides map[string]string) (storage.Stora
|
|||||||
// compose the common config and credentials
|
// compose the common config and credentials
|
||||||
corso := credentials.GetCorso()
|
corso := credentials.GetCorso()
|
||||||
if err := corso.Validate(); err != nil {
|
if err := corso.Validate(); err != nil {
|
||||||
return storage.Storage{}, "", errors.Wrap(err, "validating corso credentials")
|
return storage.Storage{}, acct, errors.Wrap(err, "validating corso credentials")
|
||||||
}
|
}
|
||||||
cCfg := storage.CommonConfig{
|
cCfg := storage.CommonConfig{
|
||||||
Corso: corso,
|
Corso: corso,
|
||||||
@ -142,15 +159,15 @@ func MakeS3Config(readFromFile bool, overrides map[string]string) (storage.Stora
|
|||||||
credentials.AWSSessionToken: aws.SessionToken,
|
credentials.AWSSessionToken: aws.SessionToken,
|
||||||
credentials.CorsoPassword: corso.CorsoPassword,
|
credentials.CorsoPassword: corso.CorsoPassword,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return storage.Storage{}, "", err
|
return storage.Storage{}, acct, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// return a complete storage
|
// return a complete storage
|
||||||
s, err := storage.NewStorage(storage.ProviderS3, s3Cfg, cCfg)
|
s, err := storage.NewStorage(storage.ProviderS3, s3Cfg, cCfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return storage.Storage{}, "", errors.Wrap(err, "configuring repository storage")
|
return storage.Storage{}, acct, errors.Wrap(err, "configuring repository storage")
|
||||||
}
|
}
|
||||||
return s, account.TenantID, nil
|
return s, acct, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns the first non-zero valued string
|
// returns the first non-zero valued string
|
||||||
|
|||||||
@ -8,10 +8,11 @@ import (
|
|||||||
|
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
"github.com/alcionai/corso/cli/config"
|
"github.com/alcionai/corso/cli/config"
|
||||||
"github.com/alcionai/corso/pkg/repository"
|
ctesting "github.com/alcionai/corso/internal/testing"
|
||||||
"github.com/alcionai/corso/pkg/storage"
|
"github.com/alcionai/corso/pkg/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -49,7 +50,10 @@ func (suite *ConfigSuite) TestReadRepoConfigBasic() {
|
|||||||
s3Cfg, account, err := config.ReadRepoConfig()
|
s3Cfg, account, err := config.ReadRepoConfig()
|
||||||
assert.NoError(suite.T(), err)
|
assert.NoError(suite.T(), err)
|
||||||
assert.Equal(suite.T(), b, s3Cfg.Bucket)
|
assert.Equal(suite.T(), b, s3Cfg.Bucket)
|
||||||
assert.Equal(suite.T(), tID, account.TenantID)
|
|
||||||
|
m365, err := account.M365Config()
|
||||||
|
require.NoError(suite.T(), err)
|
||||||
|
assert.Equal(suite.T(), tID, m365.TenantID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *ConfigSuite) TestWriteReadConfig() {
|
func (suite *ConfigSuite) TestWriteReadConfig() {
|
||||||
@ -60,12 +64,16 @@ func (suite *ConfigSuite) TestWriteReadConfig() {
|
|||||||
assert.NoError(suite.T(), err)
|
assert.NoError(suite.T(), err)
|
||||||
|
|
||||||
s3Cfg := storage.S3Config{Bucket: "write-read-config-bucket"}
|
s3Cfg := storage.S3Config{Bucket: "write-read-config-bucket"}
|
||||||
account := repository.Account{TenantID: "6f34ac30-8196-469b-bf8f-d83deadbbbbd"}
|
acct, err := ctesting.NewM365Account()
|
||||||
err = config.WriteRepoConfig(s3Cfg, account)
|
require.NoError(suite.T(), err)
|
||||||
|
m365, err := acct.M365Config()
|
||||||
|
require.NoError(suite.T(), err)
|
||||||
|
|
||||||
|
err = config.WriteRepoConfig(s3Cfg, m365)
|
||||||
assert.NoError(suite.T(), err)
|
assert.NoError(suite.T(), err)
|
||||||
|
|
||||||
readS3Cfg, readAccount, err := config.ReadRepoConfig()
|
readS3Cfg, readAccount, err := config.ReadRepoConfig()
|
||||||
assert.NoError(suite.T(), err)
|
assert.NoError(suite.T(), err)
|
||||||
assert.Equal(suite.T(), s3Cfg, readS3Cfg)
|
assert.Equal(suite.T(), s3Cfg, readS3Cfg)
|
||||||
assert.Equal(suite.T(), account, readAccount)
|
assert.Equal(suite.T(), acct, readAccount)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,7 +65,7 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
storage.Endpoint: endpoint,
|
storage.Endpoint: endpoint,
|
||||||
storage.Prefix: prefix,
|
storage.Prefix: prefix,
|
||||||
}
|
}
|
||||||
s, cfgTenantID, err := config.MakeS3Config(false, overrides)
|
s, a, err := config.GetStorageAndAccount(false, overrides)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -74,14 +74,9 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
return errors.Wrap(err, "Retrieving s3 configuration")
|
return errors.Wrap(err, "Retrieving s3 configuration")
|
||||||
}
|
}
|
||||||
|
|
||||||
m365 := credentials.GetM365()
|
m365, err := a.M365Config()
|
||||||
a := repository.Account{
|
if err != nil {
|
||||||
TenantID: m365.TenantID,
|
return errors.Wrap(err, "Failed to parse m365 account config")
|
||||||
ClientID: m365.ClientID,
|
|
||||||
ClientSecret: m365.ClientSecret,
|
|
||||||
}
|
|
||||||
if len(cfgTenantID) > 0 {
|
|
||||||
a.TenantID = cfgTenantID
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugw(
|
log.Debugw(
|
||||||
@ -100,7 +95,7 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
fmt.Printf("Initialized a S3 repository within bucket %s.\n", s3Cfg.Bucket)
|
fmt.Printf("Initialized a S3 repository within bucket %s.\n", s3Cfg.Bucket)
|
||||||
|
|
||||||
if err = config.WriteRepoConfig(s3Cfg, a); err != nil {
|
if err = config.WriteRepoConfig(s3Cfg, m365); err != nil {
|
||||||
return errors.Wrap(err, "Failed to write repository configuration")
|
return errors.Wrap(err, "Failed to write repository configuration")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -130,7 +125,7 @@ func connectS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
storage.Endpoint: endpoint,
|
storage.Endpoint: endpoint,
|
||||||
storage.Prefix: prefix,
|
storage.Prefix: prefix,
|
||||||
}
|
}
|
||||||
s, cfgTenantID, err := config.MakeS3Config(true, overrides)
|
s, a, err := config.GetStorageAndAccount(true, overrides)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -138,15 +133,9 @@ func connectS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Retrieving s3 configuration")
|
return errors.Wrap(err, "Retrieving s3 configuration")
|
||||||
}
|
}
|
||||||
|
m365, err := a.M365Config()
|
||||||
m365 := credentials.GetM365()
|
if err != nil {
|
||||||
a := repository.Account{
|
return errors.Wrap(err, "Failed to parse m365 account config")
|
||||||
TenantID: m365.TenantID,
|
|
||||||
ClientID: m365.ClientID,
|
|
||||||
ClientSecret: m365.ClientSecret,
|
|
||||||
}
|
|
||||||
if len(cfgTenantID) > 0 {
|
|
||||||
a.TenantID = cfgTenantID
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugw(
|
log.Debugw(
|
||||||
@ -165,7 +154,7 @@ func connectS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
fmt.Printf("Connected to S3 bucket %s.\n", s3Cfg.Bucket)
|
fmt.Printf("Connected to S3 bucket %s.\n", s3Cfg.Bucket)
|
||||||
|
|
||||||
if err = config.WriteRepoConfig(s3Cfg, a); err != nil {
|
if err = config.WriteRepoConfig(s3Cfg, m365); err != nil {
|
||||||
return errors.Wrap(err, "Failed to write repository configuration")
|
return errors.Wrap(err, "Failed to write repository configuration")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import (
|
|||||||
|
|
||||||
"github.com/alcionai/corso/cli/config"
|
"github.com/alcionai/corso/cli/config"
|
||||||
"github.com/alcionai/corso/cli/utils"
|
"github.com/alcionai/corso/cli/utils"
|
||||||
"github.com/alcionai/corso/pkg/credentials"
|
|
||||||
"github.com/alcionai/corso/pkg/logger"
|
"github.com/alcionai/corso/pkg/logger"
|
||||||
"github.com/alcionai/corso/pkg/repository"
|
"github.com/alcionai/corso/pkg/repository"
|
||||||
)
|
)
|
||||||
@ -55,19 +54,14 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
|
|||||||
return errors.Wrap(err, "Missing required flags")
|
return errors.Wrap(err, "Missing required flags")
|
||||||
}
|
}
|
||||||
|
|
||||||
s, cfgTenantID, err := config.MakeS3Config(true, nil)
|
s, a, err := config.GetStorageAndAccount(true, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
m365 := credentials.GetM365()
|
m365, err := a.M365Config()
|
||||||
a := repository.Account{
|
if err != nil {
|
||||||
TenantID: m365.TenantID,
|
return errors.Wrap(err, "Failed to parse m365 account config")
|
||||||
ClientID: m365.ClientID,
|
|
||||||
ClientSecret: m365.ClientSecret,
|
|
||||||
}
|
|
||||||
if len(cfgTenantID) > 0 {
|
|
||||||
a.TenantID = cfgTenantID
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Ctx(ctx).Debugw(
|
logger.Ctx(ctx).Debugw(
|
||||||
@ -83,7 +77,7 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
|
|||||||
}
|
}
|
||||||
defer utils.CloseRepo(ctx, r)
|
defer utils.CloseRepo(ctx, r)
|
||||||
|
|
||||||
ro, err := r.NewRestore(ctx, restorePointID, []string{cfgTenantID, user, "mail", folder, mail})
|
ro, err := r.NewRestore(ctx, restorePointID, []string{m365.TenantID, user, "mail", folder, mail})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Failed to initialize Exchange restore")
|
return errors.Wrap(err, "Failed to initialize Exchange restore")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,7 @@ require (
|
|||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
github.com/hashicorp/go-multierror v1.1.1
|
github.com/hashicorp/go-multierror v1.1.1
|
||||||
github.com/kopia/kopia v0.10.7
|
github.com/kopia/kopia v0.10.7
|
||||||
github.com/microsoft/kiota-abstractions-go v0.8.0
|
github.com/microsoft/kiota-abstractions-go v0.8.1
|
||||||
github.com/microsoft/kiota-authentication-azure-go v0.3.0
|
github.com/microsoft/kiota-authentication-azure-go v0.3.0
|
||||||
github.com/microsoft/kiota-serialization-json-go v0.5.1
|
github.com/microsoft/kiota-serialization-json-go v0.5.1
|
||||||
github.com/microsoftgraph/msgraph-sdk-go v0.25.0
|
github.com/microsoftgraph/msgraph-sdk-go v0.25.0
|
||||||
@ -42,7 +42,7 @@ require (
|
|||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||||
github.com/chmduquesne/rollinghash v4.0.0+incompatible // indirect
|
github.com/chmduquesne/rollinghash v4.0.0+incompatible // indirect
|
||||||
github.com/cjlapao/common-go v0.0.20 // indirect
|
github.com/cjlapao/common-go v0.0.21 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/dustin/go-humanize v1.0.0 // indirect
|
github.com/dustin/go-humanize v1.0.0 // indirect
|
||||||
github.com/edsrzf/mmap-go v1.1.0 // indirect
|
github.com/edsrzf/mmap-go v1.1.0 // indirect
|
||||||
|
|||||||
@ -70,6 +70,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
|
|||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
github.com/cjlapao/common-go v0.0.20 h1:AIZBtuxwJPXFqyxFOlvVDWZgbsuTSquZEUw4KMx8pNg=
|
github.com/cjlapao/common-go v0.0.20 h1:AIZBtuxwJPXFqyxFOlvVDWZgbsuTSquZEUw4KMx8pNg=
|
||||||
github.com/cjlapao/common-go v0.0.20/go.mod h1:EVLEXIxsBHblPMrhJYOvL4yBCcBj7IYDdW88VlfxpPM=
|
github.com/cjlapao/common-go v0.0.20/go.mod h1:EVLEXIxsBHblPMrhJYOvL4yBCcBj7IYDdW88VlfxpPM=
|
||||||
|
github.com/cjlapao/common-go v0.0.21 h1:z4PDFLQG4pJxHEmM8ecmnjDgTcR0Xr/30WZiNZF2oYM=
|
||||||
|
github.com/cjlapao/common-go v0.0.21/go.mod h1:QHUcl8KX3RgNVonFJ1WpW4mlr9NyWOHmzqxaRbwooPo=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
@ -238,6 +240,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0j
|
|||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/microsoft/kiota-abstractions-go v0.8.0 h1:mtilyDlfM9EUe4blByCmQh/iO7S0176zHd+oxr7rh20=
|
github.com/microsoft/kiota-abstractions-go v0.8.0 h1:mtilyDlfM9EUe4blByCmQh/iO7S0176zHd+oxr7rh20=
|
||||||
github.com/microsoft/kiota-abstractions-go v0.8.0/go.mod h1:uWv0yQ4lYJtK9NIK5RAmw/LeIMUbIG0asu36v4yjyjY=
|
github.com/microsoft/kiota-abstractions-go v0.8.0/go.mod h1:uWv0yQ4lYJtK9NIK5RAmw/LeIMUbIG0asu36v4yjyjY=
|
||||||
|
github.com/microsoft/kiota-abstractions-go v0.8.1 h1:ACCwRwddJYOx+SRqfgcR8Wo8PZTd4g+JMa8lY8ABy+4=
|
||||||
|
github.com/microsoft/kiota-abstractions-go v0.8.1/go.mod h1:05aCidCKhzer+yfhGeePaMUY3MH+wrAkQztBVEreTtc=
|
||||||
github.com/microsoft/kiota-authentication-azure-go v0.3.0 h1:iLyy5qldAjBiYMGMk1r/rJkcmARA8cKboiN7/XbRxv4=
|
github.com/microsoft/kiota-authentication-azure-go v0.3.0 h1:iLyy5qldAjBiYMGMk1r/rJkcmARA8cKboiN7/XbRxv4=
|
||||||
github.com/microsoft/kiota-authentication-azure-go v0.3.0/go.mod h1:qyZWSCug2eG1zrRnCSacyFHGsgQa4aSCWn3EOkY9Z1M=
|
github.com/microsoft/kiota-authentication-azure-go v0.3.0/go.mod h1:qyZWSCug2eG1zrRnCSacyFHGsgQa4aSCWn3EOkY9Z1M=
|
||||||
github.com/microsoft/kiota-http-go v0.5.0 h1:p88Jz3Puk2ycwiLBhO/L7fygje+ACT2qvN2gKHfMSLE=
|
github.com/microsoft/kiota-http-go v0.5.0 h1:p88Jz3Puk2ycwiLBhO/L7fygje+ACT2qvN2gKHfMSLE=
|
||||||
|
|||||||
@ -71,12 +71,8 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run() {
|
|||||||
// not the user we want to use, but all the others are
|
// not the user we want to use, but all the others are
|
||||||
// suffering from JsonParseNode syndrome
|
// suffering from JsonParseNode syndrome
|
||||||
m365User := "george.martinez@8qzvrj.onmicrosoft.com"
|
m365User := "george.martinez@8qzvrj.onmicrosoft.com"
|
||||||
m365 := credentials.GetM365()
|
acct, err := ctesting.NewM365Account()
|
||||||
acct := repository.Account{
|
require.NoError(t, err)
|
||||||
ClientID: m365.ClientID,
|
|
||||||
ClientSecret: m365.ClientSecret,
|
|
||||||
TenantID: m365.TenantID,
|
|
||||||
}
|
|
||||||
|
|
||||||
// need to initialize the repository before we can test connecting to it.
|
// need to initialize the repository before we can test connecting to it.
|
||||||
st, err := ctesting.NewPrefixedS3Storage(t)
|
st, err := ctesting.NewPrefixedS3Storage(t)
|
||||||
|
|||||||
23
src/internal/testing/account.go
Normal file
23
src/internal/testing/account.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package testing
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/alcionai/corso/pkg/account"
|
||||||
|
"github.com/alcionai/corso/pkg/credentials"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewM365Account returns an account.Account object initialized with environment
|
||||||
|
// variables used for integration tests that use Graph Connector.
|
||||||
|
func NewM365Account() (account.Account, error) {
|
||||||
|
// todo (keepers) include account details in test config
|
||||||
|
// cfg, err := readTestConfig()
|
||||||
|
// if err != nil {
|
||||||
|
// return account.Account{}, errors.Wrap(err, "configuring m365 account from test file")
|
||||||
|
// }
|
||||||
|
|
||||||
|
return account.NewAccount(
|
||||||
|
account.ProviderM365,
|
||||||
|
account.M365Config{
|
||||||
|
M365: credentials.GetM365(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
@ -9,6 +9,7 @@ import (
|
|||||||
|
|
||||||
"github.com/alcionai/corso/internal/kopia"
|
"github.com/alcionai/corso/internal/kopia"
|
||||||
"github.com/alcionai/corso/internal/operations"
|
"github.com/alcionai/corso/internal/operations"
|
||||||
|
"github.com/alcionai/corso/pkg/account"
|
||||||
"github.com/alcionai/corso/pkg/credentials"
|
"github.com/alcionai/corso/pkg/credentials"
|
||||||
"github.com/alcionai/corso/pkg/storage"
|
"github.com/alcionai/corso/pkg/storage"
|
||||||
)
|
)
|
||||||
@ -19,18 +20,11 @@ type Repository struct {
|
|||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
Version string // in case of future breaking changes
|
Version string // in case of future breaking changes
|
||||||
|
|
||||||
Account Account // the user's m365 account connection details
|
Account account.Account // the user's m365 account connection details
|
||||||
Storage storage.Storage // the storage provider details and configuration
|
Storage storage.Storage // the storage provider details and configuration
|
||||||
dataLayer *kopia.KopiaWrapper
|
dataLayer *kopia.KopiaWrapper
|
||||||
}
|
}
|
||||||
|
|
||||||
// Account holds the user's m365 account details.
|
|
||||||
type Account struct {
|
|
||||||
TenantID string
|
|
||||||
ClientID string
|
|
||||||
ClientSecret string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize will:
|
// Initialize will:
|
||||||
// * validate the m365 account & secrets
|
// * validate the m365 account & secrets
|
||||||
// * connect to the m365 account to ensure communication capability
|
// * connect to the m365 account to ensure communication capability
|
||||||
@ -41,7 +35,7 @@ type Account struct {
|
|||||||
// * return the connected repository
|
// * return the connected repository
|
||||||
func Initialize(
|
func Initialize(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
acct Account,
|
acct account.Account,
|
||||||
storage storage.Storage,
|
storage storage.Storage,
|
||||||
) (*Repository, error) {
|
) (*Repository, error) {
|
||||||
k := kopia.New(storage)
|
k := kopia.New(storage)
|
||||||
@ -65,7 +59,7 @@ func Initialize(
|
|||||||
// * return the connected repository
|
// * return the connected repository
|
||||||
func Connect(
|
func Connect(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
acct Account,
|
acct account.Account,
|
||||||
storage storage.Storage,
|
storage storage.Storage,
|
||||||
) (*Repository, error) {
|
) (*Repository, error) {
|
||||||
k := kopia.New(storage)
|
k := kopia.New(storage)
|
||||||
@ -99,10 +93,14 @@ func (r *Repository) Close(ctx context.Context) error {
|
|||||||
|
|
||||||
// NewBackup generates a backupOperation runner.
|
// NewBackup generates a backupOperation runner.
|
||||||
func (r Repository) NewBackup(ctx context.Context, targets []string) (operations.BackupOperation, error) {
|
func (r Repository) NewBackup(ctx context.Context, targets []string) (operations.BackupOperation, error) {
|
||||||
|
m365, err := r.Account.M365Config()
|
||||||
|
if err != nil {
|
||||||
|
return operations.BackupOperation{}, errors.Wrap(err, "retrieving m365 account credentials")
|
||||||
|
}
|
||||||
creds := credentials.M365{
|
creds := credentials.M365{
|
||||||
ClientID: r.Account.ClientID,
|
ClientID: m365.ClientID,
|
||||||
ClientSecret: r.Account.ClientSecret,
|
ClientSecret: m365.ClientSecret,
|
||||||
TenantID: r.Account.TenantID,
|
TenantID: m365.TenantID,
|
||||||
}
|
}
|
||||||
return operations.NewBackupOperation(
|
return operations.NewBackupOperation(
|
||||||
ctx,
|
ctx,
|
||||||
@ -114,10 +112,14 @@ func (r Repository) NewBackup(ctx context.Context, targets []string) (operations
|
|||||||
|
|
||||||
// NewRestore generates a restoreOperation runner.
|
// NewRestore generates a restoreOperation runner.
|
||||||
func (r Repository) NewRestore(ctx context.Context, restorePointID string, targets []string) (operations.RestoreOperation, error) {
|
func (r Repository) NewRestore(ctx context.Context, restorePointID string, targets []string) (operations.RestoreOperation, error) {
|
||||||
|
m365, err := r.Account.M365Config()
|
||||||
|
if err != nil {
|
||||||
|
return operations.RestoreOperation{}, errors.Wrap(err, "retrieving m365 account credentials")
|
||||||
|
}
|
||||||
creds := credentials.M365{
|
creds := credentials.M365{
|
||||||
ClientID: r.Account.ClientID,
|
ClientID: m365.ClientID,
|
||||||
ClientSecret: r.Account.ClientSecret,
|
ClientSecret: m365.ClientSecret,
|
||||||
TenantID: r.Account.TenantID,
|
TenantID: m365.TenantID,
|
||||||
}
|
}
|
||||||
return operations.NewRestoreOperation(
|
return operations.NewRestoreOperation(
|
||||||
ctx,
|
ctx,
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
ctesting "github.com/alcionai/corso/internal/testing"
|
ctesting "github.com/alcionai/corso/internal/testing"
|
||||||
"github.com/alcionai/corso/pkg/credentials"
|
"github.com/alcionai/corso/pkg/account"
|
||||||
"github.com/alcionai/corso/pkg/repository"
|
"github.com/alcionai/corso/pkg/repository"
|
||||||
"github.com/alcionai/corso/pkg/storage"
|
"github.com/alcionai/corso/pkg/storage"
|
||||||
)
|
)
|
||||||
@ -30,7 +30,7 @@ func (suite *RepositorySuite) TestInitialize() {
|
|||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
storage func() (storage.Storage, error)
|
storage func() (storage.Storage, error)
|
||||||
account repository.Account
|
account account.Account
|
||||||
errCheck assert.ErrorAssertionFunc
|
errCheck assert.ErrorAssertionFunc
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
@ -38,7 +38,7 @@ func (suite *RepositorySuite) TestInitialize() {
|
|||||||
func() (storage.Storage, error) {
|
func() (storage.Storage, error) {
|
||||||
return storage.NewStorage(storage.ProviderUnknown)
|
return storage.NewStorage(storage.ProviderUnknown)
|
||||||
},
|
},
|
||||||
repository.Account{},
|
account.Account{},
|
||||||
assert.Error,
|
assert.Error,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -58,7 +58,7 @@ func (suite *RepositorySuite) TestConnect() {
|
|||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
storage func() (storage.Storage, error)
|
storage func() (storage.Storage, error)
|
||||||
account repository.Account
|
account account.Account
|
||||||
errCheck assert.ErrorAssertionFunc
|
errCheck assert.ErrorAssertionFunc
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
@ -66,7 +66,7 @@ func (suite *RepositorySuite) TestConnect() {
|
|||||||
func() (storage.Storage, error) {
|
func() (storage.Storage, error) {
|
||||||
return storage.NewStorage(storage.ProviderUnknown)
|
return storage.NewStorage(storage.ProviderUnknown)
|
||||||
},
|
},
|
||||||
repository.Account{},
|
account.Account{},
|
||||||
assert.Error,
|
assert.Error,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -109,7 +109,7 @@ func (suite *RepositoryIntegrationSuite) TestInitialize() {
|
|||||||
|
|
||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
account repository.Account
|
account account.Account
|
||||||
storage func(*testing.T) (storage.Storage, error)
|
storage func(*testing.T) (storage.Storage, error)
|
||||||
errCheck assert.ErrorAssertionFunc
|
errCheck assert.ErrorAssertionFunc
|
||||||
}{
|
}{
|
||||||
@ -143,11 +143,11 @@ func (suite *RepositoryIntegrationSuite) TestConnect() {
|
|||||||
st, err := ctesting.NewPrefixedS3Storage(t)
|
st, err := ctesting.NewPrefixedS3Storage(t)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = repository.Initialize(ctx, repository.Account{}, st)
|
_, err = repository.Initialize(ctx, account.Account{}, st)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// now re-connect
|
// now re-connect
|
||||||
_, err = repository.Connect(ctx, repository.Account{}, st)
|
_, err = repository.Connect(ctx, account.Account{}, st)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,12 +155,8 @@ func (suite *RepositoryIntegrationSuite) TestNewBackup() {
|
|||||||
t := suite.T()
|
t := suite.T()
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
m365 := credentials.GetM365()
|
acct, err := ctesting.NewM365Account()
|
||||||
acct := repository.Account{
|
require.NoError(t, err)
|
||||||
ClientID: m365.ClientID,
|
|
||||||
ClientSecret: m365.ClientSecret,
|
|
||||||
TenantID: m365.TenantID,
|
|
||||||
}
|
|
||||||
|
|
||||||
// need to initialize the repository before we can test connecting to it.
|
// need to initialize the repository before we can test connecting to it.
|
||||||
st, err := ctesting.NewPrefixedS3Storage(t)
|
st, err := ctesting.NewPrefixedS3Storage(t)
|
||||||
@ -178,12 +174,8 @@ func (suite *RepositoryIntegrationSuite) TestNewRestore() {
|
|||||||
t := suite.T()
|
t := suite.T()
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
m365 := credentials.GetM365()
|
acct, err := ctesting.NewM365Account()
|
||||||
acct := repository.Account{
|
require.NoError(t, err)
|
||||||
ClientID: m365.ClientID,
|
|
||||||
ClientSecret: m365.ClientSecret,
|
|
||||||
TenantID: m365.TenantID,
|
|
||||||
}
|
|
||||||
|
|
||||||
// need to initialize the repository before we can test connecting to it.
|
// need to initialize the repository before we can test connecting to it.
|
||||||
st, err := ctesting.NewPrefixedS3Storage(t)
|
st, err := ctesting.NewPrefixedS3Storage(t)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user