coverage.go 2.4 KB

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