resourcequota.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package kubemodel
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // @bingen:generate:ResourceQuota
  7. type ResourceQuota struct {
  8. UID string `json:"uid"` // @bingen:field[version=1]
  9. NamespaceUID string `json:"namespaceUID"` // @bingen:field[version=1]
  10. Name string `json:"name"` // @bingen:field[version=1]
  11. Spec *ResourceQuotaSpec `json:"spec"` // @bingen:field[version=1]
  12. Status *ResourceQuotaStatus `json:"status"` // @bingen:field[version=1]
  13. Start time.Time `json:"start"` // @bingen:field[version=1]
  14. End time.Time `json:"end"` // @bingen:field[version=1]
  15. }
  16. // @bingen:generate:ResourceQuotaSpec
  17. type ResourceQuotaSpec struct {
  18. Hard *ResourceQuotaSpecHard `json:"hard"` // @bingen:field[version=1]
  19. }
  20. // @bingen:generate:ResourceQuotaSpecHard
  21. type ResourceQuotaSpecHard struct {
  22. Requests ResourceQuantities `json:"requests,omitempty"` // @bingen:field[version=1]
  23. Limits ResourceQuantities `json:"limits,omitempty"` // @bingen:field[version=1]
  24. }
  25. func (spec *ResourceQuotaSpecHard) SetRequest(resource Resource, unit Unit, statType StatType, value float64) {
  26. if spec.Requests == nil {
  27. spec.Requests = ResourceQuantities{}
  28. }
  29. spec.Requests.Set(resource, unit, statType, value)
  30. }
  31. func (spec *ResourceQuotaSpecHard) SetLimit(resource Resource, unit Unit, statType StatType, value float64) {
  32. if spec.Limits == nil {
  33. spec.Limits = ResourceQuantities{}
  34. }
  35. spec.Limits.Set(resource, unit, statType, value)
  36. }
  37. // @bingen:generate:ResourceQuotaStatus
  38. type ResourceQuotaStatus struct {
  39. Used *ResourceQuotaStatusUsed `json:"used"` // @bingen:field[version=1]
  40. }
  41. // @bingen:generate:ResourceQuotaStatusUsed
  42. type ResourceQuotaStatusUsed struct {
  43. Requests ResourceQuantities `json:"requests,omitempty"` // @bingen:field[version=1]
  44. Limits ResourceQuantities `json:"limits,omitempty"` // @bingen:field[version=1]
  45. }
  46. func (stat *ResourceQuotaStatusUsed) SetRequest(resource Resource, unit Unit, statType StatType, value float64) {
  47. if stat.Requests == nil {
  48. stat.Requests = ResourceQuantities{}
  49. }
  50. stat.Requests.Set(resource, unit, statType, value)
  51. }
  52. func (stat *ResourceQuotaStatusUsed) SetLimit(resource Resource, unit Unit, statType StatType, value float64) {
  53. if stat.Limits == nil {
  54. stat.Limits = ResourceQuantities{}
  55. }
  56. stat.Limits.Set(resource, unit, statType, value)
  57. }
  58. func (rq *ResourceQuota) ValidateResourceQuota(window Window) error {
  59. if rq.UID == "" {
  60. return fmt.Errorf("UID is missing for ResourceQuota with name '%s'", rq.Name)
  61. }
  62. if rq.Name == "" {
  63. return fmt.Errorf("Name is missing for ResourceQuota '%s'", rq.UID)
  64. }
  65. if rq.NamespaceUID == "" {
  66. return fmt.Errorf("NamespaceUID is missing for ResourceQuota '%s'", rq.UID)
  67. }
  68. if err := checkWindow(window, rq.Start, rq.End); err != nil {
  69. return err
  70. }
  71. return nil
  72. }
  73. func (kms *KubeModelSet) RegisterResourceQuota(resourceQuota *ResourceQuota) error {
  74. if err := resourceQuota.ValidateResourceQuota(kms.Window); err != nil {
  75. err = fmt.Errorf("RegisterResourceQuota: invalid resource quota: %w", err)
  76. kms.Error(err)
  77. return err
  78. }
  79. if _, ok := kms.ResourceQuotas[resourceQuota.UID]; !ok {
  80. // Initialize Spec and Status if they're nil
  81. if resourceQuota.Spec == nil {
  82. resourceQuota.Spec = &ResourceQuotaSpec{Hard: &ResourceQuotaSpecHard{}}
  83. } else if resourceQuota.Spec.Hard == nil {
  84. resourceQuota.Spec.Hard = &ResourceQuotaSpecHard{}
  85. }
  86. if resourceQuota.Status == nil {
  87. resourceQuota.Status = &ResourceQuotaStatus{Used: &ResourceQuotaStatusUsed{}}
  88. } else if resourceQuota.Status.Used == nil {
  89. resourceQuota.Status.Used = &ResourceQuotaStatusUsed{}
  90. }
  91. kms.ResourceQuotas[resourceQuota.UID] = resourceQuota
  92. kms.Metadata.ObjectCount++
  93. }
  94. return nil
  95. }