usageapiconfiguration.go 3.0 KB

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