| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- package oracle
- import (
- "net/http"
- "net/http/httptest"
- "os"
- "strconv"
- "testing"
- "github.com/stretchr/testify/assert"
- )
- func TestRCSForKey(t *testing.T) {
- rcs, server := testSetupRateCardStore(t)
- defer server.Close()
- testCases := map[string]struct {
- cost string
- arm bool
- }{
- "VM.DenseIO.E4.Flex": {
- "0.014061",
- false,
- },
- "BM.GPU3.8": {
- "2.950000",
- false,
- },
- "Pod.Standard.A1.Flex": {
- "0.0115",
- true,
- },
- "VM.Standard.E4.Flex": {
- "0.014000",
- false,
- },
- "VM.Standard.E3.Flex": {
- "0.014000",
- false,
- },
- "unknown-shape": {
- "0.600000",
- false,
- },
- }
- for instanceType, testCase := range testCases {
- t.Run(instanceType, func(t *testing.T) {
- key := &oracleKey{
- instanceType: instanceType,
- labels: make(map[string]string),
- }
- if testCase.arm {
- key.labels["kubernetes.io/arch"] = "arm64"
- }
- node, _, err := rcs.ForKey(key, DefaultPricing{
- OCPU: "0.2",
- Memory: "0.1",
- GPU: "0.3",
- })
- assert.NoError(t, err)
- assertFloatStrings(t, testCase.cost, node.Cost, 0.001)
- })
- }
- }
- func TestRCSForPVK(t *testing.T) {
- rcs, server := testSetupRateCardStore(t)
- defer server.Close()
- var testCases = map[string]struct {
- cost string
- }{
- driverOCIBV: {
- "0.000034",
- },
- driverOCI: {
- "0.000034",
- },
- "unknown": {
- "0.25",
- },
- }
- for driver, testCase := range testCases {
- t.Run(driver, func(t *testing.T) {
- pvk := &oraclePVKey{
- driver: driver,
- }
- pv, err := rcs.ForPVK(pvk, DefaultPricing{
- Storage: "0.25",
- })
- assert.NoError(t, err)
- assertFloatStrings(t, testCase.cost, pv.Cost, 0.00001)
- })
- }
- }
- func TestRCSEgressForRegion(t *testing.T) {
- rcs, server := testSetupRateCardStore(t)
- defer server.Close()
- var testCases = map[string]struct {
- cost float64
- }{
- "ap-mumbai-1": {
- 0.025,
- },
- "sa-saopaulo-1": {
- 0.025,
- },
- "me-dubai-1": {
- 0.05,
- },
- "af-johannesburg-1": {
- 0.05,
- },
- "il-jerusalem-1": {
- 0.05,
- },
- "eu-madrid-1": {
- 0.0085,
- },
- "uk-cardiff-1": {
- 0.0085,
- },
- "mx-monterrey-1": {
- 0.0085,
- },
- "us-chicago-1": {
- 0.0085,
- },
- "ca-montreal-1": {
- 0.0085,
- },
- "unknown": {
- 0.000123,
- },
- }
- for region, testCase := range testCases {
- net, err := rcs.ForEgressRegion(region, DefaultPricing{
- Egress: "0.000123",
- })
- assert.NoError(t, err)
- assert.InDelta(t, float64(0), net.ZoneNetworkEgressCost, 0.1)
- assert.InDelta(t, testCase.cost, net.RegionNetworkEgressCost, 0.001)
- assert.InDelta(t, testCase.cost, net.InternetNetworkEgressCost, 0.001)
- }
- }
- func testSetupRateCardStore(t *testing.T) (*RateCardStore, *httptest.Server) {
- pricesUSDBytes, err := os.ReadFile("test/prices_usd.json")
- assert.NoError(t, err)
- server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(http.StatusOK)
- w.Write(pricesUSDBytes)
- }))
- rcs := NewRateCardStore(server.URL, currencyCodeUSD)
- store, err := rcs.Refresh()
- assert.NoError(t, err)
- assert.True(t, len(store) > 0)
- return rcs, server
- }
- func assertFloatStrings(t *testing.T, s1, s2 string, delta float64) {
- f1, err := strconv.ParseFloat(s1, 64)
- assert.NoError(t, err)
- f2, err := strconv.ParseFloat(s2, 64)
- assert.NoError(t, err)
- assert.InDelta(t, f1, f2, delta)
- }
|