2
0

ratecard_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package oracle
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "os"
  6. "strconv"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestRCSForKey(t *testing.T) {
  11. rcs, server := testSetupRateCardStore(t)
  12. defer server.Close()
  13. testCases := map[string]struct {
  14. cost string
  15. arm bool
  16. }{
  17. "VM.DenseIO.E4.Flex": {
  18. "0.014061",
  19. false,
  20. },
  21. "BM.GPU3.8": {
  22. "2.950000",
  23. false,
  24. },
  25. "Pod.Standard.A1.Flex": {
  26. "0.0115",
  27. true,
  28. },
  29. "VM.Standard.E4.Flex": {
  30. "0.014000",
  31. false,
  32. },
  33. "VM.Standard.E3.Flex": {
  34. "0.014000",
  35. false,
  36. },
  37. "unknown-shape": {
  38. "0.600000",
  39. false,
  40. },
  41. }
  42. for instanceType, testCase := range testCases {
  43. t.Run(instanceType, func(t *testing.T) {
  44. key := &oracleKey{
  45. instanceType: instanceType,
  46. labels: make(map[string]string),
  47. }
  48. if testCase.arm {
  49. key.labels["kubernetes.io/arch"] = "arm64"
  50. }
  51. node, _, err := rcs.ForKey(key, DefaultPricing{
  52. OCPU: "0.2",
  53. Memory: "0.1",
  54. GPU: "0.3",
  55. })
  56. assert.NoError(t, err)
  57. assertFloatStrings(t, testCase.cost, node.Cost, 0.001)
  58. })
  59. }
  60. }
  61. func TestRCSForPVK(t *testing.T) {
  62. rcs, server := testSetupRateCardStore(t)
  63. defer server.Close()
  64. var testCases = map[string]struct {
  65. cost string
  66. }{
  67. driverOCIBV: {
  68. "0.000034",
  69. },
  70. driverOCI: {
  71. "0.000034",
  72. },
  73. "unknown": {
  74. "0.25",
  75. },
  76. }
  77. for driver, testCase := range testCases {
  78. t.Run(driver, func(t *testing.T) {
  79. pvk := &oraclePVKey{
  80. driver: driver,
  81. }
  82. pv, err := rcs.ForPVK(pvk, DefaultPricing{
  83. Storage: "0.25",
  84. })
  85. assert.NoError(t, err)
  86. assertFloatStrings(t, testCase.cost, pv.Cost, 0.00001)
  87. })
  88. }
  89. }
  90. func TestRCSEgressForRegion(t *testing.T) {
  91. rcs, server := testSetupRateCardStore(t)
  92. defer server.Close()
  93. var testCases = map[string]struct {
  94. cost float64
  95. }{
  96. "ap-mumbai-1": {
  97. 0.025,
  98. },
  99. "sa-saopaulo-1": {
  100. 0.025,
  101. },
  102. "me-dubai-1": {
  103. 0.05,
  104. },
  105. "af-johannesburg-1": {
  106. 0.05,
  107. },
  108. "il-jerusalem-1": {
  109. 0.05,
  110. },
  111. "eu-madrid-1": {
  112. 0.0085,
  113. },
  114. "uk-cardiff-1": {
  115. 0.0085,
  116. },
  117. "mx-monterrey-1": {
  118. 0.0085,
  119. },
  120. "us-chicago-1": {
  121. 0.0085,
  122. },
  123. "ca-montreal-1": {
  124. 0.0085,
  125. },
  126. "unknown": {
  127. 0.000123,
  128. },
  129. }
  130. for region, testCase := range testCases {
  131. net, err := rcs.ForEgressRegion(region, DefaultPricing{
  132. Egress: "0.000123",
  133. })
  134. assert.NoError(t, err)
  135. assert.InDelta(t, float64(0), net.ZoneNetworkEgressCost, 0.1)
  136. assert.InDelta(t, testCase.cost, net.RegionNetworkEgressCost, 0.001)
  137. assert.InDelta(t, testCase.cost, net.InternetNetworkEgressCost, 0.001)
  138. }
  139. }
  140. func testSetupRateCardStore(t *testing.T) (*RateCardStore, *httptest.Server) {
  141. pricesUSDBytes, err := os.ReadFile("test/prices_usd.json")
  142. assert.NoError(t, err)
  143. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  144. w.WriteHeader(http.StatusOK)
  145. w.Write(pricesUSDBytes)
  146. }))
  147. rcs := NewRateCardStore(server.URL, currencyCodeUSD)
  148. store, err := rcs.Refresh()
  149. assert.NoError(t, err)
  150. assert.True(t, len(store) > 0)
  151. return rcs, server
  152. }
  153. func assertFloatStrings(t *testing.T, s1, s2 string, delta float64) {
  154. f1, err := strconv.ParseFloat(s1, 64)
  155. assert.NoError(t, err)
  156. f2, err := strconv.ParseFloat(s2, 64)
  157. assert.NoError(t, err)
  158. assert.InDelta(t, f1, f2, delta)
  159. }