diff --git a/.gitignore b/.gitignore index 0ebe916..4d46b00 100644 --- a/.gitignore +++ b/.gitignore @@ -278,3 +278,5 @@ CLAUDE.md coverage.out swagger-redis-api.json + +.vscode \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bc6a0e..3955f53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ 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.42.0 (10th November 2025) + +### Added: + +* Added `ID` field to `Region` struct in account model +* Added Redis version support for Essentials databases: `RedisVersion` field and `UpgradeRedisVersion()` method + ## 0.41.0 (3rd November 2025) ### Added: diff --git a/account_test.go b/account_test.go index dba4eff..0c1c187 100644 --- a/account_test.go +++ b/account_test.go @@ -68,10 +68,12 @@ func TestAccount_ListRegions(t *testing.T) { s := httptest.NewServer(testServer("apiKey", "secret", getRequest(t, "/regions", `{ "regions": [ { + "id": 1, "name": "asia-east1", "provider": "GCP" }, { + "id": 2, "name": "eu-west-1", "provider": "AWS" } @@ -92,10 +94,12 @@ func TestAccount_ListRegions(t *testing.T) { assert.ElementsMatch(t, []*account.Region{ { + ID: redis.Int(1), Name: redis.String("asia-east1"), Provider: redis.String("GCP"), }, { + ID: redis.Int(2), Name: redis.String("eu-west-1"), Provider: redis.String("AWS"), }, diff --git a/fixed_database_test.go b/fixed_database_test.go index 1597aaf..6447ec6 100644 --- a/fixed_database_test.go +++ b/fixed_database_test.go @@ -24,6 +24,7 @@ func TestFixedDatabase_Create(t *testing.T) { `{ "name": "my-test-fixed-database", "protocol": "memcached", + "redisVersion": "7.4", "respVersion": "resp2", "dataPersistence": "none", "dataEvictionPolicy": "noeviction", @@ -84,6 +85,7 @@ func TestFixedDatabase_Create(t *testing.T) { fixedDatabases.CreateFixedDatabase{ Name: redis.String("my-test-fixed-database"), Protocol: redis.String("memcached"), + RedisVersion: redis.String("7.4"), RespVersion: redis.String("resp2"), DataPersistence: redis.String("none"), DataEvictionPolicy: redis.String("noeviction"), @@ -124,6 +126,7 @@ func TestFixedDatabase_List(t *testing.T) { "protocol": "memcached", "provider": "AWS", "region": "us-west-1", + "redisVersion": "7.4", "respVersion": "resp2", "status": "draft", "planMemoryLimit": 1, @@ -228,6 +231,7 @@ func TestFixedDatabase_List(t *testing.T) { Protocol: redis.String("memcached"), Provider: redis.String("AWS"), Region: redis.String("us-west-1"), + RedisVersion: redis.String("7.4"), RespVersion: redis.String("resp2"), Status: redis.String("draft"), PlanMemoryLimit: redis.Float64(1), @@ -286,6 +290,7 @@ func TestFixedDatabase_Get(t *testing.T) { "protocol": "memcached", "provider": "AWS", "region": "us-west-1", + "redisVersion": "7.4", "respVersion": "resp2", "status": "draft", "planMemoryLimit": 1, @@ -354,6 +359,7 @@ func TestFixedDatabase_Get(t *testing.T) { Protocol: redis.String("memcached"), Provider: redis.String("AWS"), Region: redis.String("us-west-1"), + RedisVersion: redis.String("7.4"), RespVersion: redis.String("resp2"), Status: redis.String("draft"), PlanMemoryLimit: redis.Float64(1), @@ -546,3 +552,74 @@ func TestFixedDatabase_Delete(t *testing.T) { require.NoError(t, err) } + +func TestFixedDatabase_UpgradeRedisVersion(t *testing.T) { + server := httptest.NewServer( + testServer( + "apiKey", + "secret", + postRequest( + t, + "/fixed/subscriptions/111728/databases/51055029/upgrade", + `{ + "targetRedisVersion": "7.4" + }`, + `{ + "taskId": "a1b2c3d4-5678-90ab-cdef-1234567890ab", + "commandType": "fixedDatabaseUpgradeRedisVersionRequest", + "status": "received", + "description": "Task request received and is being queued for processing.", + "timestamp": "2024-05-10T14:14:14.736763484Z", + "links": [ + { + "rel": "task", + "type": "GET", + "href": "https://api-staging.qa.redislabs.com/v1/tasks/a1b2c3d4-5678-90ab-cdef-1234567890ab" + } + ] + }`, + ), + getRequest( + t, + "/tasks/a1b2c3d4-5678-90ab-cdef-1234567890ab", + `{ + "taskId": "a1b2c3d4-5678-90ab-cdef-1234567890ab", + "commandType": "fixedDatabaseUpgradeRedisVersionRequest", + "status": "processing-completed", + "description": "Request processing completed successfully and its resources are now being provisioned / de-provisioned.", + "timestamp": "2024-05-10T14:14:34.153537279Z", + "response": { + "resourceId": 51055029, + "additionalResourceId": 111728 + }, + "links": [ + { + "rel": "resource", + "type": "GET", + "href": "https://api-staging.qa.redislabs.com/v1/fixed/subscriptions/111728/databases/51055029" + }, + { + "rel": "self", + "type": "GET", + "href": "https://api-staging.qa.redislabs.com/v1/tasks/a1b2c3d4-5678-90ab-cdef-1234567890ab" + } + ] + }`, + ), + ), + ) + + subject, err := clientFromTestServer(server, "apiKey", "secret") + require.NoError(t, err) + + err = subject.FixedDatabases.UpgradeRedisVersion( + context.TODO(), + 111728, + 51055029, + fixedDatabases.UpgradeRedisVersion{ + TargetRedisVersion: redis.String("7.4"), + }, + ) + + require.NoError(t, err) +} diff --git a/service/account/model.go b/service/account/model.go index c20a12f..3bb5dfc 100644 --- a/service/account/model.go +++ b/service/account/model.go @@ -31,6 +31,7 @@ func (o regions) String() string { } type Region struct { + ID *int `json:"id,omitempty"` Name *string `json:"name,omitempty"` Provider *string `json:"provider,omitempty"` } diff --git a/service/fixed/databases/model.go b/service/fixed/databases/model.go index 510e80c..ff384b3 100644 --- a/service/fixed/databases/model.go +++ b/service/fixed/databases/model.go @@ -29,6 +29,7 @@ type CreateFixedDatabase struct { Password *string `json:"password,omitempty"` Alerts *[]*databases.Alert `json:"alerts,omitempty"` Modules *[]*databases.Module `json:"modules,omitempty"` + RedisVersion *string `json:"redisVersion,omitempty"` } type UpdateFixedDatabase struct { @@ -61,6 +62,7 @@ type FixedDatabase struct { Provider *string `json:"provider,omitempty"` Region *string `json:"region,omitempty"` RedisVersionCompliance *string `json:"redisVersionCompliance,omitempty"` + RedisVersion *string `json:"redisVersion,omitempty"` RespVersion *string `json:"respVersion,omitempty"` Status *string `json:"status,omitempty"` PlanMemoryLimit *float64 `json:"planMemoryLimit,omitempty"` @@ -160,6 +162,14 @@ func (o Import) String() string { return internal.ToString(o) } +type UpgradeRedisVersion struct { + TargetRedisVersion *string `json:"targetRedisVersion,omitempty"` +} + +func (o UpgradeRedisVersion) String() string { + return internal.ToString(o) +} + type listFixedDatabaseResponse struct { FixedSubscription *listDbSubscription `json:"subscription,omitempty"` } diff --git a/service/fixed/databases/service.go b/service/fixed/databases/service.go index 1c4ccaf..a53ddb6 100644 --- a/service/fixed/databases/service.go +++ b/service/fixed/databases/service.go @@ -85,6 +85,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 fixed 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 fixed database %d version for subscription %d", database, subscription), fmt.Sprintf("/fixed/subscriptions/%d/databases/%d/upgrade", subscription, database), upgradeVersion, &task) + if err != nil { + return err + } + + a.logger.Printf("Waiting for fixed database %d for subscription %d to finish being upgraded", database, subscription) + + return a.taskWaiter.Wait(ctx, *task.ID) +} + // Delete will destroy an existing fixed database. func (a *API) Delete(ctx context.Context, subscription int, database int) error { var task internal.TaskResponse