kubemodel.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package kubemodel
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. "github.com/opencost/opencost/core/pkg/log"
  7. "github.com/opencost/opencost/core/pkg/model/kubemodel"
  8. "github.com/opencost/opencost/core/pkg/source"
  9. )
  10. const logTimeFmt string = "2006-01-02T15:04:05"
  11. type KubeModel struct {
  12. ds source.OpenCostDataSource
  13. clusterUID string
  14. }
  15. func NewKubeModel(clusterUID string, dataSource source.OpenCostDataSource) (*KubeModel, error) {
  16. if dataSource == nil {
  17. return nil, errors.New("OpenCostDataSource cannot be nil")
  18. }
  19. km := &KubeModel{
  20. ds: dataSource,
  21. clusterUID: clusterUID,
  22. }
  23. km.clusterUID = clusterUID
  24. log.Debugf("NewKubeModel(%s)", km.clusterUID)
  25. return km, nil
  26. }
  27. // ComputeKubeModel uses the CostModel instance to compute an KubeModelSet
  28. // for the window defined by the given start and end times. The KubeModels
  29. // returned are unaggregated (i.e. down to the container level).
  30. func (km *KubeModel) ComputeKubeModelSet(start, end time.Time) (*kubemodel.KubeModelSet, error) {
  31. // 1. Initialize new KubeModelSet for requested Window
  32. kms := kubemodel.NewKubeModelSet(start, end)
  33. // 2. Query CostModel for each set of objects
  34. var err error
  35. // 2.1 Compute Cluster
  36. err = km.computeCluster(kms, start, end)
  37. if err != nil {
  38. kms.Error(err)
  39. return kms, fmt.Errorf("error computing kubemodel.Cluster for (%s, %s): %w", start.Format(logTimeFmt), end.Format(logTimeFmt), err)
  40. }
  41. // 2.2 Compute Nodes
  42. err = km.computeNodes(kms, start, end)
  43. if err != nil {
  44. kms.Error(err)
  45. }
  46. // 2.3 Compute Namespaces
  47. err = km.computeNamespaces(kms, start, end)
  48. if err != nil {
  49. kms.Error(err)
  50. }
  51. // 2.5 Compute Pods
  52. err = km.computePods(kms, start, end)
  53. if err != nil {
  54. kms.Error(err)
  55. }
  56. // 2.6 Compute Deployments
  57. err = km.computeDeployments(kms, start, end)
  58. if err != nil {
  59. kms.Error(err)
  60. }
  61. // 2.7 Compute StatefulSets
  62. err = km.computeStatefulSets(kms, start, end)
  63. if err != nil {
  64. kms.Error(err)
  65. }
  66. // 2.8 Compute DaemonSets
  67. err = km.computeDaemonSets(kms, start, end)
  68. if err != nil {
  69. kms.Error(err)
  70. }
  71. // 2.9 Compute Jobs
  72. err = km.computeJobs(kms, start, end)
  73. if err != nil {
  74. kms.Error(err)
  75. }
  76. // 2.10 Compute CronJobs
  77. err = km.computeCronJobs(kms, start, end)
  78. if err != nil {
  79. kms.Error(err)
  80. }
  81. // 2.11 Compute ReplicaSets
  82. err = km.computeReplicaSets(kms, start, end)
  83. if err != nil {
  84. kms.Error(err)
  85. }
  86. // 2.12 Compute Containers
  87. err = km.computeContainers(kms, start, end)
  88. if err != nil {
  89. kms.Error(err)
  90. }
  91. // 2.13 Compute ResourceQuotas
  92. err = km.computeResourceQuotas(kms, start, end)
  93. if err != nil {
  94. kms.Error(err)
  95. }
  96. // 2.14 Compute Services
  97. err = km.computeServices(kms, start, end)
  98. if err != nil {
  99. kms.Error(err)
  100. }
  101. // 2.15 Compute PersistentVolumes
  102. err = km.computePersistentVolumes(kms, start, end)
  103. if err != nil {
  104. kms.Error(err)
  105. }
  106. // 2.16 Compute PersistentVolumeClaims
  107. err = km.computePersistentVolumeClaims(kms, start, end)
  108. if err != nil {
  109. kms.Error(err)
  110. }
  111. // 2.17 Compute DCGM Devices
  112. err = km.computeDCGMDevices(kms, start, end)
  113. if err != nil {
  114. kms.Error(err)
  115. }
  116. // 3. Mark KubeModelSet as completed
  117. kms.Metadata.CompletedAt = time.Now().UTC()
  118. return kms, nil
  119. }