Skip to content

Commit

Permalink
Merge pull request #1336 from joshuamsager/joshuamsager/add-regional-…
Browse files Browse the repository at this point in the history
…tiered-cache-configuration

Add Regional Tiered Cache API support
  • Loading branch information
jacobbednarz committed Jul 18, 2023
2 parents 4b8e45e + b29950d commit 544edf5
Show file tree
Hide file tree
Showing 3 changed files with 177 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .changelog/1336.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
zone: Added `GetRegionalTieredCache` and `UpdateRegionalTieredCache` to allow setting Regional Tiered Cache for a zone.
```
84 changes: 84 additions & 0 deletions regional_tiered_cache.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package cloudflare

import (
"context"
"encoding/json"
"fmt"
"net/http"
"time"
)

// RegionalTieredCache is the structure of the API object for the regional tiered cache
// setting.
type RegionalTieredCache struct {
ID string `json:"id,omitempty"`
ModifiedOn time.Time `json:"modified_on,omitempty"`
Value string `json:"value"`
}

// RegionalTieredCacheDetailsResponse is the API response for the regional tiered cache
// setting.
type RegionalTieredCacheDetailsResponse struct {
Result RegionalTieredCache `json:"result"`
Response
}

type zoneRegionalTieredCacheSingleResponse struct {
Response
Result RegionalTieredCache `json:"result"`
}

type GetRegionalTieredCacheParams struct{}

type UpdateRegionalTieredCacheParams struct {
Value string `json:"value"`
}

// GetRegionalTieredCache returns information about the current regional tiered
// cache settings.
//
// API reference: https://developers.cloudflare.com/api/operations/zone-cache-settings-get-regional-tiered-cache-setting
func (api *API) GetRegionalTieredCache(ctx context.Context, rc *ResourceContainer, params GetRegionalTieredCacheParams) (RegionalTieredCache, error) {
if rc.Level != ZoneRouteLevel {
return RegionalTieredCache{}, ErrRequiredZoneLevelResourceContainer
}

uri := fmt.Sprintf("/%s/%s/cache/regional_tiered_cache", rc.Level, rc.Identifier)

res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return RegionalTieredCache{}, err
}

var RegionalTieredCacheDetailsResponse RegionalTieredCacheDetailsResponse
err = json.Unmarshal(res, &RegionalTieredCacheDetailsResponse)
if err != nil {
return RegionalTieredCache{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return RegionalTieredCacheDetailsResponse.Result, nil
}

// UpdateRegionalTieredCache updates the regional tiered cache setting for a
// zone.
//
// API reference: https://developers.cloudflare.com/api/operations/zone-cache-settings-change-regional-tiered-cache-setting
func (api *API) UpdateRegionalTieredCache(ctx context.Context, rc *ResourceContainer, params UpdateRegionalTieredCacheParams) (RegionalTieredCache, error) {
if rc.Level != ZoneRouteLevel {
return RegionalTieredCache{}, ErrRequiredZoneLevelResourceContainer
}

uri := fmt.Sprintf("/%s/%s/cache/regional_tiered_cache", rc.Level, rc.Identifier)

res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
if err != nil {
return RegionalTieredCache{}, err
}

response := &zoneRegionalTieredCacheSingleResponse{}
err = json.Unmarshal(res, &response)
if err != nil {
return RegionalTieredCache{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}

return response.Result, nil
}
90 changes: 90 additions & 0 deletions regional_tiered_cache_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package cloudflare

import (
"context"
"fmt"
"net/http"
"testing"
"time"

"github.com/stretchr/testify/assert"
)

var regionalTieredCacheTimestampString = "2019-02-20T22:37:07.107449Z"
var regionalTieredCacheTimestamp, _ = time.Parse(time.RFC3339Nano, regionalTieredCacheTimestampString)

func TestRegionalTieredCache(t *testing.T) {
setup()
defer teardown()

handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"id": "regional_tiered_cache",
"value": "on",
"modified_on": "%s"
}
}
`, regionalTieredCacheTimestampString)
}

mux.HandleFunc("/zones/"+testZoneID+"/cache/regional_tiered_cache", handler)
want := RegionalTieredCache{
ID: "regional_tiered_cache",
Value: "on",
ModifiedOn: regionalTieredCacheTimestamp,
}

actual, err := client.GetRegionalTieredCache(
context.Background(),
ZoneIdentifier(testZoneID),
GetRegionalTieredCacheParams{},
)

if assert.NoError(t, err) {
assert.Equal(t, want, actual)
}
}

func TestUpdateRegionalTieredCache(t *testing.T) {
setup()
defer teardown()

handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprintf(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"id": "regional_tiered_cache",
"value": "off",
"modified_on": "%s"
}
}
`, regionalTieredCacheTimestampString)
}

mux.HandleFunc("/zones/"+testZoneID+"/cache/regional_tiered_cache", handler)
want := RegionalTieredCache{
ID: "regional_tiered_cache",
Value: "off",
ModifiedOn: regionalTieredCacheTimestamp,
}

actual, err := client.UpdateRegionalTieredCache(
context.Background(),
ZoneIdentifier(testZoneID),
UpdateRegionalTieredCacheParams{Value: "off"},
)

if assert.NoError(t, err) {
assert.Equal(t, want, actual)
}
}

0 comments on commit 544edf5

Please sign in to comment.