From 4459b2a5ba4b8614d16fbd17ff8077aaab357ff3 Mon Sep 17 00:00:00 2001 From: sdairs Date: Sat, 14 Mar 2026 22:13:06 +0000 Subject: [PATCH 1/2] Fix service update tag patch serialization --- src/cloud/commands.rs | 9 +++++---- src/cloud/types.rs | 2 +- src/cloud/types_test.rs | 9 ++++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/cloud/commands.rs b/src/cloud/commands.rs index c5bcc8a..3d7b18b 100644 --- a/src/cloud/commands.rs +++ b/src/cloud/commands.rs @@ -95,13 +95,13 @@ fn parse_service_endpoint_changes( Ok((!changes.is_empty()).then_some(changes)) } -fn parse_instance_tag_patches(add: &[String], remove: &[String]) -> Option> { +fn parse_instance_tag_patches(add: &[String], remove: &[String]) -> Option { let patch = InstanceTagsPatch { add: parse_tags(add), remove: parse_tags(remove), }; - (patch.add.is_some() || patch.remove.is_some()).then_some(vec![patch]) + (patch.add.is_some() || patch.remove.is_some()).then_some(patch) } fn parse_org_private_endpoint_remove( @@ -1545,8 +1545,9 @@ mod tests { assert_eq!(json["ipAccessList"]["remove"][0]["source"], "0.0.0.0/0"); assert_eq!(json["privateEndpointIds"]["add"][0], "pe-1"); assert_eq!(json["privateEndpointIds"]["remove"][0], "pe-2"); - assert_eq!(json["tags"][0]["add"][0]["key"], "env"); - assert_eq!(json["tags"][0]["remove"][0]["key"], "old"); + assert!(json["tags"].is_object()); + assert_eq!(json["tags"]["add"][0]["key"], "env"); + assert_eq!(json["tags"]["remove"][0]["key"], "old"); assert_eq!(json["transparentDataEncryptionKeyId"], "tde-1"); assert_eq!(json["enableCoreDumps"], false); } diff --git a/src/cloud/types.rs b/src/cloud/types.rs index a659ed6..e79a760 100644 --- a/src/cloud/types.rs +++ b/src/cloud/types.rs @@ -652,7 +652,7 @@ pub struct UpdateServiceRequest { pub transparent_data_encryption_key_id: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub tags: Option>, + pub tags: Option, #[serde(skip_serializing_if = "Option::is_none")] pub enable_core_dumps: Option, diff --git a/src/cloud/types_test.rs b/src/cloud/types_test.rs index 7ba530e..5ffd31b 100644 --- a/src/cloud/types_test.rs +++ b/src/cloud/types_test.rs @@ -641,13 +641,15 @@ fn test_update_service_request_full() { enabled: true, }]), transparent_data_encryption_key_id: Some("tde-key-1".to_string()), - tags: Some(vec![InstanceTagsPatch { + // The published schema currently shows an array here, but the live API + // expects a single patch object and rejects array payloads. + tags: Some(InstanceTagsPatch { add: Some(vec![ResourceTag { key: "env".to_string(), value: Some("staging".to_string()), }]), remove: None, - }]), + }), enable_core_dumps: Some(false), }; let json = serde_json::to_value(&req).unwrap(); @@ -660,7 +662,8 @@ fn test_update_service_request_full() { assert_eq!(json["releaseChannel"], "fast"); assert_eq!(json["endpoints"][0]["protocol"], "mysql"); assert_eq!(json["transparentDataEncryptionKeyId"], "tde-key-1"); - assert_eq!(json["tags"][0]["add"][0]["key"], "env"); + assert!(json["tags"].is_object()); + assert_eq!(json["tags"]["add"][0]["key"], "env"); assert_eq!(json["enableCoreDumps"], false); } From aa58db453214c4b36af19031466e4f2c5a97a633 Mon Sep 17 00:00:00 2001 From: sdairs Date: Sun, 15 Mar 2026 16:35:28 +0000 Subject: [PATCH 2/2] Rename instance tags patch helper --- src/cloud/commands.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cloud/commands.rs b/src/cloud/commands.rs index 3d7b18b..ad8e318 100644 --- a/src/cloud/commands.rs +++ b/src/cloud/commands.rs @@ -95,7 +95,7 @@ fn parse_service_endpoint_changes( Ok((!changes.is_empty()).then_some(changes)) } -fn parse_instance_tag_patches(add: &[String], remove: &[String]) -> Option { +fn parse_instance_tags_patch(add: &[String], remove: &[String]) -> Option { let patch = InstanceTagsPatch { add: parse_tags(add), remove: parse_tags(remove), @@ -467,7 +467,7 @@ fn build_update_service_request( .transpose()?, endpoints: parse_service_endpoint_changes(&opts.enable_endpoints, &opts.disable_endpoints)?, transparent_data_encryption_key_id: opts.transparent_data_encryption_key_id.clone(), - tags: parse_instance_tag_patches(&opts.add_tags, &opts.remove_tags), + tags: parse_instance_tags_patch(&opts.add_tags, &opts.remove_tags), enable_core_dumps: opts.enable_core_dumps, }) }