persistentvolume.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package kubemodel
  2. import (
  3. "time"
  4. "github.com/opencost/opencost/core/pkg/log"
  5. "github.com/opencost/opencost/core/pkg/model/kubemodel"
  6. "github.com/opencost/opencost/core/pkg/source"
  7. )
  8. func (km *KubeModel) computePersistentVolumes(kms *kubemodel.KubeModelSet, start, end time.Time) error {
  9. grp := source.NewQueryGroup()
  10. metrics := km.ds.Metrics()
  11. pvInfoResultFuture := source.WithGroup(grp, metrics.QueryKMPVInfo(start, end))
  12. pvUptimeResultFuture := source.WithGroup(grp, metrics.QueryPVUptime(start, end))
  13. pvBytesResultFuture := source.WithGroup(grp, metrics.QueryPVBytes(start, end))
  14. pvMap := make(map[string]*kubemodel.PersistentVolume)
  15. pvInfoResult, _ := pvInfoResultFuture.Await()
  16. for _, res := range pvInfoResult {
  17. pvMap[res.UID] = &kubemodel.PersistentVolume{
  18. UID: res.UID,
  19. Name: res.PersistentVolume,
  20. StorageClass: res.StorageClass,
  21. CSIVolumeHandle: res.CSIVolumeHandle,
  22. }
  23. }
  24. pvUptimeResult, _ := pvUptimeResultFuture.Await()
  25. for _, res := range pvUptimeResult {
  26. pv, ok := pvMap[res.UID]
  27. if !ok {
  28. log.Warnf("persistent volume with UID '%s' has not been initialized to add uptime", res.UID)
  29. continue
  30. }
  31. s, e := res.GetStartEnd(start, end, km.ds.Resolution())
  32. pv.Start = s
  33. pv.End = e
  34. }
  35. pvBytesResult, _ := pvBytesResultFuture.Await()
  36. for _, res := range pvBytesResult {
  37. pv, ok := pvMap[res.UID]
  38. if !ok {
  39. log.Warnf("persistent volume with UID '%s' has not been initialized to add bytes", res.UID)
  40. continue
  41. }
  42. pv.SizeBytes = res.Value
  43. }
  44. for _, pv := range pvMap {
  45. err := kms.RegisterPersistentVolume(pv)
  46. if err != nil {
  47. log.Warnf("Failed to register persistent volume: %s", err.Error())
  48. }
  49. }
  50. return nil
  51. }