resourcequota_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package kubemodel
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func TestValidateResourceQuota(t *testing.T) {
  8. start := time.Now().UTC().Truncate(time.Hour)
  9. end := start.Add(time.Hour)
  10. window := Window{Start: start, End: end}
  11. tests := []struct {
  12. name string
  13. resourceQuota *ResourceQuota
  14. wantErr string
  15. }{
  16. {
  17. name: "empty UID",
  18. resourceQuota: &ResourceQuota{Name: "my-rq", NamespaceUID: "ns-uid", Start: start, End: end},
  19. wantErr: "UID is missing for ResourceQuota with name 'my-rq'",
  20. },
  21. {
  22. name: "empty Name",
  23. resourceQuota: &ResourceQuota{UID: "rq-uid", NamespaceUID: "ns-uid", Start: start, End: end},
  24. wantErr: "Name is missing for ResourceQuota 'rq-uid'",
  25. },
  26. {
  27. name: "empty NamespaceUID",
  28. resourceQuota: &ResourceQuota{UID: "rq-uid", Name: "my-rq", Start: start, End: end},
  29. wantErr: "NamespaceUID is missing for ResourceQuota 'rq-uid'",
  30. },
  31. {
  32. name: "outside window",
  33. resourceQuota: &ResourceQuota{UID: "rq-uid", Name: "my-rq", NamespaceUID: "ns-uid", Start: start.Add(-time.Hour), End: end},
  34. wantErr: checkWindow(window, start.Add(-time.Hour), end).Error(),
  35. },
  36. {
  37. name: "valid",
  38. resourceQuota: &ResourceQuota{UID: "rq-uid", Name: "my-rq", NamespaceUID: "ns-uid", Start: start, End: end},
  39. },
  40. }
  41. for _, tt := range tests {
  42. t.Run(tt.name, func(t *testing.T) {
  43. err := tt.resourceQuota.ValidateResourceQuota(window)
  44. if tt.wantErr != "" {
  45. require.EqualError(t, err, tt.wantErr)
  46. } else {
  47. require.NoError(t, err)
  48. }
  49. })
  50. }
  51. }
  52. func TestRegisterResourceQuota(t *testing.T) {
  53. start := time.Now().UTC().Truncate(time.Hour)
  54. end := start.Add(time.Hour)
  55. newRQ := func(uid, name string) *ResourceQuota {
  56. return &ResourceQuota{UID: uid, Name: name, NamespaceUID: "ns-uid", Start: start, End: end}
  57. }
  58. // RegisterResourceQuota initializes nil Spec/Status on registration.
  59. newRegisteredRQ := func(uid, name string) *ResourceQuota {
  60. rq := newRQ(uid, name)
  61. rq.Spec = &ResourceQuotaSpec{Hard: &ResourceQuotaSpecHard{}}
  62. rq.Status = &ResourceQuotaStatus{Used: &ResourceQuotaStatusUsed{}}
  63. return rq
  64. }
  65. tests := []struct {
  66. name string
  67. setup func(*KubeModelSet)
  68. resourceQuota *ResourceQuota
  69. wantErr string
  70. want *KubeModelSet
  71. }{
  72. {
  73. name: "validation failure",
  74. resourceQuota: &ResourceQuota{UID: "", Name: "my-rq", NamespaceUID: "ns-uid", Start: start, End: end},
  75. wantErr: "RegisterResourceQuota: invalid resource quota: UID is missing for ResourceQuota with name 'my-rq'",
  76. want: func() *KubeModelSet {
  77. kms := NewKubeModelSet(start, end)
  78. kms.Metadata.Diagnostics = []Diagnostic{
  79. {Level: DiagnosticLevelError, Message: "RegisterResourceQuota: invalid resource quota: UID is missing for ResourceQuota with name 'my-rq'"},
  80. }
  81. return kms
  82. }(),
  83. },
  84. {
  85. name: "registers resource quota",
  86. resourceQuota: newRQ("rq-uid", "my-rq"),
  87. want: func() *KubeModelSet {
  88. kms := NewKubeModelSet(start, end)
  89. kms.ResourceQuotas["rq-uid"] = newRegisteredRQ("rq-uid", "my-rq")
  90. kms.Metadata.ObjectCount = 1
  91. return kms
  92. }(),
  93. },
  94. {
  95. name: "duplicate registration is a no-op",
  96. setup: func(kms *KubeModelSet) {
  97. kms.RegisterResourceQuota(newRQ("rq-uid", "original"))
  98. },
  99. resourceQuota: newRQ("rq-uid", "duplicate"),
  100. want: func() *KubeModelSet {
  101. kms := NewKubeModelSet(start, end)
  102. kms.ResourceQuotas["rq-uid"] = newRegisteredRQ("rq-uid", "original")
  103. kms.Metadata.ObjectCount = 1
  104. return kms
  105. }(),
  106. },
  107. }
  108. for _, tt := range tests {
  109. t.Run(tt.name, func(t *testing.T) {
  110. kms := NewKubeModelSet(start, end)
  111. if tt.setup != nil {
  112. tt.setup(kms)
  113. }
  114. err := kms.RegisterResourceQuota(tt.resourceQuota)
  115. if tt.wantErr != "" {
  116. require.EqualError(t, err, tt.wantErr)
  117. } else {
  118. require.NoError(t, err)
  119. }
  120. KubeModelSetEquals(t, tt.want, kms)
  121. })
  122. }
  123. }