| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- package alibaba
- import (
- "fmt"
- "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
- "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
- "github.com/opencost/opencost/core/pkg/util/json"
- "github.com/opencost/opencost/pkg/cloud"
- )
- const AccessKeyAuthorizerType = "AlibabaAccessKey"
- // Authorizer provide *bssopenapi.Client for Alibaba cloud BOS for Billing related SDK calls
- type Authorizer interface {
- cloud.Authorizer
- GetCredentials() (auth.Credential, error)
- }
- // SelectAuthorizerByType is an implementation of AuthorizerSelectorFn and acts as a register for Authorizer types
- func SelectAuthorizerByType(typeStr string) (Authorizer, error) {
- switch typeStr {
- case AccessKeyAuthorizerType:
- return &AccessKey{}, nil
- default:
- return nil, fmt.Errorf("alibaba: provider authorizer type '%s' is not valid", typeStr)
- }
- }
- // AccessKey holds Alibaba credentials parsing from the service-key.json file.
- type AccessKey struct {
- AccessKeyID string `json:"accessKeyID"`
- AccessKeySecret string `json:"accessKeySecret"`
- }
- // MarshalJSON custom json marshalling functions, sets properties as tagged in struct and sets the authorizer type property
- func (ak *AccessKey) MarshalJSON() ([]byte, error) {
- fmap := make(map[string]any, 3)
- fmap[cloud.AuthorizerTypeProperty] = AccessKeyAuthorizerType
- fmap["accessKeyID"] = ak.AccessKeyID
- fmap["accessKeySecret"] = ak.AccessKeySecret
- return json.Marshal(fmap)
- }
- func (ak *AccessKey) Validate() error {
- if ak.AccessKeyID == "" {
- return fmt.Errorf("AccessKey: missing Access key ID")
- }
- if ak.AccessKeySecret == "" {
- return fmt.Errorf("AccessKey: missing Access Key secret")
- }
- return nil
- }
- func (ak *AccessKey) Equals(config cloud.Config) bool {
- if config == nil {
- return false
- }
- thatConfig, ok := config.(*AccessKey)
- if !ok {
- return false
- }
- if ak.AccessKeyID != thatConfig.AccessKeyID {
- return false
- }
- if ak.AccessKeySecret != thatConfig.AccessKeySecret {
- return false
- }
- return true
- }
- func (ak *AccessKey) Sanitize() cloud.Config {
- return &AccessKey{
- AccessKeyID: ak.AccessKeyID,
- AccessKeySecret: cloud.Redacted,
- }
- }
- // GetCredentials creates a credentials object to authorize the use of service sdk calls
- func (ak *AccessKey) GetCredentials() (auth.Credential, error) {
- err := ak.Validate()
- if err != nil {
- return nil, err
- }
- return &credentials.AccessKeyCredential{AccessKeyId: ak.AccessKeyID, AccessKeySecret: ak.AccessKeySecret}, nil
- }
|