Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds support for Tiered Caching #2101

Merged
merged 5 commits into from Dec 23, 2022
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/2101.txt
@@ -0,0 +1,3 @@
```release-note:new-resource
cloudflare_tiered_cache
```
34 changes: 34 additions & 0 deletions docs/resources/tiered_cache.md
@@ -0,0 +1,34 @@
---
page_title: "cloudflare_tiered_cache Resource - Cloudflare"
subcategory: ""
description: |-
Provides a resource, that manages Cloudflare Tiered Cache settings.
This allows you to adjust topologies for your zone.
---

# cloudflare_tiered_cache (Resource)

Provides a resource, that manages Cloudflare Tiered Cache settings.
This allows you to adjust topologies for your zone.

## Example Usage

```terraform
resource "cloudflare_tiered_cache" "example" {
zone_id = "0da42c8d2132a9ddaf714f9e7c920711"
cache_type = "smart"
}
```
<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `cache_type` (String) The typed of tiered cache to utilize on the zone. Available values: `generic`, `smart`, `off`.
- `zone_id` (String) The zone identifier to target for the resource. **Modifying this attribute will force creation of a new resource.**

### Read-Only

- `id` (String) The ID of this resource.


4 changes: 4 additions & 0 deletions examples/resources/cloudflare_tiered_cache/resource.tf
@@ -0,0 +1,4 @@
resource "cloudflare_tiered_cache" "example" {
zone_id = "0da42c8d2132a9ddaf714f9e7c920711"
cache_type = "smart"
}
1 change: 1 addition & 0 deletions internal/provider/provider.go
Expand Up @@ -260,6 +260,7 @@ func New(version string) func() *schema.Provider {
"cloudflare_teams_list": resourceCloudflareTeamsList(),
"cloudflare_teams_location": resourceCloudflareTeamsLocation(),
"cloudflare_teams_proxy_endpoint": resourceCloudflareTeamsProxyEndpoint(),
"cloudflare_tiered_cache": resourceCloudflareTieredCache(),
"cloudflare_tunnel_config": resourceCloudflareTunnelConfig(),
"cloudflare_teams_rule": resourceCloudflareTeamsRule(),
"cloudflare_total_tls": resourceCloudflareTotalTLS(),
Expand Down
78 changes: 78 additions & 0 deletions internal/provider/resource_cloudflare_tiered_cache.go
@@ -0,0 +1,78 @@
package provider

import (
"context"
"fmt"

"github.com/MakeNowJust/heredoc/v2"
"github.com/cloudflare/cloudflare-go"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func resourceCloudflareTieredCache() *schema.Resource {
return &schema.Resource{
iveelsm marked this conversation as resolved.
Show resolved Hide resolved
Schema: resourceCloudflareTieredCacheSchema(),
ReadContext: resourceCloudflareTieredCacheRead,
UpdateContext: resourceCloudflareTieredCacheUpdate,
CreateContext: resourceCloudflareTieredCacheUpdate,
DeleteContext: resourceCloudflareTieredCacheDelete,
Description: heredoc.Doc(`
Provides a resource, that manages Cloudflare Tiered Cache settings.
This allows you to adjust topologies for your zone.
`),
}
}

func resourceCloudflareTieredCacheUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*cloudflare.API)
zoneID := d.Get("zone_id").(string)

var cacheType cloudflare.TieredCacheType
switch d.Get("cache_type").(string) {
case "smart":
cacheType = cloudflare.TieredCacheSmart
break
case "generic":
cacheType = cloudflare.TieredCacheGeneric
break
case "off":
cacheType = cloudflare.TieredCacheOff
break
default:
return diag.FromErr(fmt.Errorf("error updating tiered cache settings: Unsupported cache type requested"))
}

_, err := client.SetTieredCache(ctx, cloudflare.ZoneIdentifier(zoneID), cacheType)
if err != nil {
return diag.FromErr(fmt.Errorf("error updating tiered cache settings: %w", err))
}
d.SetId(zoneID)
return resourceCloudflareTieredCacheRead(ctx, d, meta)
}

func resourceCloudflareTieredCacheRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*cloudflare.API)
zoneID := d.Get("zone_id").(string)

result, err := client.GetTieredCache(ctx, cloudflare.ZoneIdentifier(zoneID))
if err != nil {
return diag.FromErr(fmt.Errorf("error retrieving tiered cache settings: %w", err))
}

d.SetId(zoneID)
d.Set("cache_type", result.Type.String())
return nil
}

func resourceCloudflareTieredCacheDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*cloudflare.API)
zoneID := d.Get("zone_id").(string)

_, err := client.DeleteTieredCache(ctx, cloudflare.ZoneIdentifier(zoneID))
if err != nil {
return diag.FromErr(fmt.Errorf("error creating deleting tiered cache configuration: %w", err))
}

return nil
}
58 changes: 58 additions & 0 deletions internal/provider/resource_cloudflare_tiered_cache_test.go
@@ -0,0 +1,58 @@
package provider

import (
"fmt"
"os"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func testTieredCacheConfig(rnd, zoneID, cacheType string) string {
return fmt.Sprintf(`
resource "cloudflare_tiered_cache" "%[1]s" {
zone_id = "%[2]s"
cache_type = "%[3]s"
}
`, rnd, zoneID, cacheType)
}

func TestAccCloudflareTieredCache_Smart(t *testing.T) {
rnd := generateRandomResourceName()
name := "cloudflare_tiered_cache." + rnd
zoneID := os.Getenv("CLOUDFLARE_ZONE_ID")

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: providerFactories,
Steps: []resource.TestStep{
{
Config: testTieredCacheConfig(rnd, zoneID, "smart"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(name, "zone_id", zoneID),
resource.TestCheckResourceAttr(name, "cache_type", "smart"),
),
},
},
})
}

func TestAccCloudflareTieredCache_Generic(t *testing.T) {
rnd := generateRandomResourceName()
name := "cloudflare_tiered_cache." + rnd
zoneID := os.Getenv("CLOUDFLARE_ZONE_ID")

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: providerFactories,
Steps: []resource.TestStep{
{
Config: testTieredCacheConfig(rnd, zoneID, "generic"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(name, "zone_id", zoneID),
resource.TestCheckResourceAttr(name, "cache_type", "generic"),
),
},
},
})
}
25 changes: 25 additions & 0 deletions internal/provider/schema_cloudflare_tiered_cache.go
@@ -0,0 +1,25 @@
package provider

import (
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)

func resourceCloudflareTieredCacheSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{
"zone_id": {
Description: "The zone identifier to target for the resource.",
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"cache_type": {
Description: fmt.Sprintf("The typed of tiered cache to utilize on the zone. %s", renderAvailableDocumentationValuesStringSlice([]string{"generic", "smart", "off"})),
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"generic", "smart", "off"}, false),
},
}
}