From 405f63a8abce62d8c86e53de576e4b61d71af2a0 Mon Sep 17 00:00:00 2001 From: Emilio Assuncao Date: Thu, 13 Jun 2024 13:18:32 -0500 Subject: [PATCH 1/3] Update hyperdrive config origin model to include new fields --- hyperdrive.go | 32 ++++++----- hyperdrive_test.go | 129 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 131 insertions(+), 30 deletions(-) diff --git a/hyperdrive.go b/hyperdrive.go index c1ddbc9a5f3..c7b39fb1c26 100644 --- a/hyperdrive.go +++ b/hyperdrive.go @@ -26,13 +26,21 @@ type HyperdriveConfig struct { Caching HyperdriveConfigCaching `json:"caching,omitempty"` } +type HyperdriveOriginType string + type HyperdriveConfigOrigin struct { - Database string `json:"database,omitempty"` + Database string `json:"database,omitempty"` + Host string `json:"host,omitempty"` + Port int `json:"port,omitempty"` + Scheme string `json:"scheme,omitempty"` + User string `json:"user,omitempty"` + AccessClientID string `json:"access_client_id,omitempty"` + AccessClientSecret string `json:"access_client_secret,omitempty"` +} + +type HyperdriveConfigOriginWithPassword struct { + HyperdriveConfigOrigin Password string `json:"password"` - Host string `json:"host,omitempty"` - Port int `json:"port,omitempty"` - Scheme string `json:"scheme,omitempty"` - User string `json:"user,omitempty"` } type HyperdriveConfigCaching struct { @@ -47,9 +55,9 @@ type HyperdriveConfigListResponse struct { } type CreateHyperdriveConfigParams struct { - Name string `json:"name"` - Origin HyperdriveConfigOrigin `json:"origin"` - Caching HyperdriveConfigCaching `json:"caching,omitempty"` + Name string `json:"name"` + Origin HyperdriveConfigOriginWithPassword `json:"origin"` + Caching HyperdriveConfigCaching `json:"caching,omitempty"` } type HyperdriveConfigResponse struct { @@ -58,10 +66,10 @@ type HyperdriveConfigResponse struct { } type UpdateHyperdriveConfigParams struct { - HyperdriveID string `json:"-"` - Name string `json:"name"` - Origin HyperdriveConfigOrigin `json:"origin"` - Caching HyperdriveConfigCaching `json:"caching,omitempty"` + HyperdriveID string `json:"-"` + Name string `json:"name"` + Origin HyperdriveConfigOriginWithPassword `json:"origin"` + Caching HyperdriveConfigCaching `json:"caching,omitempty"` } type ListHyperdriveConfigParams struct{} diff --git a/hyperdrive_test.go b/hyperdrive_test.go index c19378f1490..68ec614018c 100644 --- a/hyperdrive_test.go +++ b/hyperdrive_test.go @@ -12,9 +12,11 @@ import ( const ( testHyperdriveConfigId = "6b7efc370ea34ded8327fa20698dfe3a" testHyperdriveConfigName = "example-hyperdrive" + testAccessClientID = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a.access" + testAccessClientSecret = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a" ) -func testHyperdriveConfig() HyperdriveConfig { +func testHyperdriveHostAndPortConfig() HyperdriveConfig { return HyperdriveConfig{ ID: testHyperdriveConfigId, Name: testHyperdriveConfigName, @@ -33,6 +35,26 @@ func testHyperdriveConfig() HyperdriveConfig { } } +func testHyperdriveCFAccessConfig() HyperdriveConfig { + return HyperdriveConfig{ + ID: testHyperdriveConfigId, + Name: testHyperdriveConfigName, + Origin: HyperdriveConfigOrigin{ + Database: "postgres", + Host: "database.example.com", + Scheme: "postgres", + User: "postgres", + AccessClientID: testAccessClientID, + AccessClientSecret: testAccessClientSecret, + }, + Caching: HyperdriveConfigCaching{ + Disabled: BoolPtr(false), + MaxAge: 30, + StaleWhileRevalidate: 15, + }, + } +} + func TestHyperdriveConfig_List(t *testing.T) { setup() defer teardown() @@ -72,7 +94,7 @@ func TestHyperdriveConfig_List(t *testing.T) { result, err := client.ListHyperdriveConfigs(context.Background(), AccountIdentifier(testAccountID), ListHyperdriveConfigParams{}) if assert.NoError(t, err) { assert.Equal(t, 1, len(result)) - assert.Equal(t, testHyperdriveConfig(), result[0]) + assert.Equal(t, testHyperdriveHostAndPortConfig(), result[0]) } } @@ -119,11 +141,11 @@ func TestHyperdriveConfig_Get(t *testing.T) { result, err := client.GetHyperdriveConfig(context.Background(), AccountIdentifier(testAccountID), testHyperdriveConfigId) if assert.NoError(t, err) { - assert.Equal(t, testHyperdriveConfig(), result) + assert.Equal(t, testHyperdriveHostAndPortConfig(), result) } } -func TestHyperdriveConfig_Create(t *testing.T) { +func TestHyperdriveConfig_CreateHostAndPort(t *testing.T) { setup() defer teardown() @@ -166,13 +188,82 @@ func TestHyperdriveConfig_Create(t *testing.T) { result, err := client.CreateHyperdriveConfig(context.Background(), AccountIdentifier(testAccountID), CreateHyperdriveConfigParams{ Name: "example-hyperdrive", - Origin: HyperdriveConfigOrigin{ - Database: "postgres", + Origin: HyperdriveConfigOriginWithPassword{ + HyperdriveConfigOrigin: HyperdriveConfigOrigin{ + Database: "postgres", + Host: "database.example.com", + Port: 5432, + Scheme: "postgres", + User: "postgres", + }, + Password: "password", + }, + Caching: HyperdriveConfigCaching{ + Disabled: BoolPtr(false), + MaxAge: 30, + StaleWhileRevalidate: 15, + }, + }) + + if assert.NoError(t, err) { + assert.Equal(t, testHyperdriveHostAndPortConfig(), result) + } +} + +func TestHyperdriveConfig_CreateCFAccess(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc(fmt.Sprintf("/accounts/%s/hyperdrive/configs", testAccountID), func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method) + + w.Header().Set("content-type", "application/json") + fmt.Fprintf(w, `{ + "success": true, + "errors": [], + "messages": [], + "result": { + "id": "6b7efc370ea34ded8327fa20698dfe3a", + "caching": { + "disabled": false, + "max_age": 30, + "stale_while_revalidate": 15 + }, + "name": "example-hyperdrive", + "origin": { + "database": "postgres", + "host": "database.example.com", + "scheme": "postgres", + "user": "postgres", + "access_client_id": "a539ed18b8871f690c99d428f11fb785.access", + "access_client_secret": "732c2bbf71917e027c075212a72e07800e6989cc32223e4834999e12bda9703e" + } + } + }`) + }) + + _, err := client.CreateHyperdriveConfig(context.Background(), AccountIdentifier(""), CreateHyperdriveConfigParams{}) + if assert.Error(t, err) { + assert.Equal(t, ErrMissingAccountID, err) + } + + _, err = client.CreateHyperdriveConfig(context.Background(), AccountIdentifier(testAccountID), CreateHyperdriveConfigParams{}) + if assert.Error(t, err) { + assert.Equal(t, ErrMissingHyperdriveConfigName, err) + } + + result, err := client.CreateHyperdriveConfig(context.Background(), AccountIdentifier(testAccountID), CreateHyperdriveConfigParams{ + Name: "example-hyperdrive", + Origin: HyperdriveConfigOriginWithPassword{ + HyperdriveConfigOrigin: HyperdriveConfigOrigin{ + Database: "postgres", + Host: "database.example.com", + Scheme: "postgres", + User: "postgres", + AccessClientID: testAccessClientID, + AccessClientSecret: testAccessClientSecret, + }, Password: "password", - Host: "database.example.com", - Port: 5432, - Scheme: "postgres", - User: "postgres", }, Caching: HyperdriveConfigCaching{ Disabled: BoolPtr(false), @@ -182,7 +273,7 @@ func TestHyperdriveConfig_Create(t *testing.T) { }) if assert.NoError(t, err) { - assert.Equal(t, testHyperdriveConfig(), result) + assert.Equal(t, testHyperdriveCFAccessConfig(), result) } } @@ -259,13 +350,15 @@ func TestHyperdriveConfig_Update(t *testing.T) { result, err := client.UpdateHyperdriveConfig(context.Background(), AccountIdentifier(testAccountID), UpdateHyperdriveConfigParams{ HyperdriveID: "6b7efc370ea34ded8327fa20698dfe3a", Name: "example-hyperdrive", - Origin: HyperdriveConfigOrigin{ - Database: "postgres", + Origin: HyperdriveConfigOriginWithPassword{ + HyperdriveConfigOrigin: HyperdriveConfigOrigin{ + Database: "postgres", + Host: "database.example.com", + Port: 5432, + Scheme: "postgres", + User: "postgres", + }, Password: "password", - Host: "database.example.com", - Port: 5432, - Scheme: "postgres", - User: "postgres", }, Caching: HyperdriveConfigCaching{ Disabled: BoolPtr(false), @@ -275,6 +368,6 @@ func TestHyperdriveConfig_Update(t *testing.T) { }) if assert.NoError(t, err) { - assert.Equal(t, testHyperdriveConfig(), result) + assert.Equal(t, testHyperdriveHostAndPortConfig(), result) } } From 7c658987b70229a69fb9cd5935f18d4b47c60d9a Mon Sep 17 00:00:00 2001 From: Emilio Assuncao Date: Tue, 9 Jul 2024 16:37:56 -0500 Subject: [PATCH 2/3] Add changelog and fix test --- .changelog/2729.txt | 3 +++ hyperdrive_test.go | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 .changelog/2729.txt diff --git a/.changelog/2729.txt b/.changelog/2729.txt new file mode 100644 index 00000000000..f309e18244e --- /dev/null +++ b/.changelog/2729.txt @@ -0,0 +1,3 @@ +```release-notes:enhancement +hyperdrive: Add support for Hyperdrive Over Access attributes +``` \ No newline at end of file diff --git a/hyperdrive_test.go b/hyperdrive_test.go index 68ec614018c..6606839bf04 100644 --- a/hyperdrive_test.go +++ b/hyperdrive_test.go @@ -235,8 +235,8 @@ func TestHyperdriveConfig_CreateCFAccess(t *testing.T) { "host": "database.example.com", "scheme": "postgres", "user": "postgres", - "access_client_id": "a539ed18b8871f690c99d428f11fb785.access", - "access_client_secret": "732c2bbf71917e027c075212a72e07800e6989cc32223e4834999e12bda9703e" + "access_client_id": "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a.access", + "access_client_secret": "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a" } } }`) From 2eabbac35925e84c322e6950891565c7d08aa329 Mon Sep 17 00:00:00 2001 From: Emilio Assuncao Date: Thu, 11 Jul 2024 13:18:07 -0500 Subject: [PATCH 3/3] PR Feedback --- hyperdrive.go | 32 ++++++++++++++++---------------- hyperdrive_test.go | 39 +++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/hyperdrive.go b/hyperdrive.go index c7b39fb1c26..bd1912efa42 100644 --- a/hyperdrive.go +++ b/hyperdrive.go @@ -29,18 +29,18 @@ type HyperdriveConfig struct { type HyperdriveOriginType string type HyperdriveConfigOrigin struct { - Database string `json:"database,omitempty"` - Host string `json:"host,omitempty"` - Port int `json:"port,omitempty"` - Scheme string `json:"scheme,omitempty"` - User string `json:"user,omitempty"` - AccessClientID string `json:"access_client_id,omitempty"` - AccessClientSecret string `json:"access_client_secret,omitempty"` + Database string `json:"database,omitempty"` + Host string `json:"host,omitempty"` + Port int `json:"port,omitempty"` + Scheme string `json:"scheme,omitempty"` + User string `json:"user,omitempty"` + AccessClientID string `json:"access_client_id,omitempty"` } -type HyperdriveConfigOriginWithPassword struct { +type HyperdriveConfigOriginWithSecrets struct { HyperdriveConfigOrigin - Password string `json:"password"` + Password string `json:"password"` + AccessClientSecret string `json:"access_client_secret,omitempty"` } type HyperdriveConfigCaching struct { @@ -55,9 +55,9 @@ type HyperdriveConfigListResponse struct { } type CreateHyperdriveConfigParams struct { - Name string `json:"name"` - Origin HyperdriveConfigOriginWithPassword `json:"origin"` - Caching HyperdriveConfigCaching `json:"caching,omitempty"` + Name string `json:"name"` + Origin HyperdriveConfigOriginWithSecrets `json:"origin"` + Caching HyperdriveConfigCaching `json:"caching,omitempty"` } type HyperdriveConfigResponse struct { @@ -66,10 +66,10 @@ type HyperdriveConfigResponse struct { } type UpdateHyperdriveConfigParams struct { - HyperdriveID string `json:"-"` - Name string `json:"name"` - Origin HyperdriveConfigOriginWithPassword `json:"origin"` - Caching HyperdriveConfigCaching `json:"caching,omitempty"` + HyperdriveID string `json:"-"` + Name string `json:"name"` + Origin HyperdriveConfigOriginWithSecrets `json:"origin"` + Caching HyperdriveConfigCaching `json:"caching,omitempty"` } type ListHyperdriveConfigParams struct{} diff --git a/hyperdrive_test.go b/hyperdrive_test.go index 6606839bf04..8ff44ebc319 100644 --- a/hyperdrive_test.go +++ b/hyperdrive_test.go @@ -12,8 +12,8 @@ import ( const ( testHyperdriveConfigId = "6b7efc370ea34ded8327fa20698dfe3a" testHyperdriveConfigName = "example-hyperdrive" - testAccessClientID = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a.access" - testAccessClientSecret = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a" + testAccessClientID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.access" + testAccessClientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ) func testHyperdriveHostAndPortConfig() HyperdriveConfig { @@ -40,12 +40,11 @@ func testHyperdriveCFAccessConfig() HyperdriveConfig { ID: testHyperdriveConfigId, Name: testHyperdriveConfigName, Origin: HyperdriveConfigOrigin{ - Database: "postgres", - Host: "database.example.com", - Scheme: "postgres", - User: "postgres", - AccessClientID: testAccessClientID, - AccessClientSecret: testAccessClientSecret, + Database: "postgres", + Host: "database.example.com", + Scheme: "postgres", + User: "postgres", + AccessClientID: testAccessClientID, }, Caching: HyperdriveConfigCaching{ Disabled: BoolPtr(false), @@ -188,7 +187,7 @@ func TestHyperdriveConfig_CreateHostAndPort(t *testing.T) { result, err := client.CreateHyperdriveConfig(context.Background(), AccountIdentifier(testAccountID), CreateHyperdriveConfigParams{ Name: "example-hyperdrive", - Origin: HyperdriveConfigOriginWithPassword{ + Origin: HyperdriveConfigOriginWithSecrets{ HyperdriveConfigOrigin: HyperdriveConfigOrigin{ Database: "postgres", Host: "database.example.com", @@ -235,8 +234,8 @@ func TestHyperdriveConfig_CreateCFAccess(t *testing.T) { "host": "database.example.com", "scheme": "postgres", "user": "postgres", - "access_client_id": "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a.access", - "access_client_secret": "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a" + "access_client_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.access", + "access_client_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } } }`) @@ -254,16 +253,16 @@ func TestHyperdriveConfig_CreateCFAccess(t *testing.T) { result, err := client.CreateHyperdriveConfig(context.Background(), AccountIdentifier(testAccountID), CreateHyperdriveConfigParams{ Name: "example-hyperdrive", - Origin: HyperdriveConfigOriginWithPassword{ + Origin: HyperdriveConfigOriginWithSecrets{ HyperdriveConfigOrigin: HyperdriveConfigOrigin{ - Database: "postgres", - Host: "database.example.com", - Scheme: "postgres", - User: "postgres", - AccessClientID: testAccessClientID, - AccessClientSecret: testAccessClientSecret, + Database: "postgres", + Host: "database.example.com", + Scheme: "postgres", + User: "postgres", + AccessClientID: testAccessClientID, }, - Password: "password", + Password: "password", + AccessClientSecret: testAccessClientSecret, }, Caching: HyperdriveConfigCaching{ Disabled: BoolPtr(false), @@ -350,7 +349,7 @@ func TestHyperdriveConfig_Update(t *testing.T) { result, err := client.UpdateHyperdriveConfig(context.Background(), AccountIdentifier(testAccountID), UpdateHyperdriveConfigParams{ HyperdriveID: "6b7efc370ea34ded8327fa20698dfe3a", Name: "example-hyperdrive", - Origin: HyperdriveConfigOriginWithPassword{ + Origin: HyperdriveConfigOriginWithSecrets{ HyperdriveConfigOrigin: HyperdriveConfigOrigin{ Database: "postgres", Host: "database.example.com",