coverage.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package kubecost
  2. import (
  3. "time"
  4. "github.com/opencost/opencost/pkg/filter"
  5. "github.com/opencost/opencost/pkg/log"
  6. )
  7. // Coverage This is a placeholder struct which can be replaced by a more specific implementation later
  8. type Coverage struct {
  9. Window Window `json:"window"`
  10. Type string `json:"type"`
  11. Count int `json:"count"`
  12. Updated time.Time `json:"updated"`
  13. Errors []string `json:"errors"`
  14. Warnings []string `json:"warnings"`
  15. }
  16. func (c *Coverage) GetWindow() Window {
  17. return c.Window
  18. }
  19. func (c *Coverage) Key() string {
  20. return c.Type
  21. }
  22. func (c *Coverage) IsEmpty() bool {
  23. return c.Type == "" && c.Count == 0 && len(c.Errors) == 0 && len(c.Warnings) == 0 && c.Updated == time.Time{}
  24. }
  25. func (c *Coverage) Clone() *Coverage {
  26. var errors []string
  27. if len(c.Errors) > 0 {
  28. errors = make([]string, len(c.Errors))
  29. copy(errors, c.Errors)
  30. }
  31. var warnings []string
  32. if len(c.Warnings) > 0 {
  33. warnings = make([]string, len(c.Warnings))
  34. copy(warnings, c.Warnings)
  35. }
  36. return &Coverage{
  37. Window: c.Window.Clone(),
  38. Type: c.Type,
  39. Count: c.Count,
  40. Updated: c.Updated,
  41. Errors: errors,
  42. Warnings: warnings,
  43. }
  44. }
  45. // Coverage This is a placeholder struct which can be replaced by a more specific implementation later
  46. type CoverageSet struct {
  47. Window Window `json:"window"`
  48. Items map[string]*Coverage `json:"items"`
  49. }
  50. func NewCoverageSet(start, end time.Time) *CoverageSet {
  51. return &CoverageSet{
  52. Window: NewWindow(&start, &end),
  53. Items: map[string]*Coverage{},
  54. }
  55. }
  56. func (cs *CoverageSet) GetWindow() Window {
  57. return cs.Window
  58. }
  59. func (cs *CoverageSet) IsEmpty() bool {
  60. if cs == nil {
  61. log.Warnf("calling IsEmpty() on a nil CoverageSet")
  62. return true
  63. }
  64. for _, item := range cs.Items {
  65. if !item.IsEmpty() {
  66. return false
  67. }
  68. }
  69. return true
  70. }
  71. func (cs *CoverageSet) Clone() *CoverageSet {
  72. var items map[string]*Coverage
  73. if cs.Items != nil {
  74. items = make(map[string]*Coverage, len(cs.Items))
  75. for k, item := range cs.Items {
  76. items[k] = item.Clone()
  77. }
  78. }
  79. return &CoverageSet{
  80. Window: cs.Window.Clone(),
  81. Items: items,
  82. }
  83. }
  84. func (cs *CoverageSet) Insert(coverage *Coverage) {
  85. if cs.Items == nil {
  86. cs.Items = map[string]*Coverage{}
  87. }
  88. cs.Items[coverage.Key()] = coverage
  89. }
  90. func (cs *CoverageSet) Filter(filters filter.Filter[*Coverage]) *CoverageSet {
  91. if cs == nil {
  92. return nil
  93. }
  94. if filters == nil {
  95. return cs.Clone()
  96. }
  97. result := NewCoverageSet(*cs.Window.start, *cs.Window.end)
  98. for _, c := range cs.Items {
  99. if filters.Matches(c) {
  100. result.Insert(c.Clone())
  101. }
  102. }
  103. return result
  104. }