Skip to content

Commit e51bf6b

Browse files
authored
feat: v4 to v5 migration for cloudflare_r2_bucket (#22)
Add cloudflare_r2_bucket v4 to v5 migration Implements migration for cloudflare_r2_bucket resource with state transformation to add v5 default values (jurisdiction="default", storage_class="Standard"). Config files pass through unchanged. Files added: - internal/resources/r2_bucket/v4_to_v5.go - internal/resources/r2_bucket/v4_to_v5_test.go - integration/v4_to_v5/testdata/r2_bucket/ Tests: - 10 unit tests (5 config, 5 state transformation) - Integration tests with 6 bucket resources - All tests verify no plan changes after migration
1 parent 17f51ba commit e51bf6b

File tree

8 files changed

+589
-0
lines changed

8 files changed

+589
-0
lines changed

integration/v4_to_v5/integration_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
_ "github.com/cloudflare/tf-migrate/internal/resources/api_token"
1313
_ "github.com/cloudflare/tf-migrate/internal/resources/dns_record"
1414
_ "github.com/cloudflare/tf-migrate/internal/resources/logpull_retention"
15+
_ "github.com/cloudflare/tf-migrate/internal/resources/r2_bucket"
1516
_ "github.com/cloudflare/tf-migrate/internal/resources/workers_kv"
1617
_ "github.com/cloudflare/tf-migrate/internal/resources/workers_kv_namespace"
1718
_ "github.com/cloudflare/tf-migrate/internal/resources/zero_trust_access_service_token"
@@ -48,6 +49,7 @@ func TestV4ToV5Migration(t *testing.T) {
4849
"api_token",
4950
"dns_record",
5051
"logpull_retention",
52+
"r2_bucket",
5153
"workers_kv",
5254
"workers_kv_namespace",
5355
"zero_trust_access_service_token",
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Test Case 1: Basic R2 bucket with required fields only
2+
resource "cloudflare_r2_bucket" "basic" {
3+
account_id = "f037e56e89293a057740de681ac9abbe"
4+
name = "test-bucket"
5+
}
6+
7+
# Test Case 2: R2 bucket with location (uppercase - v4 style)
8+
resource "cloudflare_r2_bucket" "with_location_upper" {
9+
account_id = "f037e56e89293a057740de681ac9abbe"
10+
name = "bucket-wnam"
11+
location = "WNAM"
12+
}
13+
14+
# Test Case 3: R2 bucket with location (lowercase - also valid)
15+
resource "cloudflare_r2_bucket" "with_location_lower" {
16+
account_id = "f037e56e89293a057740de681ac9abbe"
17+
name = "bucket-eeur"
18+
location = "eeur"
19+
}
20+
21+
# Test Case 4: R2 bucket with variable reference
22+
variable "account_id" {
23+
type = string
24+
}
25+
26+
resource "cloudflare_r2_bucket" "with_variable" {
27+
account_id = var.account_id
28+
name = "variable-bucket"
29+
}
30+
31+
# Test Case 5: Multiple buckets with different configs
32+
resource "cloudflare_r2_bucket" "multi1" {
33+
account_id = "f037e56e89293a057740de681ac9abbe"
34+
name = "multi-bucket-1"
35+
}
36+
37+
resource "cloudflare_r2_bucket" "multi2" {
38+
account_id = "f037e56e89293a057740de681ac9abbe"
39+
name = "multi-bucket-2"
40+
location = "APAC"
41+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
{
2+
"version": 4,
3+
"terraform_version": "1.5.0",
4+
"serial": 1,
5+
"lineage": "test-r2-bucket-lineage",
6+
"outputs": {},
7+
"resources": [
8+
{
9+
"mode": "managed",
10+
"type": "cloudflare_r2_bucket",
11+
"name": "basic",
12+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
13+
"instances": [
14+
{
15+
"schema_version": 0,
16+
"attributes": {
17+
"id": "test-bucket",
18+
"account_id": "f037e56e89293a057740de681ac9abbe",
19+
"name": "test-bucket",
20+
"jurisdiction": "default",
21+
"storage_class": "Standard"
22+
}
23+
}
24+
]
25+
},
26+
{
27+
"mode": "managed",
28+
"type": "cloudflare_r2_bucket",
29+
"name": "with_location_upper",
30+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
31+
"instances": [
32+
{
33+
"schema_version": 0,
34+
"attributes": {
35+
"id": "bucket-wnam",
36+
"account_id": "f037e56e89293a057740de681ac9abbe",
37+
"name": "bucket-wnam",
38+
"location": "WNAM",
39+
"jurisdiction": "default",
40+
"storage_class": "Standard"
41+
}
42+
}
43+
]
44+
},
45+
{
46+
"mode": "managed",
47+
"type": "cloudflare_r2_bucket",
48+
"name": "with_location_lower",
49+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
50+
"instances": [
51+
{
52+
"schema_version": 0,
53+
"attributes": {
54+
"id": "bucket-eeur",
55+
"account_id": "f037e56e89293a057740de681ac9abbe",
56+
"name": "bucket-eeur",
57+
"location": "eeur",
58+
"jurisdiction": "default",
59+
"storage_class": "Standard"
60+
}
61+
}
62+
]
63+
},
64+
{
65+
"mode": "managed",
66+
"type": "cloudflare_r2_bucket",
67+
"name": "with_variable",
68+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
69+
"instances": [
70+
{
71+
"schema_version": 0,
72+
"attributes": {
73+
"id": "variable-bucket",
74+
"account_id": "f037e56e89293a057740de681ac9abbe",
75+
"name": "variable-bucket",
76+
"jurisdiction": "default",
77+
"storage_class": "Standard"
78+
}
79+
}
80+
]
81+
},
82+
{
83+
"mode": "managed",
84+
"type": "cloudflare_r2_bucket",
85+
"name": "multi1",
86+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
87+
"instances": [
88+
{
89+
"schema_version": 0,
90+
"attributes": {
91+
"id": "multi-bucket-1",
92+
"account_id": "f037e56e89293a057740de681ac9abbe",
93+
"name": "multi-bucket-1",
94+
"jurisdiction": "default",
95+
"storage_class": "Standard"
96+
}
97+
}
98+
]
99+
},
100+
{
101+
"mode": "managed",
102+
"type": "cloudflare_r2_bucket",
103+
"name": "multi2",
104+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
105+
"instances": [
106+
{
107+
"schema_version": 0,
108+
"attributes": {
109+
"id": "multi-bucket-2",
110+
"account_id": "f037e56e89293a057740de681ac9abbe",
111+
"name": "multi-bucket-2",
112+
"location": "APAC",
113+
"jurisdiction": "default",
114+
"storage_class": "Standard"
115+
}
116+
}
117+
]
118+
}
119+
]
120+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Test Case 1: Basic R2 bucket with required fields only
2+
resource "cloudflare_r2_bucket" "basic" {
3+
account_id = "f037e56e89293a057740de681ac9abbe"
4+
name = "test-bucket"
5+
}
6+
7+
# Test Case 2: R2 bucket with location (uppercase - v4 style)
8+
resource "cloudflare_r2_bucket" "with_location_upper" {
9+
account_id = "f037e56e89293a057740de681ac9abbe"
10+
name = "bucket-wnam"
11+
location = "WNAM"
12+
}
13+
14+
# Test Case 3: R2 bucket with location (lowercase - also valid)
15+
resource "cloudflare_r2_bucket" "with_location_lower" {
16+
account_id = "f037e56e89293a057740de681ac9abbe"
17+
name = "bucket-eeur"
18+
location = "eeur"
19+
}
20+
21+
# Test Case 4: R2 bucket with variable reference
22+
variable "account_id" {
23+
type = string
24+
}
25+
26+
resource "cloudflare_r2_bucket" "with_variable" {
27+
account_id = var.account_id
28+
name = "variable-bucket"
29+
}
30+
31+
# Test Case 5: Multiple buckets with different configs
32+
resource "cloudflare_r2_bucket" "multi1" {
33+
account_id = "f037e56e89293a057740de681ac9abbe"
34+
name = "multi-bucket-1"
35+
}
36+
37+
resource "cloudflare_r2_bucket" "multi2" {
38+
account_id = "f037e56e89293a057740de681ac9abbe"
39+
name = "multi-bucket-2"
40+
location = "APAC"
41+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
{
2+
"version": 4,
3+
"terraform_version": "1.5.0",
4+
"serial": 1,
5+
"lineage": "test-r2-bucket-lineage",
6+
"outputs": {},
7+
"resources": [
8+
{
9+
"mode": "managed",
10+
"type": "cloudflare_r2_bucket",
11+
"name": "basic",
12+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
13+
"instances": [
14+
{
15+
"schema_version": 0,
16+
"attributes": {
17+
"id": "test-bucket",
18+
"account_id": "f037e56e89293a057740de681ac9abbe",
19+
"name": "test-bucket"
20+
}
21+
}
22+
]
23+
},
24+
{
25+
"mode": "managed",
26+
"type": "cloudflare_r2_bucket",
27+
"name": "with_location_upper",
28+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
29+
"instances": [
30+
{
31+
"schema_version": 0,
32+
"attributes": {
33+
"id": "bucket-wnam",
34+
"account_id": "f037e56e89293a057740de681ac9abbe",
35+
"name": "bucket-wnam",
36+
"location": "WNAM"
37+
}
38+
}
39+
]
40+
},
41+
{
42+
"mode": "managed",
43+
"type": "cloudflare_r2_bucket",
44+
"name": "with_location_lower",
45+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
46+
"instances": [
47+
{
48+
"schema_version": 0,
49+
"attributes": {
50+
"id": "bucket-eeur",
51+
"account_id": "f037e56e89293a057740de681ac9abbe",
52+
"name": "bucket-eeur",
53+
"location": "eeur"
54+
}
55+
}
56+
]
57+
},
58+
{
59+
"mode": "managed",
60+
"type": "cloudflare_r2_bucket",
61+
"name": "with_variable",
62+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
63+
"instances": [
64+
{
65+
"schema_version": 0,
66+
"attributes": {
67+
"id": "variable-bucket",
68+
"account_id": "f037e56e89293a057740de681ac9abbe",
69+
"name": "variable-bucket"
70+
}
71+
}
72+
]
73+
},
74+
{
75+
"mode": "managed",
76+
"type": "cloudflare_r2_bucket",
77+
"name": "multi1",
78+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
79+
"instances": [
80+
{
81+
"schema_version": 0,
82+
"attributes": {
83+
"id": "multi-bucket-1",
84+
"account_id": "f037e56e89293a057740de681ac9abbe",
85+
"name": "multi-bucket-1"
86+
}
87+
}
88+
]
89+
},
90+
{
91+
"mode": "managed",
92+
"type": "cloudflare_r2_bucket",
93+
"name": "multi2",
94+
"provider": "provider[\"registry.terraform.io/cloudflare/cloudflare\"]",
95+
"instances": [
96+
{
97+
"schema_version": 0,
98+
"attributes": {
99+
"id": "multi-bucket-2",
100+
"account_id": "f037e56e89293a057740de681ac9abbe",
101+
"name": "multi-bucket-2",
102+
"location": "APAC"
103+
}
104+
}
105+
]
106+
}
107+
]
108+
}

internal/registry/registry.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"github.com/cloudflare/tf-migrate/internal/resources/api_token"
66
"github.com/cloudflare/tf-migrate/internal/resources/dns_record"
77
"github.com/cloudflare/tf-migrate/internal/resources/logpull_retention"
8+
"github.com/cloudflare/tf-migrate/internal/resources/r2_bucket"
89
"github.com/cloudflare/tf-migrate/internal/resources/workers_kv"
910
"github.com/cloudflare/tf-migrate/internal/resources/workers_kv_namespace"
1011
"github.com/cloudflare/tf-migrate/internal/resources/zero_trust_access_service_token"
@@ -23,6 +24,7 @@ func RegisterAllMigrations() {
2324
dns_record.NewV4ToV5Migrator()
2425
zone_dnssec.NewV4ToV5Migrator()
2526
logpull_retention.NewV4ToV5Migrator()
27+
r2_bucket.NewV4ToV5Migrator()
2628
workers_kv.NewV4ToV5Migrator()
2729
workers_kv_namespace.NewV4ToV5Migrator()
2830
zero_trust_access_service_token.NewV4ToV5Migrator()

0 commit comments

Comments
 (0)