cloud_test.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package test
  2. import (
  3. "testing"
  4. "github.com/kubecost/cost-model/pkg/cloud"
  5. v1 "k8s.io/api/core/v1"
  6. )
  7. const(
  8. providerIDMap = "spec.providerID"
  9. nameMap = "metadata.name"
  10. labelMapFoo = "metadata.labels.foo"
  11. )
  12. func TestRegionValueFromMapField(t * testing.T) {
  13. wantRegion := "useast"
  14. wantpid := "/subscriptions/0bd50fdf-c923-4e1e-850c-196dd3dcc5d3/resourceGroups/MC_test_test_eastus/providers/Microsoft.Compute/virtualMachines/aks-agentpool-20139558-0"
  15. providerIDWant := wantRegion + "," + wantpid
  16. n := &v1.Node{}
  17. n.Spec.ProviderID = "azure:///subscriptions/0bd50fdf-c923-4e1e-850c-196dd3dcc5d3/resourceGroups/MC_test_test_eastus/providers/Microsoft.Compute/virtualMachines/aks-agentpool-20139558-0"
  18. n.Labels = make(map[string]string)
  19. n.Labels[v1.LabelZoneRegion] = wantRegion
  20. got := cloud.NodeValueFromMapField(providerIDMap, n, true)
  21. if got != providerIDWant {
  22. t.Errorf("Assert on '%s' want '%s' got '%s'", providerIDMap, providerIDWant, got)
  23. }
  24. }
  25. func TestTransformedValueFromMapField(t *testing.T) {
  26. providerIDWant := "i-05445591e0d182d42"
  27. n := &v1.Node{}
  28. n.Spec.ProviderID = "aws:///us-east-1a/i-05445591e0d182d42"
  29. got := cloud.NodeValueFromMapField(providerIDMap, n, false)
  30. if got != providerIDWant {
  31. t.Errorf("Assert on '%s' want '%s' got '%s'", providerIDMap, providerIDWant, got)
  32. }
  33. providerIDWant2 := "/subscriptions/0bd50fdf-c923-4e1e-850c-196dd3dcc5d3/resourceGroups/MC_test_test_eastus/providers/Microsoft.Compute/virtualMachines/aks-agentpool-20139558-0"
  34. n2 := &v1.Node{}
  35. n2.Spec.ProviderID = "azure:///subscriptions/0bd50fdf-c923-4e1e-850c-196dd3dcc5d3/resourceGroups/MC_test_test_eastus/providers/Microsoft.Compute/virtualMachines/aks-agentpool-20139558-0"
  36. got2 := cloud.NodeValueFromMapField(providerIDMap, n2, false)
  37. if got2 != providerIDWant2 {
  38. t.Errorf("Assert on '%s' want '%s' got '%s'", providerIDMap, providerIDWant2, got2)
  39. }
  40. providerIDWant3 := "/subscriptions/0bd50fdf-c923-4e1e-850c-196dd3dcc5d3/resourceGroups/mc_testspot_testspot_eastus/providers/Microsoft.Compute/virtualMachineScaleSets/aks-nodepool1-19213364-vmss/virtualMachines/0"
  41. n3 := &v1.Node{}
  42. n3.Spec.ProviderID = "azure:///subscriptions/0bd50fdf-c923-4e1e-850c-196dd3dcc5d3/resourceGroups/mc_testspot_testspot_eastus/providers/Microsoft.Compute/virtualMachineScaleSets/aks-nodepool1-19213364-vmss/virtualMachines/0"
  43. got3 := cloud.NodeValueFromMapField(providerIDMap, n3, false)
  44. if got3 != providerIDWant3 {
  45. t.Errorf("Assert on '%s' want '%s' got '%s'", providerIDMap, providerIDWant3, got3)
  46. }
  47. }
  48. func TestNodeValueFromMapField(t *testing.T) {
  49. providerIDWant := "providerid"
  50. nameWant := "gke-standard-cluster-1-pool-1-91dc432d-cg69"
  51. labelFooWant := "labelfoo"
  52. n := &v1.Node{}
  53. n.Spec.ProviderID = providerIDWant
  54. n.Name = nameWant
  55. n.Labels = make(map[string]string)
  56. n.Labels["foo"] = labelFooWant
  57. got := cloud.NodeValueFromMapField(providerIDMap, n, false)
  58. if got != providerIDWant {
  59. t.Errorf("Assert on '%s' want '%s' got '%s'", providerIDMap, providerIDWant, got)
  60. }
  61. got = cloud.NodeValueFromMapField(nameMap, n, false)
  62. if got != nameWant {
  63. t.Errorf("Assert on '%s' want '%s' got '%s'", nameMap, nameWant, got)
  64. }
  65. got = cloud.NodeValueFromMapField(labelMapFoo, n, false)
  66. if got != labelFooWant {
  67. t.Errorf("Assert on '%s' want '%s' got '%s'", labelMapFoo, labelFooWant, got)
  68. }
  69. }
  70. func TestNodePriceFromCSV(t * testing.T) {
  71. providerIDWant := "providerid"
  72. nameWant := "gke-standard-cluster-1-pool-1-91dc432d-cg69"
  73. labelFooWant := "labelfoo"
  74. n := &v1.Node{}
  75. n.Spec.ProviderID = providerIDWant
  76. n.Name = nameWant
  77. n.Labels = make(map[string]string)
  78. n.Labels["foo"] = labelFooWant
  79. wantPrice := "0.1337"
  80. c := &cloud.CSVProvider{
  81. CSVLocation: "../configs/pricing_schema.csv",
  82. CustomProvider: &cloud.CustomProvider{
  83. Config: cloud.NewProviderConfig("../configs/default.json"),
  84. },
  85. }
  86. c.DownloadPricingData()
  87. k := c.GetKey(n.Labels, n)
  88. resN, err := c.NodePricing(k)
  89. if err != nil {
  90. t.Errorf("Error in NodePricing: %s", err.Error())
  91. } else {
  92. gotPrice := resN.Cost
  93. if gotPrice != wantPrice {
  94. t.Errorf("Wanted price '%s' got price '%s'", wantPrice, gotPrice)
  95. }
  96. }
  97. unknownN := &v1.Node{}
  98. unknownN.Spec.ProviderID = providerIDWant
  99. unknownN.Name = "unknownname"
  100. unknownN.Labels = make(map[string]string)
  101. unknownN.Labels["foo"] = labelFooWant
  102. k2 := c.GetKey(n.Labels, unknownN)
  103. resN2, _ := c.NodePricing(k2)
  104. if resN2 != nil {
  105. t.Errorf("CSV provider should return nil on missing node")
  106. }
  107. c2 := &cloud.CSVProvider{
  108. CSVLocation: "../configs/fake.csv",
  109. CustomProvider: &cloud.CustomProvider{
  110. Config: cloud.NewProviderConfig("../configs/default.json"),
  111. },
  112. }
  113. k3 := c.GetKey(n.Labels, n)
  114. resN3, _ := c2.NodePricing(k3)
  115. if resN3 != nil {
  116. t.Errorf("CSV provider should return nil on missing csv")
  117. }
  118. }
  119. func TestNodePriceFromCSVWithRegion(t * testing.T) {
  120. providerIDWant := "gke-standard-cluster-1-pool-1-91dc432d-cg69"
  121. nameWant := "foo"
  122. labelFooWant := "labelfoo"
  123. n := &v1.Node{}
  124. n.Spec.ProviderID = providerIDWant
  125. n.Name = nameWant
  126. n.Labels = make(map[string]string)
  127. n.Labels["foo"] = labelFooWant
  128. n.Labels[v1.LabelZoneRegion] = "regionone"
  129. wantPrice := "0.1337"
  130. n2 := &v1.Node{}
  131. n2.Spec.ProviderID = providerIDWant
  132. n2.Name = nameWant
  133. n2.Labels = make(map[string]string)
  134. n2.Labels["foo"] = labelFooWant
  135. n2.Labels[v1.LabelZoneRegion] = "regiontwo"
  136. wantPrice2 := "0.1338"
  137. n3 := &v1.Node{}
  138. n3.Spec.ProviderID = providerIDWant
  139. n3.Name = nameWant
  140. n3.Labels = make(map[string]string)
  141. n3.Labels["foo"] = labelFooWant
  142. n3.Labels[v1.LabelZoneRegion] = "fakeregion"
  143. wantPrice3 := "0.1339"
  144. c := &cloud.CSVProvider{
  145. CSVLocation: "../configs/pricing_schema_region.csv",
  146. CustomProvider: &cloud.CustomProvider{
  147. Config: cloud.NewProviderConfig("../configs/default.json"),
  148. },
  149. }
  150. c.DownloadPricingData()
  151. k := c.GetKey(n.Labels, n)
  152. resN, err := c.NodePricing(k)
  153. if err != nil {
  154. t.Errorf("Error in NodePricing: %s", err.Error())
  155. } else {
  156. gotPrice := resN.Cost
  157. if gotPrice != wantPrice {
  158. t.Errorf("Wanted price '%s' got price '%s'", wantPrice, gotPrice)
  159. }
  160. }
  161. k2 := c.GetKey(n2.Labels, n2)
  162. resN2, err := c.NodePricing(k2)
  163. if err != nil {
  164. t.Errorf("Error in NodePricing: %s", err.Error())
  165. } else {
  166. gotPrice := resN2.Cost
  167. if gotPrice != wantPrice2 {
  168. t.Errorf("Wanted price '%s' got price '%s'", wantPrice2, gotPrice)
  169. }
  170. }
  171. k3 := c.GetKey(n3.Labels, n3)
  172. resN3, err := c.NodePricing(k3)
  173. if err != nil {
  174. t.Errorf("Error in NodePricing: %s", err.Error())
  175. } else {
  176. gotPrice := resN3.Cost
  177. if gotPrice != wantPrice3 {
  178. t.Errorf("Wanted price '%s' got price '%s'", wantPrice3, gotPrice)
  179. }
  180. }
  181. unknownN := &v1.Node{}
  182. unknownN.Spec.ProviderID = "fake providerID"
  183. unknownN.Name = "unknownname"
  184. unknownN.Labels = make(map[string]string)
  185. unknownN.Labels["foo"] = labelFooWant
  186. k4 := c.GetKey(unknownN.Labels, unknownN)
  187. resN4, _ := c.NodePricing(k4)
  188. if resN4 != nil {
  189. t.Errorf("CSV provider should return nil on missing node, instead returned %+v", resN4)
  190. }
  191. c2 := &cloud.CSVProvider{
  192. CSVLocation: "../configs/fake.csv",
  193. CustomProvider: &cloud.CustomProvider{
  194. Config: cloud.NewProviderConfig("../configs/default.json"),
  195. },
  196. }
  197. k5 := c.GetKey(n.Labels, n)
  198. resN5, _ := c2.NodePricing(k5)
  199. if resN5 != nil {
  200. t.Errorf("CSV provider should return nil on missing csv")
  201. }
  202. }