config.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package kubecost
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. // LabelConfig is a port of type AnalyzerConfig. We need to be more thoughtful
  7. // about design at some point, but this is a stop-gap measure, which is required
  8. // because AnalyzerConfig is defined in package main, so it can't be imported.
  9. type LabelConfig struct {
  10. DepartmentLabel string `json:"department_label"`
  11. EnvironmentLabel string `json:"environment_label"`
  12. OwnerLabel string `json:"owner_label"`
  13. ProductLabel string `json:"product_label"`
  14. TeamLabel string `json:"team_label"`
  15. ClusterExternalLabel string `json:"cluster_external_label"`
  16. NamespaceExternalLabel string `json:"namespace_external_label"`
  17. ControllerExternalLabel string `json:"controller_external_label"`
  18. DaemonsetExternalLabel string `json:"daemonset_external_label"`
  19. DeploymentExternalLabel string `json:"deployment_external_label"`
  20. StatefulsetExternalLabel string `json:"statefulset_external_label"`
  21. ServiceExternalLabel string `json:"service_external_label"`
  22. PodExternalLabel string `json:"pod_external_label"`
  23. DepartmentExternalLabel string `json:"department_external_label"`
  24. EnvironmentExternalLabel string `json:"environment_external_label"`
  25. OwnerExternalLabel string `json:"owner_external_label"`
  26. ProductExternalLabel string `json:"product_external_label"`
  27. TeamExternalLabel string `json:"team_external_label"`
  28. }
  29. // Map returns the config as a basic string map, with default values if not set
  30. func (lc *LabelConfig) Map() map[string]string {
  31. // Start with default values
  32. m := map[string]string{
  33. "department_label": "department",
  34. "environment_label": "env",
  35. "owner_label": "owner",
  36. "product_label": "app",
  37. "team_label": "team",
  38. "cluster_external_label": "kubernetes_cluster",
  39. "namespace_external_label": "kubernetes_namespace",
  40. "controller_external_label": "kubernetes_controller",
  41. "daemonset_external_label": "kubernetes_daemonset",
  42. "deployment_external_label": "kubernetes_deployment",
  43. "statefulset_external_label": "kubernetes_statefulset",
  44. "service_external_label": "kubernetes_service",
  45. "pod_external_label": "kubernetes_pod",
  46. "department_external_label": "kubernetes_label_department",
  47. "environment_external_label": "kubernetes_label_env",
  48. "owner_external_label": "kubernetes_label_owner",
  49. "product_external_label": "kubernetes_label_app",
  50. "team_external_label": "kubernetes_label_team",
  51. }
  52. if lc == nil {
  53. return m
  54. }
  55. if lc.DepartmentLabel != "" {
  56. m["department_label"] = lc.DepartmentLabel
  57. }
  58. if lc.EnvironmentLabel != "" {
  59. m["environment_label"] = lc.EnvironmentLabel
  60. }
  61. if lc.OwnerLabel != "" {
  62. m["owner_label"] = lc.OwnerLabel
  63. }
  64. if lc.ProductLabel != "" {
  65. m["product_label"] = lc.ProductLabel
  66. }
  67. if lc.TeamLabel != "" {
  68. m["team_label"] = lc.TeamLabel
  69. }
  70. if lc.ClusterExternalLabel != "" {
  71. m["cluster_external_label"] = lc.ClusterExternalLabel
  72. }
  73. if lc.NamespaceExternalLabel != "" {
  74. m["namespace_external_label"] = lc.NamespaceExternalLabel
  75. }
  76. if lc.ControllerExternalLabel != "" {
  77. m["controller_external_label"] = lc.ControllerExternalLabel
  78. }
  79. if lc.DaemonsetExternalLabel != "" {
  80. m["daemonset_external_label"] = lc.DaemonsetExternalLabel
  81. }
  82. if lc.DeploymentExternalLabel != "" {
  83. m["deployment_external_label"] = lc.DeploymentExternalLabel
  84. }
  85. if lc.StatefulsetExternalLabel != "" {
  86. m["statefulset_external_label"] = lc.StatefulsetExternalLabel
  87. }
  88. if lc.ServiceExternalLabel != "" {
  89. m["service_external_label"] = lc.ServiceExternalLabel
  90. }
  91. if lc.PodExternalLabel != "" {
  92. m["pod_external_label"] = lc.PodExternalLabel
  93. }
  94. if lc.DepartmentExternalLabel != "" {
  95. m["department_external_label"] = lc.DepartmentExternalLabel
  96. } else if lc.DepartmentLabel != "" {
  97. m["department_external_label"] = "kubernetes_label_" + lc.DepartmentLabel
  98. }
  99. if lc.EnvironmentExternalLabel != "" {
  100. m["environment_external_label"] = lc.EnvironmentExternalLabel
  101. } else if lc.EnvironmentLabel != "" {
  102. m["environment_external_label"] = "kubernetes_label_" + lc.EnvironmentLabel
  103. }
  104. if lc.OwnerExternalLabel != "" {
  105. m["owner_external_label"] = lc.OwnerExternalLabel
  106. } else if lc.OwnerLabel != "" {
  107. m["owner_external_label"] = "kubernetes_label_" + lc.OwnerLabel
  108. }
  109. if lc.ProductExternalLabel != "" {
  110. m["product_external_label"] = lc.ProductExternalLabel
  111. } else if lc.ProductLabel != "" {
  112. m["product_external_label"] = "kubernetes_label_" + lc.ProductLabel
  113. }
  114. if lc.TeamExternalLabel != "" {
  115. m["team_external_label"] = lc.TeamExternalLabel
  116. } else if lc.TeamLabel != "" {
  117. m["team_external_label"] = "kubernetes_label_" + lc.TeamLabel
  118. }
  119. return m
  120. }
  121. // ExternalQueryLabels returns the config's external labels as a mapping of the
  122. // query column to the label it should set;
  123. // e.g. if the config stores "statefulset_external_label": "kubernetes_sset",
  124. // then this would return "kubernetes_sset": "statefulset"
  125. func (lc *LabelConfig) ExternalQueryLabels() map[string]string {
  126. queryLabels := map[string]string{}
  127. for label, query := range lc.Map() {
  128. if strings.HasSuffix(label, "external_label") && query != "" {
  129. queryLabels[query] = label
  130. }
  131. }
  132. return queryLabels
  133. }
  134. // AllocationPropertyLabels returns the config's external resource labels
  135. // as a mapping from k8s resource-to-label name.
  136. // e.g. if the config stores "statefulset_external_label": "kubernetes_sset",
  137. // then this would return "statefulset": "kubernetes_sset"
  138. // e.g. if the config stores "owner_label": "product_owner",
  139. // then this would return "label:product_owner": "product_owner"
  140. func (lc *LabelConfig) AllocationPropertyLabels() map[string]string {
  141. labels := map[string]string{}
  142. for labelKind, labelName := range lc.Map() {
  143. if labelName != "" {
  144. switch labelKind {
  145. case "namespace_external_label":
  146. labels["namespace"] = labelName
  147. case "cluster_external_label":
  148. labels["cluster"] = labelName
  149. case "controller_external_label":
  150. labels["controller"] = labelName
  151. case "product_external_label":
  152. labels["product"] = labelName
  153. case "service_external_label":
  154. labels["service"] = labelName
  155. case "deployment_external_label":
  156. labels["deployment"] = labelName
  157. case "statefulset_external_label":
  158. labels["statefulset"] = labelName
  159. case "daemonset_external_label":
  160. labels["daemonset"] = labelName
  161. case "pod_external_label":
  162. labels["pod"] = labelName
  163. default:
  164. labels[fmt.Sprintf("label:%s", labelName)] = labelName
  165. }
  166. }
  167. }
  168. return labels
  169. }