autocomplete.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package costmodel
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "github.com/julienschmidt/httprouter"
  7. "github.com/opencost/opencost/core/pkg/filter"
  8. allocationfilter "github.com/opencost/opencost/core/pkg/filter/allocation"
  9. assetfilter "github.com/opencost/opencost/core/pkg/filter/asset"
  10. "github.com/opencost/opencost/core/pkg/opencost"
  11. "github.com/opencost/opencost/core/pkg/util/httputil"
  12. "github.com/opencost/opencost/pkg/allocation"
  13. "github.com/opencost/opencost/pkg/asset"
  14. "github.com/opencost/opencost/pkg/env"
  15. )
  16. func (a *Accesses) ComputeAllocationAutocompleteHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  17. w.Header().Set("Content-Type", "application/json")
  18. qp := httputil.NewQueryParams(r.URL.Query())
  19. window, err := opencost.ParseWindowWithOffset(qp.Get("window", ""), env.GetParsedUTCOffset())
  20. if err != nil {
  21. http.Error(w, fmt.Sprintf("Invalid 'window' parameter: %s", err), http.StatusBadRequest)
  22. return
  23. }
  24. var parsedFilter filter.Filter
  25. filterString := qp.Get("filter", "")
  26. if filterString != "" {
  27. parser := allocationfilter.NewAllocationFilterParser()
  28. parsedFilter, err = parser.Parse(filterString)
  29. if err != nil {
  30. http.Error(w, fmt.Sprintf("Invalid 'filter' parameter: %s", err), http.StatusBadRequest)
  31. return
  32. }
  33. }
  34. resp, err := a.QueryAllocationAutocomplete(allocation.AllocationAutocompleteRequest{
  35. Search: qp.Get("search", ""),
  36. Field: qp.Get("field", ""),
  37. Limit: qp.GetInt("limit", 0),
  38. Window: window,
  39. Filter: parsedFilter,
  40. LabelConfig: opencost.NewLabelConfig(),
  41. }, r.Context())
  42. if err != nil {
  43. http.Error(w, fmt.Sprintf("Error getting allocation autocomplete: %s", err), http.StatusInternalServerError)
  44. return
  45. }
  46. WriteData(w, resp, nil)
  47. }
  48. func (a *Accesses) QueryAllocationAutocomplete(req allocation.AllocationAutocompleteRequest, ctx context.Context) (*allocation.AllocationAutocompleteResponse, error) {
  49. asr, err := a.Model.QueryAllocation(req.Window, req.Window.Duration(), nil, false, false, false, false, false, opencost.AccumulateOptionNone, false, "")
  50. if err != nil {
  51. return nil, fmt.Errorf("error querying allocations: %w", err)
  52. }
  53. return allocation.QueryAllocationAutocompleteFromSetRange(asr, req)
  54. }
  55. func (a *Accesses) ComputeAssetsAutocompleteHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  56. w.Header().Set("Content-Type", "application/json")
  57. qp := httputil.NewQueryParams(r.URL.Query())
  58. window, err := opencost.ParseWindowWithOffset(qp.Get("window", ""), env.GetParsedUTCOffset())
  59. if err != nil {
  60. http.Error(w, fmt.Sprintf("Invalid 'window' parameter: %s", err), http.StatusBadRequest)
  61. return
  62. }
  63. var parsedFilter filter.Filter
  64. filterString := qp.Get("filter", "")
  65. if filterString != "" {
  66. parser := assetfilter.NewAssetFilterParser()
  67. parsedFilter, err = parser.Parse(filterString)
  68. if err != nil {
  69. http.Error(w, fmt.Sprintf("Invalid 'filter' parameter: %s", err), http.StatusBadRequest)
  70. return
  71. }
  72. }
  73. resp, err := a.QueryAssetAutocomplete(asset.AssetAutocompleteRequest{
  74. TenantID: qp.Get("tenantId", "opencost"),
  75. Search: qp.Get("search", ""),
  76. Field: qp.Get("field", ""),
  77. Limit: qp.GetInt("limit", 0),
  78. Window: window,
  79. Filter: parsedFilter,
  80. }, r.Context())
  81. if err != nil {
  82. http.Error(w, fmt.Sprintf("Error getting asset autocomplete: %s", err), http.StatusInternalServerError)
  83. return
  84. }
  85. WriteData(w, resp, nil)
  86. }
  87. func (a *Accesses) QueryAssetAutocomplete(req asset.AssetAutocompleteRequest, ctx context.Context) (*asset.AssetAutocompleteResponse, error) {
  88. assetSet, err := a.Model.ComputeAssets(*req.Window.Start(), *req.Window.End())
  89. if err != nil {
  90. return nil, fmt.Errorf("error computing assets: %w", err)
  91. }
  92. return asset.QueryAssetAutocompleteFromSet(assetSet, req)
  93. }