| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package kubemodel
- import (
- "time"
- )
- // TODO: should we add a lock so that we can safely modify KubeModelSet in parallel?
- // @bingen:generate[stringtable]:KubeModelSet
- type KubeModelSet struct {
- Metadata *Metadata `json:"meta"` // @bingen:field[version=1]
- Window Window `json:"window"` // @bingen:field[version=1]
- Cluster *Cluster `json:"cluster"` // @bingen:field[version=1]
- Namespaces map[string]*Namespace `json:"namespaces"` // @bingen:field[version=1]
- ResourceQuotas map[string]*ResourceQuota `json:"resourceQuotas"` // @bingen:field[version=1]
- Containers map[string]*Container `json:"containers,omitempty"` // @bingen:field[ignore]
- Owners map[string]*Owner `json:"owners,omitempty"` // @bingen:field[ignore]
- Devices map[string]*Device `json:"devices,omitempty"` // @bingen:field[ignore]
- DeviceUsages map[string]*DeviceUsage `json:"deviceUsages,omitempty"` // @bingen:field[ignore]
- Nodes map[string]*Node `json:"nodes,omitempty"` // @bingen:field[ignore]
- Pods map[string]*Pod `json:"pods,omitempty"` // @bingen:field[ignore]
- PersistentVolumeClaims map[string]*PersistentVolumeClaim `json:"pvcs,omitempty"` // @bingen:field[ignore]
- Services map[string]*Service `json:"services,omitempty"` // @bingen:field[ignore]
- Volumes map[string]*PersistentVolume `json:"volumes,omitempty"` // @bingen:field[ignore]
- idx *kubeModelSetIndexes // @bingen:field[ignore]
- }
- func NewKubeModelSet(start time.Time, end time.Time) *KubeModelSet {
- now := time.Now().UTC()
- kms := &KubeModelSet{
- Metadata: &Metadata{
- CreatedAt: now,
- CompletedAt: now, // Will be updated when processing completes
- DiagnosticLevel: DefaultDiagnosticLevel,
- },
- Window: Window{
- Start: start,
- End: end,
- },
- Containers: map[string]*Container{},
- Owners: map[string]*Owner{},
- Devices: map[string]*Device{},
- DeviceUsages: map[string]*DeviceUsage{},
- Namespaces: map[string]*Namespace{},
- Nodes: map[string]*Node{},
- Pods: map[string]*Pod{},
- PersistentVolumeClaims: map[string]*PersistentVolumeClaim{},
- ResourceQuotas: map[string]*ResourceQuota{},
- Services: map[string]*Service{},
- Volumes: map[string]*PersistentVolume{},
- idx: newKubeModelSetIndexes(),
- }
- return kms
- }
- // GetNamespaceByName retrieves a namespace by its name using the index
- func (kms *KubeModelSet) GetNamespaceByName(name string) (*Namespace, bool) {
- if kms.idx == nil {
- return nil, false
- }
- uid, ok := kms.idx.namespaceNameToID[name]
- if !ok {
- return nil, false
- }
- ns, ok := kms.Namespaces[uid]
- return ns, ok
- }
- // IsEmpty returns true if the KubeModelSet is nil, has no cluster, or contains no resources
- func (kms *KubeModelSet) IsEmpty() bool {
- if kms == nil || kms.Cluster == nil {
- return true
- }
- // Check if all resource maps are empty
- return len(kms.Containers) == 0 &&
- len(kms.Owners) == 0 &&
- len(kms.Devices) == 0 &&
- len(kms.DeviceUsages) == 0 &&
- len(kms.Namespaces) == 0 &&
- len(kms.Nodes) == 0 &&
- len(kms.Pods) == 0 &&
- len(kms.PersistentVolumeClaims) == 0 &&
- len(kms.ResourceQuotas) == 0 &&
- len(kms.Services) == 0 &&
- len(kms.Volumes) == 0
- }
- type kubeModelSetIndexes struct {
- namespaceNameToID map[string]string
- namespaceByName map[string]*Namespace
- }
- func newKubeModelSetIndexes() *kubeModelSetIndexes {
- return &kubeModelSetIndexes{
- namespaceNameToID: make(map[string]string),
- namespaceByName: make(map[string]*Namespace),
- }
- }
|