s3configuration.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package aws
  2. import (
  3. "fmt"
  4. "github.com/aws/aws-sdk-go-v2/aws"
  5. "github.com/opencost/opencost/core/pkg/opencost"
  6. "github.com/opencost/opencost/core/pkg/util/json"
  7. "github.com/opencost/opencost/pkg/cloud"
  8. )
  9. type S3Configuration struct {
  10. Bucket string `json:"bucket"`
  11. Region string `json:"region"`
  12. Account string `json:"account"`
  13. Authorizer Authorizer `json:"authorizer"`
  14. }
  15. func (s3c *S3Configuration) Validate() error {
  16. // Validate Authorizer
  17. if s3c.Authorizer == nil {
  18. return fmt.Errorf("S3Configuration: missing Authorizer")
  19. }
  20. err := s3c.Authorizer.Validate()
  21. if err != nil {
  22. return fmt.Errorf("S3Configuration: %s", err)
  23. }
  24. // Validate base properties
  25. if s3c.Bucket == "" {
  26. return fmt.Errorf("S3Configuration: missing bucket")
  27. }
  28. if s3c.Region == "" {
  29. return fmt.Errorf("S3Configuration: missing region")
  30. }
  31. if s3c.Account == "" {
  32. return fmt.Errorf("S3Configuration: missing account")
  33. }
  34. return nil
  35. }
  36. func (s3c *S3Configuration) Equals(config cloud.Config) bool {
  37. if config == nil {
  38. return false
  39. }
  40. thatConfig, ok := config.(*S3Configuration)
  41. if !ok {
  42. return false
  43. }
  44. if s3c.Authorizer != nil {
  45. if !s3c.Authorizer.Equals(thatConfig.Authorizer) {
  46. return false
  47. }
  48. } else {
  49. if thatConfig.Authorizer != nil {
  50. return false
  51. }
  52. }
  53. if s3c.Bucket != thatConfig.Bucket {
  54. return false
  55. }
  56. if s3c.Region != thatConfig.Region {
  57. return false
  58. }
  59. if s3c.Account != thatConfig.Account {
  60. return false
  61. }
  62. return true
  63. }
  64. func (s3c *S3Configuration) Sanitize() cloud.Config {
  65. return &S3Configuration{
  66. Bucket: s3c.Bucket,
  67. Region: s3c.Region,
  68. Account: s3c.Account,
  69. Authorizer: s3c.Authorizer.Sanitize().(Authorizer),
  70. }
  71. }
  72. func (s3c *S3Configuration) Key() string {
  73. return fmt.Sprintf("%s/%s", s3c.Account, s3c.Bucket)
  74. }
  75. func (s3c *S3Configuration) Provider() string {
  76. return opencost.AWSProvider
  77. }
  78. func (s3c *S3Configuration) UnmarshalJSON(b []byte) error {
  79. var f interface{}
  80. err := json.Unmarshal(b, &f)
  81. if err != nil {
  82. return err
  83. }
  84. fmap := f.(map[string]interface{})
  85. bucket, err := cloud.GetInterfaceValue[string](fmap, "bucket")
  86. if err != nil {
  87. return fmt.Errorf("S3Configuration: UnmarshalJSON: %s", err.Error())
  88. }
  89. s3c.Bucket = bucket
  90. region, err := cloud.GetInterfaceValue[string](fmap, "region")
  91. if err != nil {
  92. return fmt.Errorf("S3Configuration: UnmarshalJSON: %s", err.Error())
  93. }
  94. s3c.Region = region
  95. account, err := cloud.GetInterfaceValue[string](fmap, "account")
  96. if err != nil {
  97. return fmt.Errorf("S3Configuration: UnmarshalJSON: %s", err.Error())
  98. }
  99. s3c.Account = account
  100. authAny, ok := fmap["authorizer"]
  101. if !ok {
  102. return fmt.Errorf("S3Configuration: UnmarshalJSON: missing authorizer")
  103. }
  104. authorizer, err := cloud.AuthorizerFromInterface(authAny, SelectAuthorizerByType)
  105. if err != nil {
  106. return fmt.Errorf("S3Configuration: UnmarshalJSON: %s", err.Error())
  107. }
  108. s3c.Authorizer = authorizer
  109. return nil
  110. }
  111. func (s3c *S3Configuration) CreateAWSConfig() (aws.Config, error) {
  112. return s3c.Authorizer.CreateAWSConfig(s3c.Region)
  113. }