cluster_helpers_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. package costmodel
  2. import (
  3. "reflect"
  4. "testing"
  5. "time"
  6. "github.com/davecgh/go-spew/spew"
  7. )
  8. func TestMergeTypeMaps(t *testing.T) {
  9. cases := []struct {
  10. name string
  11. map1 map[nodeIdentifierNoProviderID]string
  12. map2 map[nodeIdentifierNoProviderID]string
  13. expected map[nodeIdentifierNoProviderID]string
  14. }{
  15. {
  16. name: "both empty",
  17. map1: map[nodeIdentifierNoProviderID]string{},
  18. map2: map[nodeIdentifierNoProviderID]string{},
  19. expected: map[nodeIdentifierNoProviderID]string{},
  20. },
  21. {
  22. name: "map2 empty",
  23. map1: map[nodeIdentifierNoProviderID]string{
  24. nodeIdentifierNoProviderID{
  25. Cluster: "cluster1",
  26. Name: "node1",
  27. }: "type1",
  28. },
  29. map2: map[nodeIdentifierNoProviderID]string{},
  30. expected: map[nodeIdentifierNoProviderID]string{
  31. nodeIdentifierNoProviderID{
  32. Cluster: "cluster1",
  33. Name: "node1",
  34. }: "type1",
  35. },
  36. },
  37. {
  38. name: "map2 empty",
  39. map1: map[nodeIdentifierNoProviderID]string{},
  40. map2: map[nodeIdentifierNoProviderID]string{
  41. nodeIdentifierNoProviderID{
  42. Cluster: "cluster1",
  43. Name: "node1",
  44. }: "type1",
  45. },
  46. expected: map[nodeIdentifierNoProviderID]string{
  47. nodeIdentifierNoProviderID{
  48. Cluster: "cluster1",
  49. Name: "node1",
  50. }: "type1",
  51. },
  52. },
  53. {
  54. name: "no overlap",
  55. map1: map[nodeIdentifierNoProviderID]string{
  56. nodeIdentifierNoProviderID{
  57. Cluster: "cluster1",
  58. Name: "node1",
  59. }: "type1",
  60. },
  61. map2: map[nodeIdentifierNoProviderID]string{
  62. nodeIdentifierNoProviderID{
  63. Cluster: "cluster1",
  64. Name: "node2",
  65. }: "type2",
  66. nodeIdentifierNoProviderID{
  67. Cluster: "cluster1",
  68. Name: "node4",
  69. }: "type4",
  70. },
  71. expected: map[nodeIdentifierNoProviderID]string{
  72. nodeIdentifierNoProviderID{
  73. Cluster: "cluster1",
  74. Name: "node1",
  75. }: "type1",
  76. nodeIdentifierNoProviderID{
  77. Cluster: "cluster1",
  78. Name: "node2",
  79. }: "type2",
  80. nodeIdentifierNoProviderID{
  81. Cluster: "cluster1",
  82. Name: "node4",
  83. }: "type4",
  84. },
  85. },
  86. {
  87. name: "with overlap",
  88. map1: map[nodeIdentifierNoProviderID]string{
  89. nodeIdentifierNoProviderID{
  90. Cluster: "cluster1",
  91. Name: "node1",
  92. }: "type1",
  93. },
  94. map2: map[nodeIdentifierNoProviderID]string{
  95. nodeIdentifierNoProviderID{
  96. Cluster: "cluster1",
  97. Name: "node2",
  98. }: "type2",
  99. nodeIdentifierNoProviderID{
  100. Cluster: "cluster1",
  101. Name: "node1",
  102. }: "type4",
  103. },
  104. expected: map[nodeIdentifierNoProviderID]string{
  105. nodeIdentifierNoProviderID{
  106. Cluster: "cluster1",
  107. Name: "node1",
  108. }: "type1",
  109. nodeIdentifierNoProviderID{
  110. Cluster: "cluster1",
  111. Name: "node2",
  112. }: "type2",
  113. },
  114. },
  115. }
  116. for _, testCase := range cases {
  117. result := mergeTypeMaps(testCase.map1, testCase.map2)
  118. if !reflect.DeepEqual(result, testCase.expected) {
  119. t.Errorf("mergeTypeMaps case %s failed. Got %+v but expected %+v", testCase.name, result, testCase.expected)
  120. }
  121. }
  122. }
  123. func TestBuildNodeMap(t *testing.T) {
  124. cases := []struct {
  125. name string
  126. cpuCostMap map[NodeIdentifier]float64
  127. ramCostMap map[NodeIdentifier]float64
  128. gpuCostMap map[NodeIdentifier]float64
  129. cpuCoresMap map[nodeIdentifierNoProviderID]float64
  130. ramBytesMap map[nodeIdentifierNoProviderID]float64
  131. ramUserPctMap map[nodeIdentifierNoProviderID]float64
  132. ramSystemPctMap map[nodeIdentifierNoProviderID]float64
  133. cpuBreakdownMap map[nodeIdentifierNoProviderID]*ClusterCostsBreakdown
  134. activeDataMap map[NodeIdentifier]activeData
  135. preemptibleMap map[NodeIdentifier]bool
  136. labelsMap map[nodeIdentifierNoProviderID]map[string]string
  137. clusterAndNameToType map[nodeIdentifierNoProviderID]string
  138. expected map[NodeIdentifier]*Node
  139. }{
  140. {
  141. name: "empty",
  142. expected: map[NodeIdentifier]*Node{},
  143. },
  144. {
  145. name: "just cpu cost",
  146. cpuCostMap: map[NodeIdentifier]float64{
  147. NodeIdentifier{
  148. Cluster: "cluster1",
  149. Name: "node1",
  150. ProviderID: "prov_node1",
  151. }: 0.048,
  152. },
  153. clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
  154. nodeIdentifierNoProviderID{
  155. Cluster: "cluster1",
  156. Name: "node1",
  157. }: "type1",
  158. },
  159. expected: map[NodeIdentifier]*Node{
  160. NodeIdentifier{
  161. Cluster: "cluster1",
  162. Name: "node1",
  163. ProviderID: "prov_node1",
  164. }: &Node{
  165. Cluster: "cluster1",
  166. Name: "node1",
  167. ProviderID: "prov_node1",
  168. NodeType: "type1",
  169. CPUCost: 0.048,
  170. CPUBreakdown: &ClusterCostsBreakdown{},
  171. RAMBreakdown: &ClusterCostsBreakdown{},
  172. },
  173. },
  174. },
  175. {
  176. name: "just cpu cost with empty provider ID",
  177. cpuCostMap: map[NodeIdentifier]float64{
  178. NodeIdentifier{
  179. Cluster: "cluster1",
  180. Name: "node1",
  181. }: 0.048,
  182. },
  183. clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
  184. nodeIdentifierNoProviderID{
  185. Cluster: "cluster1",
  186. Name: "node1",
  187. }: "type1",
  188. },
  189. expected: map[NodeIdentifier]*Node{
  190. NodeIdentifier{
  191. Cluster: "cluster1",
  192. Name: "node1",
  193. }: &Node{
  194. Cluster: "cluster1",
  195. Name: "node1",
  196. NodeType: "type1",
  197. CPUCost: 0.048,
  198. CPUBreakdown: &ClusterCostsBreakdown{},
  199. RAMBreakdown: &ClusterCostsBreakdown{},
  200. },
  201. },
  202. },
  203. {
  204. name: "cpu cost with overlapping node names",
  205. cpuCostMap: map[NodeIdentifier]float64{
  206. NodeIdentifier{
  207. Cluster: "cluster1",
  208. Name: "node1",
  209. ProviderID: "prov_node1_A",
  210. }: 0.048,
  211. NodeIdentifier{
  212. Cluster: "cluster1",
  213. Name: "node1",
  214. ProviderID: "prov_node1_B",
  215. }: 0.087,
  216. },
  217. clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
  218. nodeIdentifierNoProviderID{
  219. Cluster: "cluster1",
  220. Name: "node1",
  221. }: "type1",
  222. },
  223. expected: map[NodeIdentifier]*Node{
  224. NodeIdentifier{
  225. Cluster: "cluster1",
  226. Name: "node1",
  227. ProviderID: "prov_node1_A",
  228. }: &Node{
  229. Cluster: "cluster1",
  230. Name: "node1",
  231. ProviderID: "prov_node1_A",
  232. NodeType: "type1",
  233. CPUCost: 0.048,
  234. CPUBreakdown: &ClusterCostsBreakdown{},
  235. RAMBreakdown: &ClusterCostsBreakdown{},
  236. },
  237. NodeIdentifier{
  238. Cluster: "cluster1",
  239. Name: "node1",
  240. ProviderID: "prov_node1_B",
  241. }: &Node{
  242. Cluster: "cluster1",
  243. Name: "node1",
  244. ProviderID: "prov_node1_B",
  245. NodeType: "type1",
  246. CPUCost: 0.087,
  247. CPUBreakdown: &ClusterCostsBreakdown{},
  248. RAMBreakdown: &ClusterCostsBreakdown{},
  249. },
  250. },
  251. },
  252. {
  253. name: "all fields + overlapping node names",
  254. cpuCostMap: map[NodeIdentifier]float64{
  255. NodeIdentifier{
  256. Cluster: "cluster1",
  257. Name: "node1",
  258. ProviderID: "prov_node1_A",
  259. }: 0.048,
  260. NodeIdentifier{
  261. Cluster: "cluster1",
  262. Name: "node1",
  263. ProviderID: "prov_node1_B",
  264. }: 0.087,
  265. NodeIdentifier{
  266. Cluster: "cluster1",
  267. Name: "node2",
  268. ProviderID: "prov_node2_A",
  269. }: 0.033,
  270. },
  271. ramCostMap: map[NodeIdentifier]float64{
  272. NodeIdentifier{
  273. Cluster: "cluster1",
  274. Name: "node1",
  275. ProviderID: "prov_node1_A",
  276. }: 0.09,
  277. NodeIdentifier{
  278. Cluster: "cluster1",
  279. Name: "node1",
  280. ProviderID: "prov_node1_B",
  281. }: 0.3,
  282. NodeIdentifier{
  283. Cluster: "cluster1",
  284. Name: "node2",
  285. ProviderID: "prov_node2_A",
  286. }: 0.024,
  287. },
  288. gpuCostMap: map[NodeIdentifier]float64{
  289. NodeIdentifier{
  290. Cluster: "cluster1",
  291. Name: "node1",
  292. ProviderID: "prov_node1_A",
  293. }: 0.8,
  294. NodeIdentifier{
  295. Cluster: "cluster1",
  296. Name: "node1",
  297. ProviderID: "prov_node1_B",
  298. }: 1.4,
  299. NodeIdentifier{
  300. Cluster: "cluster1",
  301. Name: "node2",
  302. ProviderID: "prov_node2_A",
  303. }: 3.1,
  304. },
  305. cpuCoresMap: map[nodeIdentifierNoProviderID]float64{
  306. nodeIdentifierNoProviderID{
  307. Cluster: "cluster1",
  308. Name: "node1",
  309. }: 2.0,
  310. nodeIdentifierNoProviderID{
  311. Cluster: "cluster1",
  312. Name: "node2",
  313. }: 5.0,
  314. },
  315. ramBytesMap: map[nodeIdentifierNoProviderID]float64{
  316. nodeIdentifierNoProviderID{
  317. Cluster: "cluster1",
  318. Name: "node1",
  319. }: 2048.0,
  320. nodeIdentifierNoProviderID{
  321. Cluster: "cluster1",
  322. Name: "node2",
  323. }: 6303.0,
  324. },
  325. ramUserPctMap: map[nodeIdentifierNoProviderID]float64{
  326. nodeIdentifierNoProviderID{
  327. Cluster: "cluster1",
  328. Name: "node1",
  329. }: 30.0,
  330. nodeIdentifierNoProviderID{
  331. Cluster: "cluster1",
  332. Name: "node2",
  333. }: 42.6,
  334. },
  335. ramSystemPctMap: map[nodeIdentifierNoProviderID]float64{
  336. nodeIdentifierNoProviderID{
  337. Cluster: "cluster1",
  338. Name: "node1",
  339. }: 15.0,
  340. nodeIdentifierNoProviderID{
  341. Cluster: "cluster1",
  342. Name: "node2",
  343. }: 20.1,
  344. },
  345. cpuBreakdownMap: map[nodeIdentifierNoProviderID]*ClusterCostsBreakdown{
  346. nodeIdentifierNoProviderID{
  347. Cluster: "cluster1",
  348. Name: "node1",
  349. }: &ClusterCostsBreakdown{
  350. System: 20.2,
  351. User: 68.0,
  352. },
  353. nodeIdentifierNoProviderID{
  354. Cluster: "cluster1",
  355. Name: "node2",
  356. }: &ClusterCostsBreakdown{
  357. System: 28.9,
  358. User: 34.0,
  359. },
  360. },
  361. activeDataMap: map[NodeIdentifier]activeData{
  362. NodeIdentifier{
  363. Cluster: "cluster1",
  364. Name: "node1",
  365. ProviderID: "prov_node1_A",
  366. }: activeData{
  367. start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
  368. end: time.Date(2020, 6, 16, 9, 20, 39, 0, time.UTC),
  369. minutes: 5*60 + 35 + (11.0 / 60.0),
  370. },
  371. NodeIdentifier{
  372. Cluster: "cluster1",
  373. Name: "node1",
  374. ProviderID: "prov_node1_B",
  375. }: activeData{
  376. start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
  377. end: time.Date(2020, 6, 16, 9, 21, 39, 0, time.UTC),
  378. minutes: 5*60 + 36 + (11.0 / 60.0),
  379. },
  380. NodeIdentifier{
  381. Cluster: "cluster1",
  382. Name: "node2",
  383. ProviderID: "prov_node2_A",
  384. }: activeData{
  385. start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
  386. end: time.Date(2020, 6, 16, 9, 10, 39, 0, time.UTC),
  387. minutes: 5*60 + 25 + (11.0 / 60.0),
  388. },
  389. },
  390. preemptibleMap: map[NodeIdentifier]bool{
  391. NodeIdentifier{
  392. Cluster: "cluster1",
  393. Name: "node1",
  394. ProviderID: "prov_node1_A",
  395. }: true,
  396. NodeIdentifier{
  397. Cluster: "cluster1",
  398. Name: "node1",
  399. ProviderID: "prov_node1_B",
  400. }: false,
  401. NodeIdentifier{
  402. Cluster: "cluster1",
  403. Name: "node2",
  404. ProviderID: "prov_node2_A",
  405. }: false,
  406. },
  407. labelsMap: map[nodeIdentifierNoProviderID]map[string]string{
  408. nodeIdentifierNoProviderID{
  409. Cluster: "cluster1",
  410. Name: "node1",
  411. }: map[string]string{
  412. "labelname1_A": "labelvalue1_A",
  413. "labelname1_B": "labelvalue1_B",
  414. },
  415. nodeIdentifierNoProviderID{
  416. Cluster: "cluster1",
  417. Name: "node2",
  418. }: map[string]string{
  419. "labelname2_A": "labelvalue2_A",
  420. "labelname2_B": "labelvalue2_B",
  421. },
  422. },
  423. clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
  424. nodeIdentifierNoProviderID{
  425. Cluster: "cluster1",
  426. Name: "node1",
  427. }: "type1",
  428. nodeIdentifierNoProviderID{
  429. Cluster: "cluster1",
  430. Name: "node2",
  431. }: "type2",
  432. },
  433. expected: map[NodeIdentifier]*Node{
  434. NodeIdentifier{
  435. Cluster: "cluster1",
  436. Name: "node1",
  437. ProviderID: "prov_node1_A",
  438. }: &Node{
  439. Cluster: "cluster1",
  440. Name: "node1",
  441. ProviderID: "prov_node1_A",
  442. NodeType: "type1",
  443. CPUCost: 0.048,
  444. RAMCost: 0.09,
  445. GPUCost: 0.8,
  446. CPUCores: 2.0,
  447. RAMBytes: 2048.0,
  448. RAMBreakdown: &ClusterCostsBreakdown{
  449. User: 30.0,
  450. System: 15.0,
  451. },
  452. CPUBreakdown: &ClusterCostsBreakdown{
  453. System: 20.2,
  454. User: 68.0,
  455. },
  456. Start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
  457. End: time.Date(2020, 6, 16, 9, 20, 39, 0, time.UTC),
  458. Minutes: 5*60 + 35 + (11.0 / 60.0),
  459. Preemptible: true,
  460. Labels: map[string]string{
  461. "labelname1_A": "labelvalue1_A",
  462. "labelname1_B": "labelvalue1_B",
  463. },
  464. },
  465. NodeIdentifier{
  466. Cluster: "cluster1",
  467. Name: "node1",
  468. ProviderID: "prov_node1_B",
  469. }: &Node{
  470. Cluster: "cluster1",
  471. Name: "node1",
  472. ProviderID: "prov_node1_B",
  473. NodeType: "type1",
  474. CPUCost: 0.087,
  475. RAMCost: 0.3,
  476. GPUCost: 1.4,
  477. CPUCores: 2.0,
  478. RAMBytes: 2048.0,
  479. RAMBreakdown: &ClusterCostsBreakdown{
  480. User: 30.0,
  481. System: 15.0,
  482. },
  483. CPUBreakdown: &ClusterCostsBreakdown{
  484. System: 20.2,
  485. User: 68.0,
  486. },
  487. Start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
  488. End: time.Date(2020, 6, 16, 9, 21, 39, 0, time.UTC),
  489. Minutes: 5*60 + 36 + (11.0 / 60.0),
  490. Preemptible: false,
  491. Labels: map[string]string{
  492. "labelname1_A": "labelvalue1_A",
  493. "labelname1_B": "labelvalue1_B",
  494. },
  495. },
  496. NodeIdentifier{
  497. Cluster: "cluster1",
  498. Name: "node2",
  499. ProviderID: "prov_node2_A",
  500. }: &Node{
  501. Cluster: "cluster1",
  502. Name: "node2",
  503. ProviderID: "prov_node2_A",
  504. NodeType: "type2",
  505. CPUCost: 0.033,
  506. RAMCost: 0.024,
  507. GPUCost: 3.1,
  508. CPUCores: 5.0,
  509. RAMBytes: 6303.0,
  510. RAMBreakdown: &ClusterCostsBreakdown{
  511. User: 42.6,
  512. System: 20.1,
  513. },
  514. CPUBreakdown: &ClusterCostsBreakdown{
  515. System: 28.9,
  516. User: 34.0,
  517. },
  518. Start: time.Date(2020, 6, 16, 3, 45, 28, 0, time.UTC),
  519. End: time.Date(2020, 6, 16, 9, 10, 39, 0, time.UTC),
  520. Minutes: 5*60 + 25 + (11.0 / 60.0),
  521. Preemptible: false,
  522. Labels: map[string]string{
  523. "labelname2_A": "labelvalue2_A",
  524. "labelname2_B": "labelvalue2_B",
  525. },
  526. },
  527. },
  528. },
  529. {
  530. name: "e2-micro cpu cost adjustment",
  531. cpuCostMap: map[NodeIdentifier]float64{
  532. NodeIdentifier{
  533. Cluster: "cluster1",
  534. Name: "node1",
  535. ProviderID: "prov_node1",
  536. }: 0.048,
  537. },
  538. cpuCoresMap: map[nodeIdentifierNoProviderID]float64{
  539. nodeIdentifierNoProviderID{
  540. Cluster: "cluster1",
  541. Name: "node1",
  542. }: 6.0, // GKE lies about number of cores
  543. },
  544. clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
  545. nodeIdentifierNoProviderID{
  546. Cluster: "cluster1",
  547. Name: "node1",
  548. }: "e2-micro", // for this node type
  549. },
  550. expected: map[NodeIdentifier]*Node{
  551. NodeIdentifier{
  552. Cluster: "cluster1",
  553. Name: "node1",
  554. ProviderID: "prov_node1",
  555. }: &Node{
  556. Cluster: "cluster1",
  557. Name: "node1",
  558. ProviderID: "prov_node1",
  559. NodeType: "e2-micro",
  560. CPUCost: 0.048 * (partialCPUMap["e2-micro"] / 6.0), // adjustmentFactor is (v / GKE cores)
  561. CPUCores: partialCPUMap["e2-micro"],
  562. CPUBreakdown: &ClusterCostsBreakdown{},
  563. RAMBreakdown: &ClusterCostsBreakdown{},
  564. },
  565. },
  566. },
  567. {
  568. name: "e2-small cpu cost adjustment",
  569. cpuCostMap: map[NodeIdentifier]float64{
  570. NodeIdentifier{
  571. Cluster: "cluster1",
  572. Name: "node1",
  573. ProviderID: "prov_node1",
  574. }: 0.048,
  575. },
  576. cpuCoresMap: map[nodeIdentifierNoProviderID]float64{
  577. nodeIdentifierNoProviderID{
  578. Cluster: "cluster1",
  579. Name: "node1",
  580. }: 6.0, // GKE lies about number of cores
  581. },
  582. clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
  583. nodeIdentifierNoProviderID{
  584. Cluster: "cluster1",
  585. Name: "node1",
  586. }: "e2-small", // for this node type
  587. },
  588. expected: map[NodeIdentifier]*Node{
  589. NodeIdentifier{
  590. Cluster: "cluster1",
  591. Name: "node1",
  592. ProviderID: "prov_node1",
  593. }: &Node{
  594. Cluster: "cluster1",
  595. Name: "node1",
  596. ProviderID: "prov_node1",
  597. NodeType: "e2-small",
  598. CPUCost: 0.048 * (partialCPUMap["e2-small"] / 6.0), // adjustmentFactor is (v / GKE cores)
  599. CPUCores: partialCPUMap["e2-small"],
  600. CPUBreakdown: &ClusterCostsBreakdown{},
  601. RAMBreakdown: &ClusterCostsBreakdown{},
  602. },
  603. },
  604. },
  605. {
  606. name: "e2-medium cpu cost adjustment",
  607. cpuCostMap: map[NodeIdentifier]float64{
  608. NodeIdentifier{
  609. Cluster: "cluster1",
  610. Name: "node1",
  611. ProviderID: "prov_node1",
  612. }: 0.048,
  613. },
  614. cpuCoresMap: map[nodeIdentifierNoProviderID]float64{
  615. nodeIdentifierNoProviderID{
  616. Cluster: "cluster1",
  617. Name: "node1",
  618. }: 6.0, // GKE lies about number of cores
  619. },
  620. clusterAndNameToType: map[nodeIdentifierNoProviderID]string{
  621. nodeIdentifierNoProviderID{
  622. Cluster: "cluster1",
  623. Name: "node1",
  624. }: "e2-medium", // for this node type
  625. },
  626. expected: map[NodeIdentifier]*Node{
  627. NodeIdentifier{
  628. Cluster: "cluster1",
  629. Name: "node1",
  630. ProviderID: "prov_node1",
  631. }: &Node{
  632. Cluster: "cluster1",
  633. Name: "node1",
  634. ProviderID: "prov_node1",
  635. NodeType: "e2-medium",
  636. CPUCost: 0.048 * (partialCPUMap["e2-medium"] / 6.0), // adjustmentFactor is (v / GKE cores)
  637. CPUCores: partialCPUMap["e2-medium"],
  638. CPUBreakdown: &ClusterCostsBreakdown{},
  639. RAMBreakdown: &ClusterCostsBreakdown{},
  640. },
  641. },
  642. },
  643. }
  644. for _, testCase := range cases {
  645. result := buildNodeMap(
  646. testCase.cpuCostMap, testCase.ramCostMap, testCase.gpuCostMap,
  647. testCase.cpuCoresMap, testCase.ramBytesMap, testCase.ramUserPctMap,
  648. testCase.ramSystemPctMap,
  649. testCase.cpuBreakdownMap,
  650. testCase.activeDataMap,
  651. testCase.preemptibleMap,
  652. testCase.labelsMap,
  653. testCase.clusterAndNameToType,
  654. )
  655. if !reflect.DeepEqual(result, testCase.expected) {
  656. t.Errorf("buildNodeMap case %s failed. Got %+v but expected %+v", testCase.name, result, testCase.expected)
  657. // Use spew because we have to follow pointers to figure out
  658. // what isn't matching up
  659. t.Logf("Got: %s", spew.Sdump(result))
  660. t.Logf("Expected: %s", spew.Sdump(testCase.expected))
  661. }
  662. }
  663. }