Skip to content

Commit 9078660

Browse files
[CDTOOL-1212] ensure proper optional bool behavior in logging kafka (#1147)
1 parent 79d7ddc commit 9078660

File tree

3 files changed

+141
-73
lines changed

3 files changed

+141
-73
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@
1010

1111
- fix(header): preserve optional bool field `ignore_if_set` during updates and add acceptance test coverage ([#1142](https://github.com/fastly/terraform-provider-fastly/pull/1142))
1212
- fix(image_optimizer_default_settings): preserve optional bool fields (`allow_video`, `webp`, `upscale`) during updates and add acceptance test coverage ([#1145](https://github.com/fastly/terraform-provider-fastly/pull/1145))
13+
- fix(logging_kafka): preserve optional bool fields (`use_tls`, `parse_log_keyvals`) during updates and add acceptance test coverage ([#1147](https://github.com/fastly/terraform-provider-fastly/pull/1147))
1314

1415
### DEPENDENCIES:
16+
1517
- build(deps): `golangci/golangci-lint-action` from 8 to 9 ([#1144](https://github.com/fastly/terraform-provider-fastly/pull/1144))
1618

1719
### DOCUMENTATION:
20+
1821
- docs(ngwaf/rules): added signal exclusion rule type documentation ([#1140](https://github.com/fastly/terraform-provider-fastly/pull/1140))
1922

2023
## 8.4.0 (November 4, 2025)

fastly/block_fastly_service_logging_kafka.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ func (h *KafkaServiceAttributeHandler) Update(ctx context.Context, d *schema.Res
207207
Name: resource["name"].(string),
208208
}
209209

210+
// Always preserve optional bool values to prevent drift
211+
opts.UseTLS = gofastly.ToPointer(gofastly.Compatibool(resource["use_tls"].(bool)))
212+
opts.ParseLogKeyvals = gofastly.ToPointer(gofastly.Compatibool(resource["parse_log_keyvals"].(bool)))
213+
210214
// NOTE: When converting from an interface{} we lose the underlying type.
211215
// Converting to the wrong type will result in a runtime panic.
212216
if v, ok := modified["brokers"]; ok {
@@ -218,9 +222,6 @@ func (h *KafkaServiceAttributeHandler) Update(ctx context.Context, d *schema.Res
218222
if v, ok := modified["required_acks"]; ok {
219223
opts.RequiredACKs = gofastly.ToPointer(v.(string))
220224
}
221-
if v, ok := modified["use_tls"]; ok {
222-
opts.UseTLS = gofastly.ToPointer(gofastly.Compatibool(v.(bool)))
223-
}
224225
if v, ok := modified["compression_codec"]; ok {
225226
opts.CompressionCodec = gofastly.ToPointer(v.(string))
226227
}
@@ -248,9 +249,6 @@ func (h *KafkaServiceAttributeHandler) Update(ctx context.Context, d *schema.Res
248249
if v, ok := modified["tls_client_key"]; ok {
249250
opts.TLSClientKey = gofastly.ToPointer(v.(string))
250251
}
251-
if v, ok := modified["parse_log_keyvals"]; ok {
252-
opts.ParseLogKeyvals = gofastly.ToPointer(gofastly.Compatibool(v.(bool)))
253-
}
254252
if v, ok := modified["request_max_bytes"]; ok {
255253
opts.RequestMaxBytes = gofastly.ToPointer(v.(int))
256254
}
@@ -268,11 +266,9 @@ func (h *KafkaServiceAttributeHandler) Update(ctx context.Context, d *schema.Res
268266
}
269267

270268
log.Printf("[DEBUG] Update Kafka Opts: %#v", opts)
269+
271270
_, err := conn.UpdateKafka(gofastly.NewContextForResourceID(ctx, d.Id()), &opts)
272-
if err != nil {
273-
return err
274-
}
275-
return nil
271+
return err
276272
}
277273

278274
// Delete deletes the resource.

fastly/block_fastly_service_logging_kafka_test.go

Lines changed: 132 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,72 @@ import (
1414
gofastly "github.com/fastly/go-fastly/v12/fastly"
1515
)
1616

17+
func TestResourceFastlyFlattenKafka(t *testing.T) {
18+
cases := []struct {
19+
remote []*gofastly.Kafka
20+
local []map[string]any
21+
}{
22+
{
23+
remote: []*gofastly.Kafka{
24+
{
25+
ServiceVersion: gofastly.ToPointer(1),
26+
Name: gofastly.ToPointer("kafka-endpoint"),
27+
Topic: gofastly.ToPointer("topic"),
28+
Brokers: gofastly.ToPointer("127.0.0.1,127.0.0.2"),
29+
CompressionCodec: gofastly.ToPointer("snappy"),
30+
RequiredACKs: gofastly.ToPointer("-1"),
31+
UseTLS: gofastly.ToPointer(true),
32+
TLSCACert: gofastly.ToPointer(caCert(t)),
33+
TLSClientCert: gofastly.ToPointer(certificate(t)),
34+
TLSClientKey: gofastly.ToPointer(privateKey(t)),
35+
TLSHostname: gofastly.ToPointer("example.com"),
36+
ResponseCondition: gofastly.ToPointer("response_condition"),
37+
Format: gofastly.ToPointer(LoggingKafkaDefaultFormat),
38+
FormatVersion: gofastly.ToPointer(2),
39+
Placement: gofastly.ToPointer("none"),
40+
ParseLogKeyvals: gofastly.ToPointer(true),
41+
RequestMaxBytes: gofastly.ToPointer(12345),
42+
AuthMethod: gofastly.ToPointer("scram-sha-512"),
43+
User: gofastly.ToPointer("user"),
44+
Password: gofastly.ToPointer("password"),
45+
ProcessingRegion: gofastly.ToPointer("eu"),
46+
},
47+
},
48+
local: []map[string]any{
49+
{
50+
"name": "kafka-endpoint",
51+
"topic": "topic",
52+
"brokers": "127.0.0.1,127.0.0.2",
53+
"compression_codec": "snappy",
54+
"required_acks": "-1",
55+
"use_tls": true,
56+
"tls_ca_cert": caCert(t),
57+
"tls_client_cert": certificate(t),
58+
"tls_client_key": privateKey(t),
59+
"tls_hostname": "example.com",
60+
"response_condition": "response_condition",
61+
"format": LoggingKafkaDefaultFormat,
62+
"placement": "none",
63+
"format_version": 2,
64+
"parse_log_keyvals": true,
65+
"request_max_bytes": 12345,
66+
"auth_method": "scram-sha-512",
67+
"user": "user",
68+
"password": "password",
69+
"processing_region": "eu",
70+
},
71+
},
72+
},
73+
}
74+
75+
for _, c := range cases {
76+
out := flattenKafka(c.remote)
77+
if diff := cmp.Diff(out, c.local); diff != "" {
78+
t.Fatalf("Error matching: %s", diff)
79+
}
80+
}
81+
}
82+
1783
func TestAccFastlyServiceVCL_kafkalogging_basic(t *testing.T) {
1884
var service gofastly.ServiceDetail
1985
name := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
@@ -170,6 +236,46 @@ func TestAccFastlyServiceVCL_kafkalogging_basic_compute(t *testing.T) {
170236
})
171237
}
172238

239+
func TestAccFastlyServiceVCL_kafkalogging_PreserveBooleansDuringNameChange(t *testing.T) {
240+
var service gofastly.ServiceDetail
241+
serviceName := acctest.RandomWithPrefix("tf-kafka")
242+
domainName := fmt.Sprintf("test.%s.com", acctest.RandString(10))
243+
244+
initialKafkaName := "kafka-preserve"
245+
updatedKafkaName := "kafka-preserve-renamed"
246+
247+
// Values we want to preserve
248+
useTLS := true
249+
parseLogKeyvals := true
250+
251+
resource.ParallelTest(t, resource.TestCase{
252+
PreCheck: func() { testAccPreCheck(t) },
253+
ProviderFactories: testAccProviders,
254+
CheckDestroy: testAccCheckServiceVCLDestroy,
255+
Steps: []resource.TestStep{
256+
{
257+
Config: testAccServiceVCLKafkaLoggingPreserveBooleans(serviceName, domainName, initialKafkaName, useTLS, parseLogKeyvals),
258+
Check: resource.ComposeTestCheckFunc(
259+
testAccCheckServiceExists("fastly_service_vcl.foo", &service),
260+
resource.TestCheckResourceAttr("fastly_service_vcl.foo", "logging_kafka.#", "1"),
261+
resource.TestCheckResourceAttr("fastly_service_vcl.foo", "logging_kafka.0.use_tls", fmt.Sprintf("%t", useTLS)),
262+
resource.TestCheckResourceAttr("fastly_service_vcl.foo", "logging_kafka.0.parse_log_keyvals", fmt.Sprintf("%t", parseLogKeyvals)),
263+
),
264+
},
265+
{
266+
// Only change the Kafka logging name (unrelated field), verify booleans are preserved
267+
Config: testAccServiceVCLKafkaLoggingPreserveBooleans(serviceName, domainName, updatedKafkaName, useTLS, parseLogKeyvals),
268+
Check: resource.ComposeTestCheckFunc(
269+
testAccCheckServiceExists("fastly_service_vcl.foo", &service),
270+
resource.TestCheckResourceAttr("fastly_service_vcl.foo", "logging_kafka.#", "1"),
271+
resource.TestCheckResourceAttr("fastly_service_vcl.foo", "logging_kafka.0.use_tls", fmt.Sprintf("%t", useTLS)),
272+
resource.TestCheckResourceAttr("fastly_service_vcl.foo", "logging_kafka.0.parse_log_keyvals", fmt.Sprintf("%t", parseLogKeyvals)),
273+
),
274+
},
275+
},
276+
})
277+
}
278+
173279
func testAccCheckFastlyServiceVCLKafkaAttributes(service *gofastly.ServiceDetail, kafka []*gofastly.Kafka, serviceType string) resource.TestCheckFunc {
174280
return func(_ *terraform.State) error {
175281
conn := testAccProvider.Meta().(*APIClient).conn
@@ -386,68 +492,31 @@ resource "fastly_service_vcl" "foo" {
386492
}`, name, domain, format, format)
387493
}
388494

389-
func TestResourceFastlyFlattenKafka(t *testing.T) {
390-
cases := []struct {
391-
remote []*gofastly.Kafka
392-
local []map[string]any
393-
}{
394-
{
395-
remote: []*gofastly.Kafka{
396-
{
397-
ServiceVersion: gofastly.ToPointer(1),
398-
Name: gofastly.ToPointer("kafka-endpoint"),
399-
Topic: gofastly.ToPointer("topic"),
400-
Brokers: gofastly.ToPointer("127.0.0.1,127.0.0.2"),
401-
CompressionCodec: gofastly.ToPointer("snappy"),
402-
RequiredACKs: gofastly.ToPointer("-1"),
403-
UseTLS: gofastly.ToPointer(true),
404-
TLSCACert: gofastly.ToPointer(caCert(t)),
405-
TLSClientCert: gofastly.ToPointer(certificate(t)),
406-
TLSClientKey: gofastly.ToPointer(privateKey(t)),
407-
TLSHostname: gofastly.ToPointer("example.com"),
408-
ResponseCondition: gofastly.ToPointer("response_condition"),
409-
Format: gofastly.ToPointer(LoggingKafkaDefaultFormat),
410-
FormatVersion: gofastly.ToPointer(2),
411-
Placement: gofastly.ToPointer("none"),
412-
ParseLogKeyvals: gofastly.ToPointer(true),
413-
RequestMaxBytes: gofastly.ToPointer(12345),
414-
AuthMethod: gofastly.ToPointer("scram-sha-512"),
415-
User: gofastly.ToPointer("user"),
416-
Password: gofastly.ToPointer("password"),
417-
ProcessingRegion: gofastly.ToPointer("eu"),
418-
},
419-
},
420-
local: []map[string]any{
421-
{
422-
"name": "kafka-endpoint",
423-
"topic": "topic",
424-
"brokers": "127.0.0.1,127.0.0.2",
425-
"compression_codec": "snappy",
426-
"required_acks": "-1",
427-
"use_tls": true,
428-
"tls_ca_cert": caCert(t),
429-
"tls_client_cert": certificate(t),
430-
"tls_client_key": privateKey(t),
431-
"tls_hostname": "example.com",
432-
"response_condition": "response_condition",
433-
"format": LoggingKafkaDefaultFormat,
434-
"placement": "none",
435-
"format_version": 2,
436-
"parse_log_keyvals": true,
437-
"request_max_bytes": 12345,
438-
"auth_method": "scram-sha-512",
439-
"user": "user",
440-
"password": "password",
441-
"processing_region": "eu",
442-
},
443-
},
444-
},
445-
}
495+
func testAccServiceVCLKafkaLoggingPreserveBooleans(serviceName, domainName, kafkaName string, useTLS, parseLogKeyvals bool) string {
496+
return fmt.Sprintf(`
497+
resource "fastly_service_vcl" "foo" {
498+
name = "%s"
446499
447-
for _, c := range cases {
448-
out := flattenKafka(c.remote)
449-
if diff := cmp.Diff(out, c.local); diff != "" {
450-
t.Fatalf("Error matching: %s", diff)
451-
}
452-
}
500+
domain {
501+
name = "%s"
502+
comment = "test"
503+
}
504+
505+
backend {
506+
address = "httpbin.org"
507+
name = "httpbin"
508+
}
509+
510+
logging_kafka {
511+
name = "%s"
512+
topic = "test-topic"
513+
brokers = "127.0.0.1:9092"
514+
required_acks = "1"
515+
use_tls = %t
516+
parse_log_keyvals = %t
517+
}
518+
519+
force_destroy = true
520+
}
521+
`, serviceName, domainName, kafkaName, useTLS, parseLogKeyvals)
453522
}

0 commit comments

Comments
 (0)