coverage.go 2.7 KB

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