Skip to content

Commit 8429833

Browse files
authored
Pricing endpoint implemented (#146)
* Added pricing
1 parent bbf2806 commit 8429833

File tree

4 files changed

+138
-0
lines changed

4 files changed

+138
-0
lines changed

client.go

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
"regexp"
1111
"strings"
1212

13+
"github.com/RedisLabs/rediscloud-go-api/service/pricing"
14+
1315
"github.com/RedisLabs/rediscloud-go-api/service/access_control_lists/redis_rules"
1416
"github.com/RedisLabs/rediscloud-go-api/service/access_control_lists/roles"
1517
"github.com/RedisLabs/rediscloud-go-api/service/access_control_lists/users"
@@ -32,6 +34,7 @@ type Client struct {
3234
Regions *regions.API
3335
LatestBackup *latest_backups.API
3436
LatestImport *latest_imports.API
37+
Pricing *pricing.API
3538
// acl
3639
RedisRules *redis_rules.API
3740
Roles *roles.API
@@ -71,6 +74,7 @@ func NewClient(configs ...Option) (*Client, error) {
7174
Regions: regions.NewAPI(client, t, config.logger),
7275
LatestBackup: latest_backups.NewAPI(client, t, config.logger),
7376
LatestImport: latest_imports.NewAPI(client, t, config.logger),
77+
Pricing: pricing.NewAPI(client),
7478
// acl
7579
RedisRules: redis_rules.NewAPI(client, t, config.logger),
7680
Roles: roles.NewAPI(client, t, config.logger),

pricing_test.go

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package rediscloud_api
2+
3+
import (
4+
"context"
5+
"net/http/httptest"
6+
"testing"
7+
8+
"github.com/RedisLabs/rediscloud-go-api/redis"
9+
"github.com/RedisLabs/rediscloud-go-api/service/pricing"
10+
"github.com/stretchr/testify/assert"
11+
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
func TestGet(t *testing.T) {
16+
server := httptest.NewServer(
17+
testServer(
18+
"key",
19+
"secret",
20+
getRequest(
21+
t,
22+
"/subscriptions/20000/pricing",
23+
`{
24+
"pricing": [
25+
{
26+
"type": "Shards",
27+
"typeDetails": "micro",
28+
"quantity": 1,
29+
"quantityMeasurement": "shards",
30+
"pricePerUnit": 0.027,
31+
"priceCurrency": "USD",
32+
"pricePeriod": "hour"
33+
}
34+
],
35+
"links": [
36+
{
37+
"rel": "self",
38+
"href": "https://api-staging.qa.redislabs.com/v1/subscriptions/110777/pricing",
39+
"type": "GET"
40+
}
41+
]
42+
}`,
43+
),
44+
))
45+
46+
subject, err := clientFromTestServer(server, "key", "secret")
47+
require.NoError(t, err)
48+
49+
actual, err := subject.Pricing.List(context.TODO(), 20000)
50+
require.NoError(t, err)
51+
52+
assert.Equal(t, []*pricing.Pricing{
53+
{
54+
Type: redis.String("Shards"),
55+
TypeDetails: redis.String("micro"),
56+
Quantity: redis.Int(1),
57+
QuantityMeasurement: redis.String("shards"),
58+
PricePerUnit: redis.Float64(0.027),
59+
PriceCurrency: redis.String("USD"),
60+
PricePeriod: redis.String("hour"),
61+
},
62+
}, actual)
63+
}

service/pricing/model.go

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package pricing
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/RedisLabs/rediscloud-go-api/internal"
7+
)
8+
9+
type ListPricingResponse struct {
10+
Pricing []*Pricing `json:"pricing,omitempty"`
11+
}
12+
13+
func (o ListPricingResponse) String() string {
14+
return internal.ToString(o)
15+
}
16+
17+
type Pricing struct {
18+
DatabaseName *string `json:"databaseName,omitempty"`
19+
Type *string `json:"type,omitempty"`
20+
TypeDetails *string `json:"typeDetails,omitempty"`
21+
Quantity *int `json:"quantity,omitempty"`
22+
QuantityMeasurement *string `json:"quantityMeasurement,omitempty"`
23+
PricePerUnit *float64 `json:"pricePerUnit,omitempty"`
24+
PriceCurrency *string `json:"priceCurrency,omitempty"`
25+
PricePeriod *string `json:"pricePeriod,omitempty"`
26+
Region *string `json:"region,omitempty"`
27+
}
28+
29+
func (o Pricing) String() string {
30+
return internal.ToString(o)
31+
}
32+
33+
type NotFound struct {
34+
subId int
35+
}
36+
37+
func (f *NotFound) Error() string {
38+
return fmt.Sprintf("subscription %d not found", f.subId)
39+
}

service/pricing/service.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package pricing
2+
3+
import (
4+
"context"
5+
"fmt"
6+
)
7+
8+
type HttpClient interface {
9+
Get(ctx context.Context, name, path string, responseBody interface{}) error
10+
}
11+
12+
type API struct {
13+
client HttpClient
14+
}
15+
16+
func NewAPI(client HttpClient) *API {
17+
return &API{client: client}
18+
}
19+
20+
// List will return the list of available pricing detail blocks for the provided subscription.
21+
func (a *API) List(ctx context.Context, subscription int) ([]*Pricing, error) {
22+
var body ListPricingResponse
23+
24+
message := fmt.Sprintf("get pricing information for subscription %d", subscription)
25+
address := fmt.Sprintf("/subscriptions/%d/pricing", subscription)
26+
27+
if err := a.client.Get(ctx, message, address, &body); err != nil {
28+
return nil, err
29+
}
30+
31+
return body.Pricing, nil
32+
}

0 commit comments

Comments
 (0)