Skip to content
20 changes: 20 additions & 0 deletions service/subscriptions/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,26 @@ type listSubscriptionResponse struct {
Subscriptions []*Subscription `json:"subscriptions"`
}

type ListSubscriptionRegionsResponse struct {
SubscriptionId *int `json:"subscriptionId,omitempty"`
Regions []*ActiveActiveRegion `json:"regions"`
}

// have to redeclare these here (copied from regions model) to avoid an import cycle
type ActiveActiveRegion struct {
RegionId *int `json:"regionId,omitempty"`
Region *string `json:"region,omitempty"`
DeploymentCIDR *string `json:"deploymentCIDR,omitempty"`
VpcId *string `json:"vpcId,omitempty"`
Databases []ActiveActiveDatabase `json:"databases,omitempty"`
}
type ActiveActiveDatabase struct {
DatabaseId *int `json:"databaseId,omitempty"`
DatabaseName *string `json:"databaseName,omitempty"`
ReadOperationsPerSecond *int `json:"readOperationsPerSecond,omitempty"`
WriteOperationsPerSecond *int `json:"writeOperationsPerSecond,omitempty"`
}

type NotFound struct {
ID int
}
Expand Down
11 changes: 11 additions & 0 deletions service/subscriptions/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,17 @@ func (a *API) DeleteActiveActiveVPCPeering(ctx context.Context, subscription int
return a.taskWaiter.Wait(ctx, *task.ID)
}

func (a *API) ListActiveActiveRegions(ctx context.Context, subscription int) ([]*ActiveActiveRegion, error) {
var response ListSubscriptionRegionsResponse
err := a.client.Get(ctx, "list regions", fmt.Sprintf("/subscriptions/%d/regions", subscription), &response)

if err != nil {
return nil, err
}

return response.Regions, nil
}

func wrap404Error(id int, err error) error {
if v, ok := err.(*internal.HTTPError); ok && v.StatusCode == http.StatusNotFound {
return &NotFound{ID: id}
Expand Down
92 changes: 92 additions & 0 deletions subscription_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -792,3 +792,95 @@ func TestSubscription_DeleteVPCPeering(t *testing.T) {
err = subject.Subscription.DeleteVPCPeering(context.TODO(), 2, 20)
require.NoError(t, err)
}

func TestSubscription_ListActiveActiveRegions(t *testing.T) {
s := httptest.NewServer(testServer("apiKey", "secret", getRequest(t, "/subscriptions/1986/regions",
`
{
"subscriptionId": 1986,
"regions": [
{
"regionId": 12,
"region": "us-east-1",
"deploymentCidr": "192.169.0.0/24",
"vpcId": "vpc-0e828cd5c0c580389",
"databases": [
{
"databaseId": 645,
"databaseName": "database-name",
"readOperationsPerSecond": 1000,
"writeOperationsPerSecond": 1000,
"respVersion": "resp3",
"links": []
}
],
"links": []
},
{
"regionId": 19,
"region": "us-east-2",
"deploymentCidr": "11.0.1.0/24",
"vpcId": "vpc-0aecab539b31057a5",
"databases": [
{
"databaseId": 645,
"databaseName": "database-name",
"readOperationsPerSecond": 1000,
"writeOperationsPerSecond": 1000,
"respVersion": "resp3",
"links": []
}
],
"links": []
}
],
"links": [
{
"href": "https://api-staging.qa.redislabs.com/v1/subscriptions/118802/regions",
"type": "GET",
"rel": "self"
}
]
}
`)))

subject, err := clientFromTestServer(s, "apiKey", "secret")
require.NoError(t, err)

actual, err := subject.Subscription.ListActiveActiveRegions(context.TODO(), 1986)
require.NoError(t, err)

var expected = listRegionsExpected()
assert.Equal(t, expected, actual)

}

func listRegionsExpected() []*subscriptions.ActiveActiveRegion {

// Initialize databases
database := subscriptions.ActiveActiveDatabase{
DatabaseId: redis.Int(645),
DatabaseName: redis.String("database-name"),
ReadOperationsPerSecond: redis.Int(1000),
WriteOperationsPerSecond: redis.Int(1000),
}

// Initialize regions
region1Struct := &subscriptions.ActiveActiveRegion{
RegionId: redis.Int(12),
Region: redis.String("us-east-1"),
DeploymentCIDR: redis.String("192.169.0.0/24"),
VpcId: redis.String("vpc-0e828cd5c0c580389"),
Databases: []subscriptions.ActiveActiveDatabase{database},
}

region2Struct := &subscriptions.ActiveActiveRegion{
RegionId: redis.Int(19),
Region: redis.String("us-east-2"),
DeploymentCIDR: redis.String("11.0.1.0/24"),
VpcId: redis.String("vpc-0aecab539b31057a5"),
Databases: []subscriptions.ActiveActiveDatabase{database},
}

return []*subscriptions.ActiveActiveRegion{region1Struct, region2Struct}
}