2
0

queryservice_helper.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package customcost
  2. import (
  3. "fmt"
  4. "github.com/opencost/opencost/core/pkg/filter"
  5. "github.com/opencost/opencost/core/pkg/opencost"
  6. "github.com/opencost/opencost/core/pkg/util/mapper"
  7. )
  8. func ParseCustomCostTotalRequest(qp mapper.PrimitiveMap) (*CostTotalRequest, error) {
  9. windowStr := qp.Get("window", "")
  10. if windowStr == "" {
  11. return nil, fmt.Errorf("missing require window param")
  12. }
  13. window, err := opencost.ParseWindowUTC(windowStr)
  14. if err != nil {
  15. return nil, fmt.Errorf("invalid window parameter: %w", err)
  16. }
  17. if window.IsOpen() {
  18. return nil, fmt.Errorf("invalid window parameter: %s", window.String())
  19. }
  20. aggregateByRaw := qp.GetList("aggregate", ",")
  21. aggregateBy, err := ParseCustomCostProperties(aggregateByRaw)
  22. if err != nil {
  23. return nil, err
  24. }
  25. accumulate := opencost.ParseAccumulate(qp.Get("accumulate", "day"))
  26. var filter filter.Filter
  27. filterString := qp.Get("filter", "")
  28. if filterString != "" {
  29. parser := NewCustomCostFilterParser()
  30. filter, err = parser.Parse(filterString)
  31. if err != nil {
  32. return nil, fmt.Errorf("parsing 'filter' parameter: %s", err)
  33. }
  34. }
  35. costTypeStr := qp.Get("costType", string(CostTypeBlended))
  36. parsedCostType, err := ParseCostType(costTypeStr)
  37. if err != nil {
  38. return nil, fmt.Errorf("parsing 'costType' parameter: %s", err)
  39. }
  40. sortByStr := qp.Get("sortBy", string(SortPropertyCost))
  41. parsedSortBy, err := ParseSortBy(sortByStr)
  42. if err != nil {
  43. return nil, fmt.Errorf("parsing 'sortBy' parameter: %s", err)
  44. }
  45. sortDirStr := qp.Get("sortDirection", string(SortDirectionDesc))
  46. parsedSortDir, err := ParseSortDirection(sortDirStr)
  47. if err != nil {
  48. return nil, fmt.Errorf("parsing 'sortDirection' parameter: %s", err)
  49. }
  50. opts := &CostTotalRequest{
  51. Start: *window.Start(),
  52. End: *window.End(),
  53. AggregateBy: aggregateBy,
  54. Accumulate: accumulate,
  55. Filter: filter,
  56. CostType: parsedCostType,
  57. SortBy: parsedSortBy,
  58. SortDirection: parsedSortDir,
  59. }
  60. return opts, nil
  61. }
  62. func ParseSortDirection(sortDirStr string) (SortDirection, error) {
  63. switch sortDirStr {
  64. case string(SortDirectionAsc):
  65. return SortDirectionAsc, nil
  66. case string(SortDirectionDesc):
  67. return SortDirectionDesc, nil
  68. default:
  69. return "", fmt.Errorf("unrecognized sortDirection field: %s", sortDirStr)
  70. }
  71. }
  72. func ParseSortBy(sortByStr string) (SortProperty, error) {
  73. switch sortByStr {
  74. case string(SortPropertyCost):
  75. return SortPropertyCost, nil
  76. case string(SortPropertyAggregate):
  77. return SortPropertyAggregate, nil
  78. case string(SortPropertyCostType):
  79. return SortPropertyCostType, nil
  80. default:
  81. return "", fmt.Errorf("unrecognized sortBy field: %s", sortByStr)
  82. }
  83. }
  84. func ParseCustomCostTimeseriesRequest(qp mapper.PrimitiveMap) (*CostTimeseriesRequest, error) {
  85. windowStr := qp.Get("window", "")
  86. if windowStr == "" {
  87. return nil, fmt.Errorf("missing require window param")
  88. }
  89. window, err := opencost.ParseWindowUTC(windowStr)
  90. if err != nil {
  91. return nil, fmt.Errorf("invalid window parameter: %w", err)
  92. }
  93. if window.IsOpen() {
  94. return nil, fmt.Errorf("invalid window parameter: %s", window.String())
  95. }
  96. aggregateByRaw := qp.GetList("aggregate", ",")
  97. aggregateBy, err := ParseCustomCostProperties(aggregateByRaw)
  98. if err != nil {
  99. return nil, err
  100. }
  101. accumulate := opencost.ParseAccumulate(qp.Get("accumulate", "day"))
  102. var filter filter.Filter
  103. filterString := qp.Get("filter", "")
  104. if filterString != "" {
  105. parser := NewCustomCostFilterParser()
  106. filter, err = parser.Parse(filterString)
  107. if err != nil {
  108. return nil, fmt.Errorf("parsing 'filter' parameter: %s", err)
  109. }
  110. }
  111. costTypeStr := qp.Get("costType", string(CostTypeBlended))
  112. parsedCostType, err := ParseCostType(costTypeStr)
  113. if err != nil {
  114. return nil, fmt.Errorf("parsing 'costType' parameter: %s", err)
  115. }
  116. sortByStr := qp.Get("sortBy", string(SortPropertyCost))
  117. parsedSortBy, err := ParseSortBy(sortByStr)
  118. if err != nil {
  119. return nil, fmt.Errorf("parsing 'sortBy' parameter: %s", err)
  120. }
  121. sortDirStr := qp.Get("sortDirection", string(SortDirectionDesc))
  122. parsedSortDir, err := ParseSortDirection(sortDirStr)
  123. if err != nil {
  124. return nil, fmt.Errorf("parsing 'sortDirection' parameter: %s", err)
  125. }
  126. opts := &CostTimeseriesRequest{
  127. Start: *window.Start(),
  128. End: *window.End(),
  129. AggregateBy: aggregateBy,
  130. Accumulate: accumulate,
  131. Filter: filter,
  132. CostType: parsedCostType,
  133. SortBy: parsedSortBy,
  134. SortDirection: parsedSortDir,
  135. }
  136. return opts, nil
  137. }