2
0

kubemodel.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package kubemodel
  2. import (
  3. "time"
  4. )
  5. // TODO: should we add a lock so that we can safely modify KubeModelSet in parallel?
  6. // @bingen:generate[stringtable]:KubeModelSet
  7. type KubeModelSet struct {
  8. Metadata *Metadata `json:"meta"` // @bingen:field[version=1]
  9. Window Window `json:"window"` // @bingen:field[version=1]
  10. Cluster *Cluster `json:"cluster"` // @bingen:field[version=1]
  11. Namespaces map[string]*Namespace `json:"namespaces"` // @bingen:field[version=1]
  12. ResourceQuotas map[string]*ResourceQuota `json:"resourceQuotas"` // @bingen:field[version=1]
  13. Containers map[string]*Container `json:"containers,omitempty"` // @bingen:field[ignore]
  14. Owners map[string]*Owner `json:"owners,omitempty"` // @bingen:field[ignore]
  15. Devices map[string]*Device `json:"devices,omitempty"` // @bingen:field[ignore]
  16. DeviceUsages map[string]*DeviceUsage `json:"deviceUsages,omitempty"` // @bingen:field[ignore]
  17. Nodes map[string]*Node `json:"nodes,omitempty"` // @bingen:field[ignore]
  18. Pods map[string]*Pod `json:"pods,omitempty"` // @bingen:field[ignore]
  19. PersistentVolumeClaims map[string]*PersistentVolumeClaim `json:"pvcs,omitempty"` // @bingen:field[ignore]
  20. Services map[string]*Service `json:"services,omitempty"` // @bingen:field[ignore]
  21. Volumes map[string]*PersistentVolume `json:"volumes,omitempty"` // @bingen:field[ignore]
  22. idx *kubeModelSetIndexes // @bingen:field[ignore]
  23. }
  24. func NewKubeModelSet(start time.Time, end time.Time) *KubeModelSet {
  25. now := time.Now().UTC()
  26. kms := &KubeModelSet{
  27. Metadata: &Metadata{
  28. CreatedAt: now,
  29. CompletedAt: now, // Will be updated when processing completes
  30. DiagnosticLevel: DefaultDiagnosticLevel,
  31. },
  32. Window: Window{
  33. Start: start,
  34. End: end,
  35. },
  36. Containers: map[string]*Container{},
  37. Owners: map[string]*Owner{},
  38. Devices: map[string]*Device{},
  39. DeviceUsages: map[string]*DeviceUsage{},
  40. Namespaces: map[string]*Namespace{},
  41. Nodes: map[string]*Node{},
  42. Pods: map[string]*Pod{},
  43. PersistentVolumeClaims: map[string]*PersistentVolumeClaim{},
  44. ResourceQuotas: map[string]*ResourceQuota{},
  45. Services: map[string]*Service{},
  46. Volumes: map[string]*PersistentVolume{},
  47. idx: newKubeModelSetIndexes(),
  48. }
  49. return kms
  50. }
  51. // GetNamespaceByName retrieves a namespace by its name using the index
  52. func (kms *KubeModelSet) GetNamespaceByName(name string) (*Namespace, bool) {
  53. if kms.idx == nil {
  54. return nil, false
  55. }
  56. uid, ok := kms.idx.namespaceNameToID[name]
  57. if !ok {
  58. return nil, false
  59. }
  60. ns, ok := kms.Namespaces[uid]
  61. return ns, ok
  62. }
  63. // IsEmpty returns true if the KubeModelSet is nil, has no cluster, or contains no resources
  64. func (kms *KubeModelSet) IsEmpty() bool {
  65. if kms == nil || kms.Cluster == nil {
  66. return true
  67. }
  68. // Check if all resource maps are empty
  69. return len(kms.Containers) == 0 &&
  70. len(kms.Owners) == 0 &&
  71. len(kms.Devices) == 0 &&
  72. len(kms.DeviceUsages) == 0 &&
  73. len(kms.Namespaces) == 0 &&
  74. len(kms.Nodes) == 0 &&
  75. len(kms.Pods) == 0 &&
  76. len(kms.PersistentVolumeClaims) == 0 &&
  77. len(kms.ResourceQuotas) == 0 &&
  78. len(kms.Services) == 0 &&
  79. len(kms.Volumes) == 0
  80. }
  81. type kubeModelSetIndexes struct {
  82. namespaceNameToID map[string]string
  83. namespaceByName map[string]*Namespace
  84. }
  85. func newKubeModelSetIndexes() *kubeModelSetIndexes {
  86. return &kubeModelSetIndexes{
  87. namespaceNameToID: make(map[string]string),
  88. namespaceByName: make(map[string]*Namespace),
  89. }
  90. }