boaconfiguration.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package alibaba
  2. import (
  3. "fmt"
  4. "github.com/opencost/opencost/pkg/cloud/config"
  5. "github.com/opencost/opencost/pkg/util/json"
  6. )
  7. // BOAConfiguration is the BSS open API configuration for Alibaba's Billing information
  8. type BOAConfiguration struct {
  9. Account string `json:"account"`
  10. Region string `json:"region"`
  11. Authorizer Authorizer `json:"authorizer"`
  12. }
  13. func (bc *BOAConfiguration) Validate() error {
  14. // Validate Authorizer
  15. if bc.Authorizer == nil {
  16. return fmt.Errorf("BOAConfiguration: missing authorizer")
  17. }
  18. err := bc.Authorizer.Validate()
  19. if err != nil {
  20. return err
  21. }
  22. // Validate base properties
  23. if bc.Region == "" {
  24. return fmt.Errorf("BOAConfiguration: missing region")
  25. }
  26. if bc.Account == "" {
  27. return fmt.Errorf("BOAConfiguration: missing account")
  28. }
  29. return nil
  30. }
  31. func (bc *BOAConfiguration) Equals(config config.Config) bool {
  32. if config == nil {
  33. return false
  34. }
  35. thatConfig, ok := config.(*BOAConfiguration)
  36. if !ok {
  37. return false
  38. }
  39. if bc.Authorizer != nil {
  40. if !bc.Authorizer.Equals(thatConfig.Authorizer) {
  41. return false
  42. }
  43. } else {
  44. if thatConfig.Authorizer != nil {
  45. return false
  46. }
  47. }
  48. if bc.Account != thatConfig.Account {
  49. return false
  50. }
  51. if bc.Region != thatConfig.Region {
  52. return false
  53. }
  54. return true
  55. }
  56. func (bc *BOAConfiguration) Sanitize() config.Config {
  57. return &BOAConfiguration{
  58. Account: bc.Account,
  59. Region: bc.Region,
  60. Authorizer: bc.Authorizer.Sanitize().(Authorizer),
  61. }
  62. }
  63. func (bc *BOAConfiguration) Key() string {
  64. return fmt.Sprintf("%s/%s", bc.Account, bc.Region)
  65. }
  66. func (bc *BOAConfiguration) UnmarshalJSON(b []byte) error {
  67. var f interface{}
  68. err := json.Unmarshal(b, &f)
  69. if err != nil {
  70. return err
  71. }
  72. fmap := f.(map[string]interface{})
  73. account, err := config.GetInterfaceValue[string](fmap, "account")
  74. if err != nil {
  75. return fmt.Errorf("BOAConfiguration: UnmarshalJSON: %s", err.Error())
  76. }
  77. bc.Account = account
  78. region, err := config.GetInterfaceValue[string](fmap, "region")
  79. if err != nil {
  80. return fmt.Errorf("BOAConfiguration: UnmarshalJSON: %s", err.Error())
  81. }
  82. bc.Region = region
  83. authAny, ok := fmap["authorizer"]
  84. if !ok {
  85. return fmt.Errorf("BOAConfiguration: UnmarshalJSON: missing authorizer")
  86. }
  87. authorizer, err := config.AuthorizerFromInterface(authAny, SelectAuthorizerByType)
  88. if err != nil {
  89. return fmt.Errorf("BOAConfiguration: UnmarshalJSON: %s", err.Error())
  90. }
  91. bc.Authorizer = authorizer
  92. return nil
  93. }
  94. func ConvertAlibabaInfoToConfig(acc AlibabaInfo) config.KeyedConfig {
  95. if acc.IsEmpty() {
  96. return nil
  97. }
  98. var configurer Authorizer
  99. configurer = &AccessKey{
  100. AccessKeyID: acc.AlibabaServiceKeyName,
  101. AccessKeySecret: acc.AlibabaServiceKeySecret,
  102. }
  103. return &BOAConfiguration{
  104. Account: acc.AlibabaAccountID,
  105. Region: acc.AlibabaClusterRegion,
  106. Authorizer: configurer,
  107. }
  108. }