diff --git a/service/subscriptions/model.go b/service/subscriptions/model.go index 8bbff32..406fdeb 100644 --- a/service/subscriptions/model.go +++ b/service/subscriptions/model.go @@ -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 } diff --git a/service/subscriptions/service.go b/service/subscriptions/service.go index 98bce45..621207f 100644 --- a/service/subscriptions/service.go +++ b/service/subscriptions/service.go @@ -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} diff --git a/subscription_test.go b/subscription_test.go index 8f26f83..e0baa86 100644 --- a/subscription_test.go +++ b/subscription_test.go @@ -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} +}