148 lines
3.2 KiB
Go
148 lines
3.2 KiB
Go
package external
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/ucloud/ucloud-sdk-go/ucloud"
|
|
"github.com/ucloud/ucloud-sdk-go/ucloud/auth"
|
|
)
|
|
|
|
// CredentialProvider is the provider to store and provide credential instance
|
|
type CredentialProvider interface {
|
|
Credential() *auth.Credential
|
|
}
|
|
|
|
// ClientConfigProvider is the provider to store and provide config instance
|
|
type ClientConfigProvider interface {
|
|
Config() *ucloud.Config
|
|
}
|
|
|
|
// ConfigProvider is the provider to store and provide config/credential instance
|
|
type ConfigProvider interface {
|
|
CredentialProvider
|
|
ClientConfigProvider
|
|
}
|
|
|
|
// config will read configuration
|
|
type config struct {
|
|
// Named profile
|
|
Profile string
|
|
SharedConfigFile string
|
|
SharedCredentialFile string
|
|
|
|
// Credential configuration
|
|
PublicKey string
|
|
PrivateKey string
|
|
SecurityToken string
|
|
CanExpire bool
|
|
Expires time.Time
|
|
|
|
// Client configuration
|
|
ProjectId string
|
|
Zone string
|
|
Region string
|
|
BaseUrl string
|
|
Timeout time.Duration
|
|
}
|
|
|
|
func newConfig() *config {
|
|
return &config{}
|
|
}
|
|
|
|
func (c *config) loadEnv() error {
|
|
cfg, err := loadEnvConfig()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = c.merge(cfg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *config) loadFileIfExist() error {
|
|
cfg, err := loadSharedConfigFile(
|
|
c.SharedConfigFile,
|
|
c.SharedCredentialFile,
|
|
c.Profile,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = c.merge(cfg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *config) merge(other *config) error {
|
|
if other == nil {
|
|
return nil
|
|
}
|
|
|
|
setStringify(&c.Profile, other.Profile)
|
|
setStringify(&c.SharedConfigFile, other.SharedConfigFile)
|
|
setStringify(&c.SharedCredentialFile, other.SharedCredentialFile)
|
|
setStringify(&c.PublicKey, other.PublicKey)
|
|
setStringify(&c.PrivateKey, other.PrivateKey)
|
|
setStringify(&c.ProjectId, other.ProjectId)
|
|
setStringify(&c.Zone, other.Zone)
|
|
setStringify(&c.Region, other.Region)
|
|
setStringify(&c.BaseUrl, other.BaseUrl)
|
|
if other.Timeout != time.Duration(0) {
|
|
c.Timeout = other.Timeout
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Config is the configuration of ucloud client
|
|
func (c *config) Config() *ucloud.Config {
|
|
cfg := ucloud.NewConfig()
|
|
setStringify(&cfg.ProjectId, c.ProjectId)
|
|
setStringify(&cfg.Zone, c.Zone)
|
|
setStringify(&cfg.Region, c.Region)
|
|
setStringify(&cfg.BaseUrl, c.BaseUrl)
|
|
|
|
if c.Timeout != time.Duration(0) {
|
|
cfg.Timeout = c.Timeout
|
|
}
|
|
return &cfg
|
|
}
|
|
|
|
// Credential is the configuration of ucloud authorization information
|
|
func (c *config) Credential() *auth.Credential {
|
|
cred := auth.NewCredential()
|
|
setStringify(&cred.PublicKey, c.PublicKey)
|
|
setStringify(&cred.PrivateKey, c.PrivateKey)
|
|
setStringify(&cred.SecurityToken, c.SecurityToken)
|
|
cred.CanExpire = c.CanExpire
|
|
cred.Expires = c.Expires
|
|
return &cred
|
|
}
|
|
|
|
// LoadDefaultUCloudConfig is the default loader to load config
|
|
func LoadDefaultUCloudConfig() (ConfigProvider, error) {
|
|
cfg := newConfig()
|
|
|
|
if err := cfg.loadEnv(); err != nil {
|
|
return nil, fmt.Errorf("error on loading env, %s", err)
|
|
}
|
|
|
|
if err := cfg.loadFileIfExist(); err != nil {
|
|
return nil, fmt.Errorf("error on loading shared config file, %s", err)
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|
|
|
|
func setStringify(p *string, s string) {
|
|
if p != nil && len(s) != 0 {
|
|
*p = s
|
|
}
|
|
}
|