cluster.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package kubemodel
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/opencost/opencost/core/pkg/log"
  6. "github.com/opencost/opencost/core/pkg/model/kubemodel"
  7. "github.com/opencost/opencost/core/pkg/model/shared"
  8. "github.com/opencost/opencost/core/pkg/source"
  9. )
  10. func (km *KubeModel) computeCluster(kms *kubemodel.KubeModelSet, start, end time.Time) error {
  11. grp := source.NewQueryGroup()
  12. metrics := km.ds.Metrics()
  13. clusterInfoResultFuture := source.WithGroup(grp, metrics.QueryClusterInfo(start, end))
  14. clusterUptimeResultFuture := source.WithGroup(grp, metrics.QueryClusterUptime(start, end))
  15. clusterMap := make(map[string]*kubemodel.Cluster)
  16. clusterInfoResult, _ := clusterInfoResultFuture.Await()
  17. for _, res := range clusterInfoResult {
  18. clusterMap[res.UID] = &kubemodel.Cluster{
  19. UID: res.UID,
  20. Provider: shared.ParseProvider(res.Provider),
  21. Account: res.AccountID,
  22. Name: res.Cluster,
  23. Region: res.Region,
  24. }
  25. }
  26. clusterUptimeResult, _ := clusterUptimeResultFuture.Await()
  27. for _, res := range clusterUptimeResult {
  28. cluster, ok := clusterMap[res.UID]
  29. if !ok {
  30. log.Warnf("cluster with UID '%s' has not been initialized to add uptime", res.UID)
  31. continue
  32. }
  33. s, e := res.GetStartEnd(start, end, km.ds.Resolution())
  34. cluster.Start = s
  35. cluster.End = e
  36. }
  37. cluster, ok := clusterMap[km.clusterUID]
  38. if !ok {
  39. return fmt.Errorf("failed to compute cluster with UID '%s'", km.clusterUID)
  40. }
  41. kms.RegisterCluster(cluster)
  42. return nil
  43. }