Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@
All notable changes to this project will be documented in this file.
See updating [Changelog example here](https://keepachangelog.com/en/1.0.0/).

## 0.33.0

### Added:
* Adding Upgrade Redis database endpoint
* Adding Get Redis versions for subscription endpoint

## 0.32.0

### Added

* Adding redisVersion support on the create, get and list endpoints for pro databases.

## 0.31.0

### Added
Expand Down
254 changes: 109 additions & 145 deletions database_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package rediscloud_api
import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"time"
Expand Down Expand Up @@ -339,67 +340,51 @@ func TestDatabase_Get_wraps404Error(t *testing.T) {
}

func TestDatabase_Update(t *testing.T) {
s := httptest.NewServer(testServer("key", "secret", putRequest(t, "/subscriptions/42/databases/18", `{
"dryRun": false,
"name": "example",
"datasetSizeInGb": 1,
"supportOSSClusterApi": false,
"respVersion": "resp3",
"useExternalEndpointForOSSClusterApi": false,
"dataEvictionPolicy": "allkeys-lru",
"replication": true,
"throughputMeasurement": {
"by": "operations-per-second",
"value": 1000
},
"regexRules": [".*"],
"dataPersistence": "none",
"replicaOf": [
"another"
],
"periodicBackupPath": "s3://bucket-name",
"sourceIp": [
"10.0.0.1"
],
"clientSslCertificate": "something",
"clientTlsCertificates": ["something", "new"],
"enableTls": false,
"password": "fooBar",
"alerts": [
{
"name": "dataset-size",
"value": 80
}
],
"enableDefaultUser": false,
"queryPerformanceFactor": "2x"
}`, `{
"taskId": "task",
"commandType": "databaseUpdateRequest",
"status": "received",
"description": "Task request received and is being queued for processing.",
"timestamp": "2020-11-02T09:05:34.3Z",
"_links": {
"task": {
"href": "https://example.org",
"title": "getTaskStatusUpdates",
"type": "GET"
}
}
}`), getRequest(t, "/tasks/task", `{
"taskId": "task",
"commandType": "databaseUpdateRequest",
"status": "processing-completed",
"timestamp": "2020-10-28T09:58:16.798Z",
"response": {
},
"_links": {
"self": {
"href": "https://example.com",
"type": "GET"
}
}
}`)))
flow := taskFlow(
t,
http.MethodPut,
"/subscriptions/42/databases/18",
`{
"dryRun": false,
"name": "example",
"datasetSizeInGb": 1,
"supportOSSClusterApi": false,
"respVersion": "resp3",
"useExternalEndpointForOSSClusterApi": false,
"dataEvictionPolicy": "allkeys-lru",
"replication": true,
"throughputMeasurement": {
"by": "operations-per-second",
"value": 1000
},
"regexRules": [".*"],
"dataPersistence": "none",
"replicaOf": [
"another"
],
"periodicBackupPath": "s3://bucket-name",
"sourceIp": [
"10.0.0.1"
],
"clientSslCertificate": "something",
"clientTlsCertificates": ["something", "new"],
"enableTls": false,
"password": "fooBar",
"alerts": [
{
"name": "dataset-size",
"value": 80
}
],
"enableDefaultUser": false,
"queryPerformanceFactor": "2x"
}`,
"task",
"databaseUpdateRequest",
)

s := httptest.NewServer(testServer("key", "secret", flow...))
defer s.Close()

subject, err := clientFromTestServer(s, "key", "secret")
require.NoError(t, err)
Expand Down Expand Up @@ -439,33 +424,17 @@ func TestDatabase_Update(t *testing.T) {
}

func TestDatabase_Delete(t *testing.T) {
s := httptest.NewServer(testServer("key", "secret", deleteRequest(t, "/subscriptions/42/databases/4291", `{
"taskId": "task",
"commandType": "databaseDeleteRequest",
"status": "received",
"description": "Task request received and is being queued for processing.",
"timestamp": "2020-11-02T09:05:34.3Z",
"_links": {
"task": {
"href": "https://example.org",
"title": "getTaskStatusUpdates",
"type": "GET"
}
}
}`), getRequest(t, "/tasks/task", `{
"taskId": "e02b40d6-1395-4861-a3b9-ecf829d835fd",
"commandType": "databaseDeleteRequest",
"status": "processing-completed",
"timestamp": "2020-10-28T09:58:16.798Z",
"response": {
},
"_links": {
"self": {
"href": "https://example.com",
"type": "GET"
}
}
}`)))
flow := taskFlow(
t,
http.MethodDelete,
"/subscriptions/42/databases/4291",
"",
"task",
"databaseDeleteRequest",
)

s := httptest.NewServer(testServer("key", "secret", flow...))
defer s.Close()

subject, err := clientFromTestServer(s, "key", "secret")
require.NoError(t, err)
Expand All @@ -475,33 +444,17 @@ func TestDatabase_Delete(t *testing.T) {
}

func TestDatabase_Backup(t *testing.T) {
s := httptest.NewServer(testServer("key", "secret", postRequestWithNoRequest(t, "/subscriptions/42/databases/18/backup", `{
"taskId": "task-uuid",
"commandType": "databaseBackupRequest",
"status": "received",
"description": "Task request received and is being queued for processing.",
"timestamp": "2020-11-02T09:05:34.3Z",
"_links": {
"task": {
"href": "https://example.org",
"title": "getTaskStatusUpdates",
"type": "GET"
}
}
}`), getRequest(t, "/tasks/task-uuid", `{
"taskId": "task-uuid",
"commandType": "databaseBackupRequest",
"status": "processing-completed",
"timestamp": "2020-10-28T09:58:16.798Z",
"response": {
},
"_links": {
"self": {
"href": "https://example.com",
"type": "GET"
}
}
}`)))
flow := taskFlow(
t,
http.MethodPost,
"/subscriptions/42/databases/18/backup",
"",
"task-uuid",
"databaseBackupRequest",
)

s := httptest.NewServer(testServer("key", "secret", flow...))
defer s.Close()

subject, err := clientFromTestServer(s, "key", "secret")
require.NoError(t, err)
Expand All @@ -511,36 +464,20 @@ func TestDatabase_Backup(t *testing.T) {
}

func TestDatabase_Import(t *testing.T) {
s := httptest.NewServer(testServer("key", "secret", postRequest(t, "/subscriptions/42/databases/81/import", `{
"sourceType": "magic",
"importFromUri": ["tinkerbell"]
}`, `{
"taskId": "task-uuid",
"commandType": "databaseImportRequest",
"status": "received",
"description": "Task request received and is being queued for processing.",
"timestamp": "2020-11-02T09:05:34.3Z",
"_links": {
"task": {
"href": "https://example.org",
"title": "getTaskStatusUpdates",
"type": "GET"
}
}
}`), getRequest(t, "/tasks/task-uuid", `{
"taskId": "task-uuid",
"commandType": "databaseImportRequest",
"status": "processing-completed",
"timestamp": "2020-10-28T09:58:16.798Z",
"response": {
},
"_links": {
"self": {
"href": "https://example.com",
"type": "GET"
}
}
}`)))
flow := taskFlow(
t,
http.MethodPost,
"/subscriptions/42/databases/81/import",
`{
"sourceType": "magic",
"importFromUri": ["tinkerbell"]
}`,
"task-uuid",
"databaseImportRequest",
)

s := httptest.NewServer(testServer("key", "secret", flow...))
defer s.Close()

subject, err := clientFromTestServer(s, "key", "secret")
require.NoError(t, err)
Expand All @@ -567,3 +504,30 @@ func TestDatabase_Certificate(t *testing.T) {
}, certificate)

}

func TestDatabase_UpgradeRedisVersion(t *testing.T) {
flow := taskFlow(
t,
http.MethodPost,
"/subscriptions/42/databases/18/upgrade",
`{ "targetRedisVersion": "7.2" }`,
"upgrade-task-id",
"databaseUpgradeRequest",
)

s := httptest.NewServer(testServer("key", "secret", flow...))
defer s.Close()

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

err = subject.Database.UpgradeRedisVersion(
context.TODO(),
42,
18,
databases.UpgradeRedisVersion{
TargetRedisVersion: redis.String("7.2"),
},
)
require.NoError(t, err)
}
8 changes: 8 additions & 0 deletions service/databases/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,14 @@ type Import struct {
ImportFromURI []*string `json:"importFromUri,omitempty"`
}

type UpgradeRedisVersion struct {
TargetRedisVersion *string `json:"targetRedisVersion,omitempty"`
}

func (o UpgradeRedisVersion) String() string {
return internal.ToString(o)
}

func (o Import) String() string {
return internal.ToString(o)
}
Expand Down
13 changes: 13 additions & 0 deletions service/databases/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,19 @@ func (a *API) Update(ctx context.Context, subscription int, database int, update
return a.taskWaiter.Wait(ctx, *task.ID)
}

// UpgradeRedisVersion will upgrade the Redis version of an existing database.
func (a *API) UpgradeRedisVersion(ctx context.Context, subscription int, database int, upgradeVersion UpgradeRedisVersion) error {
var task internal.TaskResponse
err := a.client.Post(ctx, fmt.Sprintf("upgrade database %d version for subscription %d", database, subscription), fmt.Sprintf("/subscriptions/%d/databases/%d/upgrade", subscription, database), upgradeVersion, &task)
if err != nil {
return err
}

a.logger.Printf("Waiting for database %d for subscription %d to finish being upgraded", database, subscription)

return a.taskWaiter.Wait(ctx, *task.ID)
}

// Delete will destroy an existing database.
func (a *API) Delete(ctx context.Context, subscription int, database int) error {
var task internal.TaskResponse
Expand Down
11 changes: 11 additions & 0 deletions service/subscriptions/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,17 @@ type ActiveActiveDatabase struct {
WriteOperationsPerSecond *int `json:"writeOperationsPerSecond,omitempty"`
}

type RedisVersion struct {
Version *string `json:"version,omitempty"`
EolDate *string `json:"eolDate,omitempty"`
IsPreview *bool `json:"isPreview,omitempty"`
IsDefault *bool `json:"isDefault,omitempty"`
}

type RedisVersions struct {
RedisVersions []*RedisVersion `json:"redisVersions,omitempty"`
}

type NotFound struct {
ID int
}
Expand Down
19 changes: 19 additions & 0 deletions service/subscriptions/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,25 @@ func (a *API) ListActiveActiveRegions(ctx context.Context, subscription int) ([]
return response.Regions, nil
}

// GetRedisVersions retrieves the Redis database versions available for this subscription.
func (a *API) GetRedisVersions(ctx context.Context, subscription int) (*RedisVersions, error) {
var redisVersions RedisVersions
getRedisVersionsUrl := "/subscriptions/redis-versions?subscriptionId=%d"

path := fmt.Sprintf(getRedisVersionsUrl, subscription)
err := a.client.Get(
ctx,
fmt.Sprintf("get versions for subscription %d", subscription),
path,
&redisVersions,
)

if err != nil {
return nil, wrap404Error(subscription, err)
}
return &redisVersions, 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
Loading
Loading