2
0

s3configuration.go 2.9 KB

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