From a7a40bf847227b0990ca5f7b8975493fbc3feaf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Fri, 28 Aug 2026 18:42:14 +0200 Subject: [PATCH 1/2] chore: migrate to encoding/json/v2 --- core/build_info.go | 2 +- core/error.go | 67 ++++-- core/example.go | 2 +- core/human/marshal_func.go | 2 +- core/printer.go | 49 ++++- core/result.go | 2 +- core/testing.go | 11 +- internal/editor/marshal.go | 5 +- .../test-baremetal-get-offer-simple.golden | 6 +- .../test-baremetal-list-offer-simple.golden | 195 ++++++------------ .../namespaces/container/v1/custom_deploy.go | 2 +- .../namespaces/container/v1/custom_logs.go | 2 +- .../test-create-container-simple.golden | 3 +- ...est-update-container-registry-image.golden | 3 +- .../test-update-container-simple.golden | 3 +- .../inference/v1/custom_serverless_models.go | 4 +- ...-create-deployment-private-endpoint.golden | 1 - ...nt-create-deployment-with-wait-flag.golden | 1 - ...deployment-create-simple-deployment.golden | 1 - .../k8s/v1/custom_execcredentials.go | 5 +- .../k8s/v1/custom_execcredentials_test.go | 2 +- internal/namespaces/login/login.go | 2 +- .../namespaces/mcp/server/mcp_resources.go | 5 +- internal/namespaces/mcp/server/mcp_tools.go | 5 +- .../namespaces/mcp/server/mcp_tools_test.go | 5 +- .../mnq/v1beta1/custom_nats_helpers.go | 2 +- .../object/v1/custom_bucket_cors.go | 2 +- .../object/v1/custom_bucket_lifecycle.go | 2 +- .../object/v1/custom_bucket_policy.go | 7 +- .../namespaces/object/v1/custom_marshaler.go | 30 +-- internal/namespaces/object/v1/s3configfile.go | 2 +- .../test-clone-instance-simple.golden | 6 +- ...th-public-and-ipam-private-endpoint.golden | 6 +- ...-public-and-static-private-endpoint.golden | 6 +- .../test-create-instance-simple.golden | 6 +- .../test-endpoint-create-private-ipam.golden | 3 +- ...test-endpoint-create-private-static.golden | 3 +- .../test-endpoint-create-public.golden | 3 +- .../testdata/test-endpoint-get-public.golden | 3 +- ...st-endpoint-list-multiple-endpoints.golden | 3 +- .../testdata/test-get-instance-simple.golden | 6 +- .../testdata/test-list-instance-simple.golden | 6 +- ...modify-default-work-mem-from4-to8mb.golden | 6 +- ...nce-modify3-settings+-add-a-new-one.golden | 6 +- ...test-update-instance-set-a-timezone.golden | 6 +- ...pdate-instance-update-instance-name.golden | 6 +- ...pdate-instance-update-instance-tags.golden | 6 +- .../test-upgrade-instance-simple.golden | 6 +- ...st-endpoints-single-public-endpoint.golden | 1 - .../registry/v1/custom_docker_helper.go | 4 +- .../namespaces/registry/v1/helpers_docker.go | 11 +- .../secret/v1beta1/custom_secret_version.go | 2 +- internal/qa/example.go | 2 +- 53 files changed, 262 insertions(+), 275 deletions(-) diff --git a/core/build_info.go b/core/build_info.go index cb36f8ecc4..edf6c600be 100644 --- a/core/build_info.go +++ b/core/build_info.go @@ -2,7 +2,7 @@ package core import ( "context" - "encoding/json" + "encoding/json/v2" "fmt" "io" "net/http" diff --git a/core/error.go b/core/error.go index baef3c8784..ca312b1560 100644 --- a/core/error.go +++ b/core/error.go @@ -1,7 +1,8 @@ package core import ( - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "fmt" "strings" @@ -70,11 +71,28 @@ func (s *CliError) MarshalHuman() (string, error) { return strings.Join(sections, "\n\n"), nil } +// jsonError returns the JSON representation of e, reproducing the encoding/json v1 +// behavior: an error is marshaled through its exported fields or MarshalJSON, and an +// error with no exported fields (e.g. errors.errorString) marshals to {}. +func jsonError(e error) string { + b, err := json.Marshal(e, jsontext.EscapeForHTML(true)) + if err != nil { + return "{}" + } + + return string(b) +} + +// jsonQuoted returns s as a JSON string literal. +func jsonQuoted(s string) (string, error) { + b, err := json.Marshal(s, jsontext.EscapeForHTML(true)) + + return string(b), err +} + func (s *CliError) MarshalJSON() ([]byte, error) { if s.Empty { - type emptyRes struct{} - - return json.Marshal(&emptyRes{}) + return []byte("{}"), nil } message := s.Message @@ -82,17 +100,36 @@ func (s *CliError) MarshalJSON() ([]byte, error) { message = s.Err.Error() } - type tmpRes struct { - Message string `json:"message,omitempty"` - Error error `json:"error,omitempty"` - Details string `json:"details,omitempty"` - Hint string `json:"hint,omitempty"` + // encoding/json v2 refuses to marshal errors with no exported fields and its + // omitempty drops them, so the fields are assembled by hand to keep the v1 wire format. + parts := make([]string, 0, 4) + if message != "" { + q, err := jsonQuoted(message) + if err != nil { + return nil, err + } + + parts = append(parts, `"message":`+q) + } + if s.Err != nil { + parts = append(parts, `"error":`+jsonError(s.Err)) + } + if s.Details != "" { + q, err := jsonQuoted(s.Details) + if err != nil { + return nil, err + } + + parts = append(parts, `"details":`+q) + } + if s.Hint != "" { + q, err := jsonQuoted(s.Hint) + if err != nil { + return nil, err + } + + parts = append(parts, `"hint":`+q) } - return json.Marshal(&tmpRes{ - Message: message, - Error: s.Err, - Details: s.Details, - Hint: s.Hint, - }) + return []byte("{" + strings.Join(parts, ",") + "}"), nil } diff --git a/core/example.go b/core/example.go index 7eec4ed0c9..13c4d8e523 100644 --- a/core/example.go +++ b/core/example.go @@ -1,7 +1,7 @@ package core import ( - "encoding/json" + "encoding/json/v2" "fmt" "strings" diff --git a/core/human/marshal_func.go b/core/human/marshal_func.go index 9cffd61e05..b65cd9ad83 100644 --- a/core/human/marshal_func.go +++ b/core/human/marshal_func.go @@ -1,7 +1,7 @@ package human import ( - "encoding/json" + "encoding/json/v2" "fmt" "net" "reflect" diff --git a/core/printer.go b/core/printer.go index 16dcd341cd..8ffb83529c 100644 --- a/core/printer.go +++ b/core/printer.go @@ -1,7 +1,8 @@ package core import ( - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "errors" "fmt" "io" @@ -284,9 +285,14 @@ func (p *Printer) printJSON(data any) error { if isError { writer = p.stderr } - encoder := json.NewEncoder(writer) + opts := []json.Options{ + json.Deterministic(true), + json.FormatNilSliceAsNull(true), + json.FormatNilMapAsNull(true), + jsontext.EscapeForHTML(true), + } if p.jsonPretty { - encoder.SetIndent("", " ") + opts = append(opts, jsontext.WithIndent(" ")) } // We handle special case to make sure that a nil slice is marshal as `[]` @@ -296,7 +302,42 @@ func (p *Printer) printJSON(data any) error { return err } - return encoder.Encode(data) + // encoding/json v2 refuses to marshal structs with no exported fields + // (e.g. *bytes.Buffer), where v1 encoded them as {}. + if noExportedFields(data) { + _, err := writer.Write([]byte("{}\n")) + + return err + } + + if err := json.MarshalWrite(writer, data, opts...); err != nil { + return err + } + _, err = io.WriteString(writer, "\n") + + return err +} + +// noExportedFields reports whether v (or the value it points to) is a struct with no exported fields. +func noExportedFields(v any) bool { + rv := reflect.ValueOf(v) + for rv.Kind() == reflect.Pointer || rv.Kind() == reflect.Interface { + if rv.IsNil() { + return false + } + rv = rv.Elem() + } + if rv.Kind() != reflect.Struct { + return false + } + t := rv.Type() + for f := range t.Fields() { + if f.PkgPath == "" { + return false + } + } + + return true } func (p *Printer) printYAML(data any) error { diff --git a/core/result.go b/core/result.go index a5e2e67081..af43b0effe 100644 --- a/core/result.go +++ b/core/result.go @@ -1,7 +1,7 @@ package core import ( - "encoding/json" + "encoding/json/v2" "fmt" "strings" diff --git a/core/testing.go b/core/testing.go index 1059cec5db..a08105e3d9 100644 --- a/core/testing.go +++ b/core/testing.go @@ -2,7 +2,7 @@ package core import ( "bytes" - "encoding/json" + "encoding/json/v2" "flag" "fmt" "io" @@ -326,7 +326,6 @@ var foldersUsingVCRv4 = []string{ "internal/namespaces/flexibleip/v1alpha1", "internal/namespaces/iam/v1alpha1", "internal/namespaces/info", - "internal/namespaces/init", "internal/namespaces/instance/v1", "internal/namespaces/instance/v2alpha1", "internal/namespaces/iot/v1", @@ -436,6 +435,13 @@ func Test(config *TestConfig) func(t *testing.T) { overrideEnv = map[string]string{} } + // Scrub ambient KUBECONFIG so tests relying on the default $HOME/.kube/config + // path are not affected by the host environment. Tests that need it set it + // explicitly via TestConfig.OverrideEnv. + if _, ok := overrideEnv["KUBECONFIG"]; !ok { + overrideEnv["KUBECONFIG"] = "" + } + if config.TmpHomeDir { dir := t.TempDir() overrideEnv["HOME"] = dir @@ -1009,6 +1015,7 @@ func marshalGolden(t *testing.T, ctx *CheckFuncCtx) string { str := buffer.String() // In order to avoid diff in goldens we set all timestamp to the same date str = uniformTimestamps(str) + str = uniformTimestampsWithOffSet(str) // Replace Windows return carriage. str = strings.ReplaceAll(str, "\r", "") diff --git a/internal/editor/marshal.go b/internal/editor/marshal.go index 34b99210ab..9c62fd0dde 100644 --- a/internal/editor/marshal.go +++ b/internal/editor/marshal.go @@ -1,7 +1,8 @@ package editor import ( - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "fmt" "strings" @@ -32,7 +33,7 @@ func marshal(i any, mode MarshalMode) ([]byte, error) { case MarshalModeYAML: marshaledData, err = yaml.Marshal(i) case MarshalModeJSON: - marshaledData, err = json.MarshalIndent(i, "", " ") + marshaledData, err = json.Marshal(i, jsontext.WithIndent(" ")) } if err != nil { return marshaledData, err diff --git a/internal/namespaces/baremetal/v1/testdata/test-baremetal-get-offer-simple.golden b/internal/namespaces/baremetal/v1/testdata/test-baremetal-get-offer-simple.golden index 069d0b34f8..0d579226fb 100644 --- a/internal/namespaces/baremetal/v1/testdata/test-baremetal-get-offer-simple.golden +++ b/internal/namespaces/baremetal/v1/testdata/test-baremetal-get-offer-simple.golden @@ -149,8 +149,7 @@ PrivateBandwidth(Mbit/s): "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -179,8 +178,7 @@ PrivateBandwidth(Mbit/s): "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "cd4158d7-2d65-49be-8803-c4b8ab6f760c", diff --git a/internal/namespaces/baremetal/v1/testdata/test-baremetal-list-offer-simple.golden b/internal/namespaces/baremetal/v1/testdata/test-baremetal-list-offer-simple.golden index 7393db2503..c67454578a 100644 --- a/internal/namespaces/baremetal/v1/testdata/test-baremetal-list-offer-simple.golden +++ b/internal/namespaces/baremetal/v1/testdata/test-baremetal-list-offer-simple.golden @@ -160,8 +160,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" } ], "private_bandwidth": 1000000000, @@ -356,8 +355,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -402,8 +400,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9ce714f1-ed03-4e3b-8c69-d46957ab0ebb", @@ -549,8 +546,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -611,8 +607,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" } ], "private_bandwidth": 1000000000, @@ -738,8 +733,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" } ], "private_bandwidth": 1000000000, @@ -939,8 +933,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f74a6322-070e-41dd-a13f-8165ea63aca8", @@ -1061,8 +1054,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "31f78309-e6e0-4005-99b3-b3de3958ca7d", @@ -1075,8 +1067,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -1288,8 +1279,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "31f5cddb-8217-4eb0-ac6a-96dbcb080b88", @@ -1398,8 +1388,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -1650,8 +1639,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -1680,8 +1668,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -1916,8 +1903,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "31f78309-e6e0-4005-99b3-b3de3958ca7d", @@ -1930,8 +1916,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -2079,8 +2064,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "e0063872-115b-413e-bbf9-fff7eeca1065", @@ -2125,8 +2109,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -2384,8 +2367,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -2446,8 +2428,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "cd4158d7-2d65-49be-8803-c4b8ab6f760c", @@ -2686,8 +2667,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "31f78309-e6e0-4005-99b3-b3de3958ca7d", @@ -2700,8 +2680,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -2833,8 +2812,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "4b5723e9-5dcc-42e9-afbb-7ee556027051", @@ -2879,8 +2857,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "b37af8cf-8b18-4349-a063-64e9c3d50124", @@ -3226,8 +3203,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "31f78309-e6e0-4005-99b3-b3de3958ca7d", @@ -3240,8 +3216,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -3442,8 +3417,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -3488,8 +3462,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -3744,8 +3717,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -3822,8 +3794,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "4b5723e9-5dcc-42e9-afbb-7ee556027051", @@ -4020,8 +3991,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -4178,8 +4148,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" } ], "private_bandwidth": 10000000000, @@ -4317,8 +4286,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -4475,8 +4443,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f74a6322-070e-41dd-a13f-8165ea63aca8", @@ -4640,8 +4607,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -4750,8 +4716,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "4b5723e9-5dcc-42e9-afbb-7ee556027051", @@ -4889,8 +4854,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -4935,8 +4899,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "a905e3e8-690a-4822-9c90-21418a44aa76", @@ -5292,8 +5255,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "b37af8cf-8b18-4349-a063-64e9c3d50124", @@ -5354,8 +5316,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -5605,8 +5566,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "931df052-d713-4674-8b58-96a63244c8e2", @@ -5619,8 +5579,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -5816,8 +5775,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "cd4158d7-2d65-49be-8803-c4b8ab6f760c", @@ -5942,8 +5900,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -6139,8 +6096,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "4b5723e9-5dcc-42e9-afbb-7ee556027051", @@ -6265,8 +6221,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -6553,8 +6508,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "b92d36c0-9754-4678-9efd-096e4244e798", @@ -6631,8 +6585,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -6874,8 +6827,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "b92d36c0-9754-4678-9efd-096e4244e798", @@ -6936,8 +6888,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "b37af8cf-8b18-4349-a063-64e9c3d50124", @@ -7147,8 +7098,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "a905e3e8-690a-4822-9c90-21418a44aa76", @@ -7387,8 +7337,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "31f5cddb-8217-4eb0-ac6a-96dbcb080b88", @@ -7449,8 +7398,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -7689,8 +7637,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "b37af8cf-8b18-4349-a063-64e9c3d50124", @@ -7735,8 +7682,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -8187,8 +8133,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -8443,8 +8388,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -8553,8 +8497,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "b92d36c0-9754-4678-9efd-096e4244e798", @@ -8818,8 +8761,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "e0063872-115b-413e-bbf9-fff7eeca1065", @@ -9218,8 +9160,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f74a6322-070e-41dd-a13f-8165ea63aca8", @@ -9296,8 +9237,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" } ], "private_bandwidth": 25000000000, @@ -9505,8 +9445,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -9663,8 +9602,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" } ], "private_bandwidth": 25000000000, @@ -9832,8 +9770,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "b92d36c0-9754-4678-9efd-096e4244e798", @@ -10096,8 +10033,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000", - "remote_access": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "4ce8bd16-0c16-479d-83bb-492b5f9072fa", @@ -10270,8 +10206,7 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000", - "certification": {} + "os_id": "00000000-0000-0000-0000-000000000000" }, { "id": "ad1b86f2-4ae4-49f9-a826-a782e8d492f3", diff --git a/internal/namespaces/container/v1/custom_deploy.go b/internal/namespaces/container/v1/custom_deploy.go index 8b6d1bc582..b2a6ee64e7 100644 --- a/internal/namespaces/container/v1/custom_deploy.go +++ b/internal/namespaces/container/v1/custom_deploy.go @@ -5,7 +5,7 @@ package container import ( "context" "encoding/base64" - "encoding/json" + "encoding/json/v2" "errors" "fmt" "io" diff --git a/internal/namespaces/container/v1/custom_logs.go b/internal/namespaces/container/v1/custom_logs.go index eb614e432b..3bd062b30f 100644 --- a/internal/namespaces/container/v1/custom_logs.go +++ b/internal/namespaces/container/v1/custom_logs.go @@ -2,7 +2,7 @@ package container import ( "context" - "encoding/json" + "encoding/json/v2" "errors" "fmt" "io" diff --git a/internal/namespaces/container/v1/testdata/test-create-container-simple.golden b/internal/namespaces/container/v1/testdata/test-create-container-simple.golden index 686c53ff76..49e0d3900b 100644 --- a/internal/namespaces/container/v1/testdata/test-create-container-simple.golden +++ b/internal/namespaces/container/v1/testdata/test-create-container-simple.golden @@ -58,8 +58,7 @@ Region fr-par "liveness_probe": { "failure_threshold": 30, "interval": "10.000000000s", - "timeout": "1.000000000s", - "tcp": {} + "timeout": "1.000000000s" }, "startup_probe": null, "tags": [], diff --git a/internal/namespaces/container/v1/testdata/test-update-container-registry-image.golden b/internal/namespaces/container/v1/testdata/test-update-container-registry-image.golden index fe97599754..be6b291bfa 100644 --- a/internal/namespaces/container/v1/testdata/test-update-container-registry-image.golden +++ b/internal/namespaces/container/v1/testdata/test-update-container-registry-image.golden @@ -59,8 +59,7 @@ Region fr-par "liveness_probe": { "failure_threshold": 30, "interval": "10.000000000s", - "timeout": "1.000000000s", - "tcp": {} + "timeout": "1.000000000s" }, "startup_probe": null, "tags": [], diff --git a/internal/namespaces/container/v1/testdata/test-update-container-simple.golden b/internal/namespaces/container/v1/testdata/test-update-container-simple.golden index 22feb4a881..f13d2f5a63 100644 --- a/internal/namespaces/container/v1/testdata/test-update-container-simple.golden +++ b/internal/namespaces/container/v1/testdata/test-update-container-simple.golden @@ -59,8 +59,7 @@ Region fr-par "liveness_probe": { "failure_threshold": 30, "interval": "10.000000000s", - "timeout": "1.000000000s", - "tcp": {} + "timeout": "1.000000000s" }, "startup_probe": null, "tags": [ diff --git a/internal/namespaces/inference/v1/custom_serverless_models.go b/internal/namespaces/inference/v1/custom_serverless_models.go index d22a1aafdf..13ae1900a5 100644 --- a/internal/namespaces/inference/v1/custom_serverless_models.go +++ b/internal/namespaces/inference/v1/custom_serverless_models.go @@ -2,7 +2,7 @@ package inference import ( "context" - "encoding/json" + "encoding/json/v2" "errors" "fmt" "net/http" @@ -202,7 +202,7 @@ func fetchModels(ctx context.Context, secret string) (*ListServerlessModelsRespo } var listResp ListServerlessModelsResponse - if err := json.NewDecoder(resp.Body).Decode(&listResp); err != nil { + if err := json.UnmarshalRead(resp.Body, &listResp); err != nil { return nil, fmt.Errorf("failed to decode response: %w", err) } diff --git a/internal/namespaces/inference/v1/testdata/test-create-deployment-private-endpoint-create-deployment-private-endpoint.golden b/internal/namespaces/inference/v1/testdata/test-create-deployment-private-endpoint-create-deployment-private-endpoint.golden index f550236d0d..087183cd65 100644 --- a/internal/namespaces/inference/v1/testdata/test-create-deployment-private-endpoint-create-deployment-private-endpoint.golden +++ b/internal/namespaces/inference/v1/testdata/test-create-deployment-private-endpoint-create-deployment-private-endpoint.golden @@ -30,7 +30,6 @@ e1eef3b8-3ee9-4b4c-9a11-d56e1df8bb39 https://896af1ed-836c-40e2-94e7-f563b78024 { "id": "d0fb99b1-0018-4025-aa46-62dce0f3bc78", "url": "https://896af1ed-836c-40e2-94e7-f563b7802466.ifr.fr-par.scaleway.com", - "public_network": {}, "disable_auth": false }, { diff --git a/internal/namespaces/inference/v1/testdata/test-deployment-create-deployment-with-wait-flag.golden b/internal/namespaces/inference/v1/testdata/test-deployment-create-deployment-with-wait-flag.golden index 645b0b1165..617da6d063 100644 --- a/internal/namespaces/inference/v1/testdata/test-deployment-create-deployment-with-wait-flag.golden +++ b/internal/namespaces/inference/v1/testdata/test-deployment-create-deployment-with-wait-flag.golden @@ -31,7 +31,6 @@ afe74bcb-384e-4db0-9292-838ea75d3d59 https://85d5ddd1-c199-4373-8258-28d81e6a8a { "id": "afe74bcb-384e-4db0-9292-838ea75d3d59", "url": "https://85d5ddd1-c199-4373-8258-28d81e6a8ab0.ifr.fr-par.scaleway.com", - "public_network": {}, "disable_auth": false } ], diff --git a/internal/namespaces/inference/v1/testdata/test-deployment-create-simple-deployment.golden b/internal/namespaces/inference/v1/testdata/test-deployment-create-simple-deployment.golden index 09a1dcdeaa..36369b91db 100644 --- a/internal/namespaces/inference/v1/testdata/test-deployment-create-simple-deployment.golden +++ b/internal/namespaces/inference/v1/testdata/test-deployment-create-simple-deployment.golden @@ -29,7 +29,6 @@ ID URL { "id": "79319256-5e07-4b5a-8c08-b81f1c585b26", "url": "https://956f2366-8cf5-439a-9dbc-5a0ee3036465.ifr.fr-par.scaleway.com", - "public_network": {}, "disable_auth": false } ], diff --git a/internal/namespaces/k8s/v1/custom_execcredentials.go b/internal/namespaces/k8s/v1/custom_execcredentials.go index 6eaa7c7155..d07639925a 100644 --- a/internal/namespaces/k8s/v1/custom_execcredentials.go +++ b/internal/namespaces/k8s/v1/custom_execcredentials.go @@ -2,7 +2,8 @@ package k8s import ( "context" - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "reflect" "github.com/scaleway/scaleway-cli/v2/core" @@ -41,7 +42,7 @@ func k8sExecCredentialRun(ctx context.Context, _ any) (i any, e error) { Token: secretKey, }, } - response, err := json.MarshalIndent(execCreds, "", " ") + response, err := json.Marshal(execCreds, jsontext.WithIndent(" ")) if err != nil { return nil, err } diff --git a/internal/namespaces/k8s/v1/custom_execcredentials_test.go b/internal/namespaces/k8s/v1/custom_execcredentials_test.go index 23b1fb2b92..2dd1ed3274 100644 --- a/internal/namespaces/k8s/v1/custom_execcredentials_test.go +++ b/internal/namespaces/k8s/v1/custom_execcredentials_test.go @@ -1,7 +1,7 @@ package k8s_test import ( - "encoding/json" + "encoding/json/v2" "os" "path" "testing" diff --git a/internal/namespaces/login/login.go b/internal/namespaces/login/login.go index daa6c3bf89..7a30cb2a55 100644 --- a/internal/namespaces/login/login.go +++ b/internal/namespaces/login/login.go @@ -3,7 +3,7 @@ package login import ( "context" "encoding/base64" - "encoding/json" + "encoding/json/v2" "fmt" "net/url" "reflect" diff --git a/internal/namespaces/mcp/server/mcp_resources.go b/internal/namespaces/mcp/server/mcp_resources.go index 07c26f2225..4a1449a0ff 100644 --- a/internal/namespaces/mcp/server/mcp_resources.go +++ b/internal/namespaces/mcp/server/mcp_resources.go @@ -2,7 +2,8 @@ package server import ( "context" - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "fmt" "net/url" "reflect" @@ -189,7 +190,7 @@ func (cr *CommandResource) Execute( // Format the result var resultStr string if result != nil { - if data, err := json.MarshalIndent(result, "", " "); err == nil { + if data, err := json.Marshal(result, jsontext.WithIndent(" ")); err == nil { resultStr = string(data) } else { resultStr = fmt.Sprintf("%v", result) diff --git a/internal/namespaces/mcp/server/mcp_tools.go b/internal/namespaces/mcp/server/mcp_tools.go index 7b8a26a6b6..da63ae3c1e 100644 --- a/internal/namespaces/mcp/server/mcp_tools.go +++ b/internal/namespaces/mcp/server/mcp_tools.go @@ -2,7 +2,8 @@ package server import ( "context" - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "errors" "fmt" "maps" @@ -230,7 +231,7 @@ func (ct *CommandTool) Execute( result = reflect.MakeSlice(v.Type(), 0, 0).Interface() } - if data, err := json.MarshalIndent(result, "", " "); err == nil { + if data, err := json.Marshal(result, jsontext.WithIndent(" ")); err == nil { resultStr = string(data) } else { resultStr = fmt.Sprintf("%v", result) diff --git a/internal/namespaces/mcp/server/mcp_tools_test.go b/internal/namespaces/mcp/server/mcp_tools_test.go index 78bfafbbd7..027b298c58 100644 --- a/internal/namespaces/mcp/server/mcp_tools_test.go +++ b/internal/namespaces/mcp/server/mcp_tools_test.go @@ -2,7 +2,8 @@ package server_test import ( "context" - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "reflect" "strings" "testing" @@ -325,7 +326,7 @@ func TestToolMetaSerialization(t *testing.T) { mcpTool := tool.ToMCPTool() // Marshal to JSON to see what the client actually receives - jsonBytes, err := json.MarshalIndent(mcpTool, "", " ") + jsonBytes, err := json.Marshal(mcpTool, jsontext.WithIndent(" ")) if err != nil { t.Fatalf("Failed to marshal tool: %v", err) } diff --git a/internal/namespaces/mnq/v1beta1/custom_nats_helpers.go b/internal/namespaces/mnq/v1beta1/custom_nats_helpers.go index 1f05f02751..f18bfc4047 100644 --- a/internal/namespaces/mnq/v1beta1/custom_nats_helpers.go +++ b/internal/namespaces/mnq/v1beta1/custom_nats_helpers.go @@ -2,7 +2,7 @@ package mnq import ( "context" - "encoding/json" + "encoding/json/v2" "errors" "fmt" "os" diff --git a/internal/namespaces/object/v1/custom_bucket_cors.go b/internal/namespaces/object/v1/custom_bucket_cors.go index f1438e75f2..71924d5a27 100644 --- a/internal/namespaces/object/v1/custom_bucket_cors.go +++ b/internal/namespaces/object/v1/custom_bucket_cors.go @@ -4,7 +4,7 @@ package object import ( "context" - "encoding/json" + "encoding/json/v2" "errors" "fmt" "os" diff --git a/internal/namespaces/object/v1/custom_bucket_lifecycle.go b/internal/namespaces/object/v1/custom_bucket_lifecycle.go index af2215c03c..78b7f1fba7 100644 --- a/internal/namespaces/object/v1/custom_bucket_lifecycle.go +++ b/internal/namespaces/object/v1/custom_bucket_lifecycle.go @@ -4,7 +4,7 @@ package object import ( "context" - "encoding/json" + "encoding/json/v2" "errors" "fmt" "os" diff --git a/internal/namespaces/object/v1/custom_bucket_policy.go b/internal/namespaces/object/v1/custom_bucket_policy.go index d9a7582f95..f54baf400f 100644 --- a/internal/namespaces/object/v1/custom_bucket_policy.go +++ b/internal/namespaces/object/v1/custom_bucket_policy.go @@ -3,9 +3,8 @@ package object import ( - "bytes" "context" - "encoding/json" + "encoding/json/jsontext" "errors" "fmt" "os" @@ -203,8 +202,8 @@ func bucketPolicyGetCommand() *core.Command { return nil, fmt.Errorf("could not get bucket policy: %w", err) } - var prettyJSON bytes.Buffer - err = json.Indent(&prettyJSON, []byte(*policyResponse.Policy), "", " ") + prettyJSON := jsontext.Value([]byte(*policyResponse.Policy)) + err = prettyJSON.Indent(jsontext.WithIndent(" ")) if err != nil { return nil, fmt.Errorf("error indenting JSON: %w", err) } diff --git a/internal/namespaces/object/v1/custom_marshaler.go b/internal/namespaces/object/v1/custom_marshaler.go index 8ed57606a3..4a4558fc34 100644 --- a/internal/namespaces/object/v1/custom_marshaler.go +++ b/internal/namespaces/object/v1/custom_marshaler.go @@ -1,11 +1,12 @@ package object import ( - "bytes" - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "strings" "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/aws/smithy-go/middleware" "github.com/scaleway/scaleway-cli/v2/core" "github.com/scaleway/scaleway-cli/v2/core/human" "github.com/scaleway/scaleway-sdk-go/scw" @@ -139,8 +140,14 @@ func bucketMarshalerFunc(i any, opt *human.MarshalOpt) (string, error) { // CleanAndIndentJSON takes any struct or data, marshals it, // strips all top-level and nested "null" fields, and returns formatted JSON. +var awsMetadataMarshalers = json.WithMarshalers( + json.MarshalFunc(func(middleware.Metadata) ([]byte, error) { + return []byte("{}"), nil + }), +) + func CleanAndIndentJSON(v any, prefix, indent string) ([]byte, error) { - rawBytes, err := json.Marshal(v) + rawBytes, err := json.Marshal(v, awsMetadataMarshalers, json.Deterministic(true)) if err != nil { return nil, err } @@ -152,17 +159,12 @@ func CleanAndIndentJSON(v any, prefix, indent string) ([]byte, error) { cleanedData := removeNulls(genericData) - cleanBytes, err := json.Marshal(cleanedData) - if err != nil { - return nil, err - } - - var prettyBuf bytes.Buffer - if err := json.Indent(&prettyBuf, cleanBytes, prefix, indent); err != nil { - return nil, err - } - - return prettyBuf.Bytes(), nil + return json.Marshal( + cleanedData, + json.Deterministic(true), + jsontext.WithIndentPrefix(prefix), + jsontext.WithIndent(indent), + ) } // removeNulls recursively purges nil entries from maps and slices diff --git a/internal/namespaces/object/v1/s3configfile.go b/internal/namespaces/object/v1/s3configfile.go index 8f8ec59c0e..8f814843a3 100644 --- a/internal/namespaces/object/v1/s3configfile.go +++ b/internal/namespaces/object/v1/s3configfile.go @@ -5,7 +5,7 @@ package object import ( "bytes" "context" - "encoding/json" + "encoding/json/v2" "errors" "path" "strings" diff --git a/internal/namespaces/rdb/v1/testdata/test-clone-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-clone-instance-simple.golden index d017129a6c..b319698c3b 100644 --- a/internal/namespaces/rdb/v1/testdata/test-clone-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-clone-instance-simple.golden @@ -62,8 +62,7 @@ work_mem 4 "id": "cabf3e8b-60d6-4e0a-ad86-9649f58056fb", "ip": "51.159.114.202", "port": 23659, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -108,8 +107,7 @@ work_mem 4 "id": "cabf3e8b-60d6-4e0a-ad86-9649f58056fb", "ip": "51.159.114.202", "port": 23659, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-ipam-private-endpoint.golden b/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-ipam-private-endpoint.golden index 18e7c9fb3c..fd93af1f65 100644 --- a/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-ipam-private-endpoint.golden +++ b/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-ipam-private-endpoint.golden @@ -72,8 +72,7 @@ Password: "id": "02229f84-eb4c-4ba6-a94a-f8f07131ae21", "ip": "195.154.70.203", "port": 4837, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -130,8 +129,7 @@ Password: "id": "02229f84-eb4c-4ba6-a94a-f8f07131ae21", "ip": "195.154.70.203", "port": 4837, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-static-private-endpoint.golden b/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-static-private-endpoint.golden index 7ae449fe7c..8a754c54ea 100644 --- a/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-static-private-endpoint.golden +++ b/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-static-private-endpoint.golden @@ -72,8 +72,7 @@ Password: "id": "efc7ca3b-9f17-41cc-9cdf-bebb5415748d", "ip": "51.159.8.181", "port": 14800, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -130,8 +129,7 @@ Password: "id": "efc7ca3b-9f17-41cc-9cdf-bebb5415748d", "ip": "51.159.8.181", "port": 14800, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-create-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-create-instance-simple.golden index 2b6e2ebb10..fe8c73a925 100644 --- a/internal/namespaces/rdb/v1/testdata/test-create-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-create-instance-simple.golden @@ -65,8 +65,7 @@ Password: "id": "4e6e7f82-a155-43c6-a364-925b6413e7c3", "ip": "195.154.71.12", "port": 6467, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -111,8 +110,7 @@ Password: "id": "4e6e7f82-a155-43c6-a364-925b6413e7c3", "ip": "195.154.71.12", "port": 6467, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-ipam.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-ipam.golden index 9394d1895e..43d97270e2 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-ipam.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-ipam.golden @@ -11,8 +11,7 @@ b15296de-3c6a-4f83-afcc-11b624ec5ffd 172.16.0.2 5432 - - "id": "424247b7-0231-43c5-89e5-9f8f1abc9447", "ip": "51.159.114.202", "port": 23524, - "name": null, - "load_balancer": {} + "name": null }, { "id": "b15296de-3c6a-4f83-afcc-11b624ec5ffd", diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-static.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-static.golden index 8660ab3a07..32069be5ce 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-static.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-static.golden @@ -11,8 +11,7 @@ e609c33d-72a5-4d32-89a2-3706fba74fec 172.16.0.3 5432 - - "id": "af6a39da-94fe-462f-81d3-ba36dae53b8c", "ip": "195.154.71.12", "port": 7212, - "name": null, - "load_balancer": {} + "name": null }, { "id": "e609c33d-72a5-4d32-89a2-3706fba74fec", diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-public.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-public.golden index b9f24ad95c..0464387afe 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-public.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-public.golden @@ -23,8 +23,7 @@ ID IP PORT NAME HOSTNAME "id": "9f32c59c-cc84-4d57-9d23-0c1a639af825", "ip": "195.154.69.50", "port": 28739, - "name": null, - "load_balancer": {} + "name": null } ], "Success": { diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-get-public.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-get-public.golden index 0cbfe51e6d..315b73a6df 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-get-public.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-get-public.golden @@ -8,6 +8,5 @@ Port 17183 "id": "563846c5-a0f3-4710-85b0-9a6f3d6a4e18", "ip": "195.154.71.12", "port": 17183, - "name": null, - "load_balancer": {} + "name": null } diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-list-multiple-endpoints.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-list-multiple-endpoints.golden index e287f7df2f..5ea69ef512 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-list-multiple-endpoints.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-list-multiple-endpoints.golden @@ -21,7 +21,6 @@ ab06a941-0824-4b06-8f9c-1645a1de755f 172.16.0.3 5432 - - "id": "23857e88-0019-4b3f-98d5-8cd64090109f", "ip": "195.154.71.12", "port": 21923, - "name": null, - "load_balancer": {} + "name": null } ] diff --git a/internal/namespaces/rdb/v1/testdata/test-get-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-get-instance-simple.golden index a23f29ae88..73e8369c82 100644 --- a/internal/namespaces/rdb/v1/testdata/test-get-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-get-instance-simple.golden @@ -66,8 +66,7 @@ IP PROTOCOL DIRECTION ACTION DESCRIPTION PORT "id": "737d3510-55ac-475d-9adc-ab0ddc56a9f6", "ip": "51.159.8.181", "port": 27851, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -112,8 +111,7 @@ IP PROTOCOL DIRECTION ACTION DESCRIPTION PORT "id": "737d3510-55ac-475d-9adc-ab0ddc56a9f6", "ip": "51.159.8.181", "port": 27851, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-list-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-list-instance-simple.golden index 8d483c780b..3c5be133a7 100644 --- a/internal/namespaces/rdb/v1/testdata/test-list-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-list-instance-simple.golden @@ -23,8 +23,7 @@ c71b4866-d96c-453e-919a-687f7cd1b350 cli-test db-dev-s ready PostgreSQL-15 "id": "56e0207e-7ed1-486a-a5ac-f3d23ce91bda", "ip": "195.154.71.12", "port": 21189, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -69,8 +68,7 @@ c71b4866-d96c-453e-919a-687f7cd1b350 cli-test db-dev-s ready PostgreSQL-15 "id": "56e0207e-7ed1-486a-a5ac-f3d23ce91bda", "ip": "195.154.71.12", "port": 21189, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-modify-default-work-mem-from4-to8mb.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-modify-default-work-mem-from4-to8mb.golden index 54dfe6fd09..7cd7835b44 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-modify-default-work-mem-from4-to8mb.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-modify-default-work-mem-from4-to8mb.golden @@ -62,8 +62,7 @@ work_mem 8 "id": "8834804a-b146-4719-8d0d-de6c114ee328", "ip": "51.159.74.117", "port": 5417, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -108,8 +107,7 @@ work_mem 8 "id": "8834804a-b146-4719-8d0d-de6c114ee328", "ip": "51.159.74.117", "port": 5417, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-modify3-settings+-add-a-new-one.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-modify3-settings+-add-a-new-one.golden index 3c2e46173e..8682f4a4f3 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-modify3-settings+-add-a-new-one.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-modify3-settings+-add-a-new-one.golden @@ -62,8 +62,7 @@ work_mem 16 "id": "e1e87bb7-3e2f-4d36-ab2f-5d74a0e8672d", "ip": "195.154.69.220", "port": 12333, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -108,8 +107,7 @@ work_mem 16 "id": "e1e87bb7-3e2f-4d36-ab2f-5d74a0e8672d", "ip": "195.154.69.220", "port": 12333, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-set-a-timezone.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-set-a-timezone.golden index 7860a8ed40..7f35ac35a0 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-set-a-timezone.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-set-a-timezone.golden @@ -63,8 +63,7 @@ work_mem 4 "id": "65012218-d264-479f-9bbc-c2974b7bd257", "ip": "51.159.8.181", "port": 19874, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -113,8 +112,7 @@ work_mem 4 "id": "65012218-d264-479f-9bbc-c2974b7bd257", "ip": "51.159.8.181", "port": 19874, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-name.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-name.golden index c0287cb100..2920228470 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-name.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-name.golden @@ -62,8 +62,7 @@ work_mem 4 "id": "c1419b65-cb75-4dee-8160-8ca0a7212318", "ip": "195.154.69.220", "port": 10635, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -108,8 +107,7 @@ work_mem 4 "id": "c1419b65-cb75-4dee-8160-8ca0a7212318", "ip": "195.154.69.220", "port": 10635, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-tags.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-tags.golden index d54f5faba1..eb9bed5190 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-tags.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-tags.golden @@ -63,8 +63,7 @@ work_mem 4 "id": "67f04d0a-5b9e-4bc2-8346-7f271b34d12b", "ip": "51.159.74.117", "port": 11119, - "name": null, - "load_balancer": {} + "name": null }, "tags": [ "a" @@ -111,8 +110,7 @@ work_mem 4 "id": "67f04d0a-5b9e-4bc2-8346-7f271b34d12b", "ip": "51.159.74.117", "port": 11119, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-upgrade-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-upgrade-instance-simple.golden index 99f3788204..93cbb9b4a9 100644 --- a/internal/namespaces/rdb/v1/testdata/test-upgrade-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-upgrade-instance-simple.golden @@ -62,8 +62,7 @@ work_mem 4 "id": "2684cb6f-6aa4-497b-8b93-216d4f4e0339", "ip": "195.154.75.244", "port": 18952, - "name": null, - "load_balancer": {} + "name": null }, "tags": [], "settings": [ @@ -108,8 +107,7 @@ work_mem 4 "id": "2684cb6f-6aa4-497b-8b93-216d4f4e0339", "ip": "195.154.75.244", "port": 18952, - "name": null, - "load_balancer": {} + "name": null } ], "logs_policy": { diff --git a/internal/namespaces/redis/v1/testdata/test-endpoints-single-public-endpoint.golden b/internal/namespaces/redis/v1/testdata/test-endpoints-single-public-endpoint.golden index e7e72e81c0..1537d2cdc4 100644 --- a/internal/namespaces/redis/v1/testdata/test-endpoints-single-public-endpoint.golden +++ b/internal/namespaces/redis/v1/testdata/test-endpoints-single-public-endpoint.golden @@ -30,7 +30,6 @@ ID IP CIDR DESCRIPTION "endpoints": [ { "port": 6379, - "public_network": {}, "ips": [ "78.232.49.55" ], diff --git a/internal/namespaces/registry/v1/custom_docker_helper.go b/internal/namespaces/registry/v1/custom_docker_helper.go index 1278c01f39..2e87596c47 100644 --- a/internal/namespaces/registry/v1/custom_docker_helper.go +++ b/internal/namespaces/registry/v1/custom_docker_helper.go @@ -4,7 +4,7 @@ import ( "bufio" "bytes" "context" - "encoding/json" + "encoding/json/v2" "errors" "fmt" "io" @@ -262,7 +262,7 @@ func registryDockerHelperListCommand() *core.Command { for _, region := range scw.AllRegions { registryEndpoints[getRegistryEndpoint(region)] = "scaleway" } - raw, err := json.Marshal(registryEndpoints) + raw, err := json.Marshal(registryEndpoints, json.Deterministic(true)) if err != nil { return nil, err } diff --git a/internal/namespaces/registry/v1/helpers_docker.go b/internal/namespaces/registry/v1/helpers_docker.go index 35dae480b3..b43620af1b 100644 --- a/internal/namespaces/registry/v1/helpers_docker.go +++ b/internal/namespaces/registry/v1/helpers_docker.go @@ -2,7 +2,8 @@ package registry import ( "context" - "encoding/json" + "encoding/json/jsontext" + "encoding/json/v2" "errors" "fmt" "io" @@ -98,14 +99,12 @@ func setupDockerConfigFile(ctx context.Context, registries []string, binaryName return err } - encoder := json.NewEncoder(f) - encoder.SetIndent("", " ") - err = encoder.Encode(dockerConfig) - if err != nil { + if err := json.MarshalWrite(f, dockerConfig, jsontext.WithIndent(" ")); err != nil { return err } + _, err = f.WriteString("\n") - return nil + return err } func getRegistryEndpoint(region scw.Region) string { diff --git a/internal/namespaces/secret/v1beta1/custom_secret_version.go b/internal/namespaces/secret/v1beta1/custom_secret_version.go index 797fc5820a..e702139fd2 100644 --- a/internal/namespaces/secret/v1beta1/custom_secret_version.go +++ b/internal/namespaces/secret/v1beta1/custom_secret_version.go @@ -2,7 +2,7 @@ package secret import ( "context" - "encoding/json" + "encoding/json/v2" "errors" "reflect" diff --git a/internal/qa/example.go b/internal/qa/example.go index 491814a613..4f0f943e22 100644 --- a/internal/qa/example.go +++ b/internal/qa/example.go @@ -1,7 +1,7 @@ package qa import ( - "encoding/json" + "encoding/json/v2" "fmt" "github.com/scaleway/scaleway-cli/v2/core" From d261a65daf6b2fe163ad4d98b3d3a05d1132156b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 3 Nov 2026 11:44:26 +0100 Subject: [PATCH 2/2] Fix --- core/printer.go | 26 ++- core/printer_test.go | 66 ++++++ .../test-json-printer-addr.cassette.yaml | 3 + core/testdata/test-json-printer-addr.golden | 5 + .../test-json-printer-buffer.cassette.yaml | 3 + core/testdata/test-json-printer-buffer.golden | 5 + .../test-json-printer-time.cassette.yaml | 3 + core/testdata/test-json-printer-time.golden | 5 + ...st-json-printer-union-marker.cassette.yaml | 3 + .../test-json-printer-union-marker.golden | 8 + .../test-baremetal-get-offer-simple.golden | 6 +- .../test-baremetal-list-offer-simple.golden | 195 ++++++++++++------ .../test-create-container-simple.golden | 3 +- ...est-update-container-registry-image.golden | 3 +- .../test-update-container-simple.golden | 3 +- ...-create-deployment-private-endpoint.golden | 1 + ...nt-create-deployment-with-wait-flag.golden | 1 + ...deployment-create-simple-deployment.golden | 1 + .../namespaces/mcp/server/mcp_resources.go | 6 +- internal/namespaces/mcp/server/mcp_tools.go | 6 +- .../test-clone-instance-simple.golden | 6 +- ...th-public-and-ipam-private-endpoint.golden | 6 +- ...-public-and-static-private-endpoint.golden | 6 +- .../test-create-instance-simple.golden | 6 +- .../test-endpoint-create-private-ipam.golden | 3 +- ...test-endpoint-create-private-static.golden | 3 +- .../test-endpoint-create-public.golden | 3 +- .../testdata/test-endpoint-get-public.golden | 3 +- ...st-endpoint-list-multiple-endpoints.golden | 3 +- .../testdata/test-get-instance-simple.golden | 6 +- .../testdata/test-list-instance-simple.golden | 6 +- ...modify-default-work-mem-from4-to8mb.golden | 6 +- ...nce-modify3-settings+-add-a-new-one.golden | 6 +- ...test-update-instance-set-a-timezone.golden | 6 +- ...pdate-instance-update-instance-name.golden | 6 +- ...pdate-instance-update-instance-tags.golden | 6 +- .../test-upgrade-instance-simple.golden | 6 +- ...st-endpoints-single-public-endpoint.golden | 1 + 38 files changed, 338 insertions(+), 102 deletions(-) create mode 100644 core/testdata/test-json-printer-addr.cassette.yaml create mode 100644 core/testdata/test-json-printer-addr.golden create mode 100644 core/testdata/test-json-printer-buffer.cassette.yaml create mode 100644 core/testdata/test-json-printer-buffer.golden create mode 100644 core/testdata/test-json-printer-time.cassette.yaml create mode 100644 core/testdata/test-json-printer-time.golden create mode 100644 core/testdata/test-json-printer-union-marker.cassette.yaml create mode 100644 core/testdata/test-json-printer-union-marker.golden diff --git a/core/printer.go b/core/printer.go index 8ffb83529c..e52b78e344 100644 --- a/core/printer.go +++ b/core/printer.go @@ -1,6 +1,8 @@ package core import ( + "encoding" + jsonv1 "encoding/json" "encoding/json/jsontext" "encoding/json/v2" "errors" @@ -15,6 +17,12 @@ import ( "github.com/scaleway/scaleway-cli/v2/internal/gofields" ) +// OmitEmptyLegacy is an encoding/json/v2 option that preserves the legacy +// (v1) omitempty semantics: a non-nil pointer to an empty struct is not +// considered empty. This keeps SDK union markers such as +// "load_balancer": {} or "public_network": {} in the JSON output. +var OmitEmptyLegacy = jsonv1.OmitEmptyWithLegacySemantics(true) + // Type defines an formatter format. type PrinterType string @@ -290,6 +298,7 @@ func (p *Printer) printJSON(data any) error { json.FormatNilSliceAsNull(true), json.FormatNilMapAsNull(true), jsontext.EscapeForHTML(true), + OmitEmptyLegacy, } if p.jsonPretty { opts = append(opts, jsontext.WithIndent(" ")) @@ -318,7 +327,13 @@ func (p *Printer) printJSON(data any) error { return err } -// noExportedFields reports whether v (or the value it points to) is a struct with no exported fields. +var ( + marshalJSONType = reflect.TypeOf((*json.Marshaler)(nil)).Elem() + marshalTextType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() +) + +// noExportedFields reports whether v (or the value it points to) is a struct +// with no exported fields and no JSON or text marshaling hook. func noExportedFields(v any) bool { rv := reflect.ValueOf(v) for rv.Kind() == reflect.Pointer || rv.Kind() == reflect.Interface { @@ -337,6 +352,15 @@ func noExportedFields(v any) bool { } } + // encoding/json v2 can still marshal such a struct when a JSON or text + // marshaling hook is available (e.g. time.Time, netip.Addr), + // so only fall back to {} when no hook exists. + if t.Implements(marshalJSONType) || t.Implements(marshalTextType) || + reflect.PointerTo(t).Implements(marshalJSONType) || + reflect.PointerTo(t).Implements(marshalTextType) { + return false + } + return true } diff --git a/core/printer_test.go b/core/printer_test.go index 4fdbffe571..a1e0935d54 100644 --- a/core/printer_test.go +++ b/core/printer_test.go @@ -1,9 +1,12 @@ package core_test import ( + "bytes" "context" + "net/netip" "reflect" "testing" + "time" "github.com/scaleway/scaleway-cli/v2/core" ) @@ -240,3 +243,66 @@ func Test_TemplatePrinter(t *testing.T) { Check: core.TestCheckGolden(), })) } + +func Test_JSONPrinter(t *testing.T) { + type Empty struct{} + type Endpoint struct { + ID string `json:"id"` + LoadBalancer *Empty `json:"load_balancer,omitempty"` + } + + commands := core.NewCommands( + &core.Command{ + Namespace: "time", + ArgsType: reflect.TypeOf(struct{}{}), + Run: func(_ context.Context, _ any) (any, error) { + return time.Date(2026, 11, 3, 12, 0, 0, 0, time.UTC), nil + }, + }, + &core.Command{ + Namespace: "addr", + ArgsType: reflect.TypeOf(struct{}{}), + Run: func(_ context.Context, _ any) (any, error) { + return netip.MustParseAddr("127.0.0.1"), nil + }, + }, + &core.Command{ + Namespace: "buffer", + ArgsType: reflect.TypeOf(struct{}{}), + Run: func(_ context.Context, _ any) (any, error) { + return &bytes.Buffer{}, nil + }, + }, + &core.Command{ + Namespace: "endpoint", + ArgsType: reflect.TypeOf(struct{}{}), + Run: func(_ context.Context, _ any) (any, error) { + return Endpoint{ID: "111111111", LoadBalancer: &Empty{}}, nil + }, + }, + ) + + t.Run("time", core.Test(&core.TestConfig{ + Commands: commands, + Cmd: "scw time -o json", + Check: core.TestCheckGolden(), + })) + + t.Run("addr", core.Test(&core.TestConfig{ + Commands: commands, + Cmd: "scw addr -o json", + Check: core.TestCheckGolden(), + })) + + t.Run("buffer", core.Test(&core.TestConfig{ + Commands: commands, + Cmd: "scw buffer -o json", + Check: core.TestCheckGolden(), + })) + + t.Run("union-marker", core.Test(&core.TestConfig{ + Commands: commands, + Cmd: "scw endpoint -o json", + Check: core.TestCheckGolden(), + })) +} diff --git a/core/testdata/test-json-printer-addr.cassette.yaml b/core/testdata/test-json-printer-addr.cassette.yaml new file mode 100644 index 0000000000..2797c38e00 --- /dev/null +++ b/core/testdata/test-json-printer-addr.cassette.yaml @@ -0,0 +1,3 @@ +--- +version: 2 +interactions: [] diff --git a/core/testdata/test-json-printer-addr.golden b/core/testdata/test-json-printer-addr.golden new file mode 100644 index 0000000000..7f82823936 --- /dev/null +++ b/core/testdata/test-json-printer-addr.golden @@ -0,0 +1,5 @@ +🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲 +🟩🟩🟩 STDOUT️ 🟩🟩🟩️ +"127.0.0.1" +🟩🟩🟩 JSON STDOUT 🟩🟩🟩 +"127.0.0.1" diff --git a/core/testdata/test-json-printer-buffer.cassette.yaml b/core/testdata/test-json-printer-buffer.cassette.yaml new file mode 100644 index 0000000000..2797c38e00 --- /dev/null +++ b/core/testdata/test-json-printer-buffer.cassette.yaml @@ -0,0 +1,3 @@ +--- +version: 2 +interactions: [] diff --git a/core/testdata/test-json-printer-buffer.golden b/core/testdata/test-json-printer-buffer.golden new file mode 100644 index 0000000000..b6fb3cc9f2 --- /dev/null +++ b/core/testdata/test-json-printer-buffer.golden @@ -0,0 +1,5 @@ +🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲 +🟩🟩🟩 STDOUT️ 🟩🟩🟩️ +{} +🟩🟩🟩 JSON STDOUT 🟩🟩🟩 +{} diff --git a/core/testdata/test-json-printer-time.cassette.yaml b/core/testdata/test-json-printer-time.cassette.yaml new file mode 100644 index 0000000000..2797c38e00 --- /dev/null +++ b/core/testdata/test-json-printer-time.cassette.yaml @@ -0,0 +1,3 @@ +--- +version: 2 +interactions: [] diff --git a/core/testdata/test-json-printer-time.golden b/core/testdata/test-json-printer-time.golden new file mode 100644 index 0000000000..37eb79109a --- /dev/null +++ b/core/testdata/test-json-printer-time.golden @@ -0,0 +1,5 @@ +🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲 +🟩🟩🟩 STDOUT️ 🟩🟩🟩️ +"2026-11-03T12:00:00Z" +🟩🟩🟩 JSON STDOUT 🟩🟩🟩 +"2026-11-03T12:00:00Z" diff --git a/core/testdata/test-json-printer-union-marker.cassette.yaml b/core/testdata/test-json-printer-union-marker.cassette.yaml new file mode 100644 index 0000000000..2797c38e00 --- /dev/null +++ b/core/testdata/test-json-printer-union-marker.cassette.yaml @@ -0,0 +1,3 @@ +--- +version: 2 +interactions: [] diff --git a/core/testdata/test-json-printer-union-marker.golden b/core/testdata/test-json-printer-union-marker.golden new file mode 100644 index 0000000000..4572de446d --- /dev/null +++ b/core/testdata/test-json-printer-union-marker.golden @@ -0,0 +1,8 @@ +🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲 +🟩🟩🟩 STDOUT️ 🟩🟩🟩️ +{"id":"111111111","load_balancer":{}} +🟩🟩🟩 JSON STDOUT 🟩🟩🟩 +{ + "id": "111111111", + "load_balancer": {} +} diff --git a/internal/namespaces/baremetal/v1/testdata/test-baremetal-get-offer-simple.golden b/internal/namespaces/baremetal/v1/testdata/test-baremetal-get-offer-simple.golden index 0d579226fb..069d0b34f8 100644 --- a/internal/namespaces/baremetal/v1/testdata/test-baremetal-get-offer-simple.golden +++ b/internal/namespaces/baremetal/v1/testdata/test-baremetal-get-offer-simple.golden @@ -149,7 +149,8 @@ PrivateBandwidth(Mbit/s): "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -178,7 +179,8 @@ PrivateBandwidth(Mbit/s): "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "cd4158d7-2d65-49be-8803-c4b8ab6f760c", diff --git a/internal/namespaces/baremetal/v1/testdata/test-baremetal-list-offer-simple.golden b/internal/namespaces/baremetal/v1/testdata/test-baremetal-list-offer-simple.golden index c67454578a..7393db2503 100644 --- a/internal/namespaces/baremetal/v1/testdata/test-baremetal-list-offer-simple.golden +++ b/internal/namespaces/baremetal/v1/testdata/test-baremetal-list-offer-simple.golden @@ -160,7 +160,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} } ], "private_bandwidth": 1000000000, @@ -355,7 +356,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -400,7 +402,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "9ce714f1-ed03-4e3b-8c69-d46957ab0ebb", @@ -546,7 +549,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -607,7 +611,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} } ], "private_bandwidth": 1000000000, @@ -733,7 +738,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} } ], "private_bandwidth": 1000000000, @@ -933,7 +939,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "f74a6322-070e-41dd-a13f-8165ea63aca8", @@ -1054,7 +1061,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "31f78309-e6e0-4005-99b3-b3de3958ca7d", @@ -1067,7 +1075,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -1279,7 +1288,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "31f5cddb-8217-4eb0-ac6a-96dbcb080b88", @@ -1388,7 +1398,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -1639,7 +1650,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -1668,7 +1680,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -1903,7 +1916,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "31f78309-e6e0-4005-99b3-b3de3958ca7d", @@ -1916,7 +1930,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -2064,7 +2079,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "e0063872-115b-413e-bbf9-fff7eeca1065", @@ -2109,7 +2125,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -2367,7 +2384,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -2428,7 +2446,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "cd4158d7-2d65-49be-8803-c4b8ab6f760c", @@ -2667,7 +2686,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "31f78309-e6e0-4005-99b3-b3de3958ca7d", @@ -2680,7 +2700,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -2812,7 +2833,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "4b5723e9-5dcc-42e9-afbb-7ee556027051", @@ -2857,7 +2879,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "b37af8cf-8b18-4349-a063-64e9c3d50124", @@ -3203,7 +3226,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "31f78309-e6e0-4005-99b3-b3de3958ca7d", @@ -3216,7 +3240,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -3417,7 +3442,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -3462,7 +3488,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -3717,7 +3744,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -3794,7 +3822,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "4b5723e9-5dcc-42e9-afbb-7ee556027051", @@ -3991,7 +4020,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -4148,7 +4178,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} } ], "private_bandwidth": 10000000000, @@ -4286,7 +4317,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -4443,7 +4475,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "f74a6322-070e-41dd-a13f-8165ea63aca8", @@ -4607,7 +4640,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -4716,7 +4750,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "4b5723e9-5dcc-42e9-afbb-7ee556027051", @@ -4854,7 +4889,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -4899,7 +4935,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "a905e3e8-690a-4822-9c90-21418a44aa76", @@ -5255,7 +5292,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "b37af8cf-8b18-4349-a063-64e9c3d50124", @@ -5316,7 +5354,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -5566,7 +5605,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "931df052-d713-4674-8b58-96a63244c8e2", @@ -5579,7 +5619,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -5775,7 +5816,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "cd4158d7-2d65-49be-8803-c4b8ab6f760c", @@ -5900,7 +5942,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -6096,7 +6139,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "4b5723e9-5dcc-42e9-afbb-7ee556027051", @@ -6221,7 +6265,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -6508,7 +6553,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "b92d36c0-9754-4678-9efd-096e4244e798", @@ -6585,7 +6631,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -6827,7 +6874,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "b92d36c0-9754-4678-9efd-096e4244e798", @@ -6888,7 +6936,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "b37af8cf-8b18-4349-a063-64e9c3d50124", @@ -7098,7 +7147,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "a905e3e8-690a-4822-9c90-21418a44aa76", @@ -7337,7 +7387,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "31f5cddb-8217-4eb0-ac6a-96dbcb080b88", @@ -7398,7 +7449,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -7637,7 +7689,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "b37af8cf-8b18-4349-a063-64e9c3d50124", @@ -7682,7 +7735,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "9e3498b1-45ef-4c55-b699-efd66d658cca", @@ -8133,7 +8187,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "c498071f-4f8d-49f3-bc52-afc219a48fe0", @@ -8388,7 +8443,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "83a8fb91-47b4-4c20-82f9-84c31d79bfd8", @@ -8497,7 +8553,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "b92d36c0-9754-4678-9efd-096e4244e798", @@ -8761,7 +8818,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "e0063872-115b-413e-bbf9-fff7eeca1065", @@ -9160,7 +9218,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "f74a6322-070e-41dd-a13f-8165ea63aca8", @@ -9237,7 +9296,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} } ], "private_bandwidth": 25000000000, @@ -9445,7 +9505,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "f42a040b-6c91-4b11-beb0-b0b21e641fda", @@ -9602,7 +9663,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} } ], "private_bandwidth": 25000000000, @@ -9770,7 +9832,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "b92d36c0-9754-4678-9efd-096e4244e798", @@ -10033,7 +10096,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": true, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "remote_access": {} }, { "id": "4ce8bd16-0c16-479d-83bb-492b5f9072fa", @@ -10206,7 +10270,8 @@ c0069aba-31a5-401d-9bdb-58bcdd7859e6 EM-L620E-NVME empty 4 1 "nanos": 0 }, "manageable": false, - "os_id": "00000000-0000-0000-0000-000000000000" + "os_id": "00000000-0000-0000-0000-000000000000", + "certification": {} }, { "id": "ad1b86f2-4ae4-49f9-a826-a782e8d492f3", diff --git a/internal/namespaces/container/v1/testdata/test-create-container-simple.golden b/internal/namespaces/container/v1/testdata/test-create-container-simple.golden index 49e0d3900b..686c53ff76 100644 --- a/internal/namespaces/container/v1/testdata/test-create-container-simple.golden +++ b/internal/namespaces/container/v1/testdata/test-create-container-simple.golden @@ -58,7 +58,8 @@ Region fr-par "liveness_probe": { "failure_threshold": 30, "interval": "10.000000000s", - "timeout": "1.000000000s" + "timeout": "1.000000000s", + "tcp": {} }, "startup_probe": null, "tags": [], diff --git a/internal/namespaces/container/v1/testdata/test-update-container-registry-image.golden b/internal/namespaces/container/v1/testdata/test-update-container-registry-image.golden index be6b291bfa..fe97599754 100644 --- a/internal/namespaces/container/v1/testdata/test-update-container-registry-image.golden +++ b/internal/namespaces/container/v1/testdata/test-update-container-registry-image.golden @@ -59,7 +59,8 @@ Region fr-par "liveness_probe": { "failure_threshold": 30, "interval": "10.000000000s", - "timeout": "1.000000000s" + "timeout": "1.000000000s", + "tcp": {} }, "startup_probe": null, "tags": [], diff --git a/internal/namespaces/container/v1/testdata/test-update-container-simple.golden b/internal/namespaces/container/v1/testdata/test-update-container-simple.golden index f13d2f5a63..22feb4a881 100644 --- a/internal/namespaces/container/v1/testdata/test-update-container-simple.golden +++ b/internal/namespaces/container/v1/testdata/test-update-container-simple.golden @@ -59,7 +59,8 @@ Region fr-par "liveness_probe": { "failure_threshold": 30, "interval": "10.000000000s", - "timeout": "1.000000000s" + "timeout": "1.000000000s", + "tcp": {} }, "startup_probe": null, "tags": [ diff --git a/internal/namespaces/inference/v1/testdata/test-create-deployment-private-endpoint-create-deployment-private-endpoint.golden b/internal/namespaces/inference/v1/testdata/test-create-deployment-private-endpoint-create-deployment-private-endpoint.golden index 087183cd65..f550236d0d 100644 --- a/internal/namespaces/inference/v1/testdata/test-create-deployment-private-endpoint-create-deployment-private-endpoint.golden +++ b/internal/namespaces/inference/v1/testdata/test-create-deployment-private-endpoint-create-deployment-private-endpoint.golden @@ -30,6 +30,7 @@ e1eef3b8-3ee9-4b4c-9a11-d56e1df8bb39 https://896af1ed-836c-40e2-94e7-f563b78024 { "id": "d0fb99b1-0018-4025-aa46-62dce0f3bc78", "url": "https://896af1ed-836c-40e2-94e7-f563b7802466.ifr.fr-par.scaleway.com", + "public_network": {}, "disable_auth": false }, { diff --git a/internal/namespaces/inference/v1/testdata/test-deployment-create-deployment-with-wait-flag.golden b/internal/namespaces/inference/v1/testdata/test-deployment-create-deployment-with-wait-flag.golden index 617da6d063..645b0b1165 100644 --- a/internal/namespaces/inference/v1/testdata/test-deployment-create-deployment-with-wait-flag.golden +++ b/internal/namespaces/inference/v1/testdata/test-deployment-create-deployment-with-wait-flag.golden @@ -31,6 +31,7 @@ afe74bcb-384e-4db0-9292-838ea75d3d59 https://85d5ddd1-c199-4373-8258-28d81e6a8a { "id": "afe74bcb-384e-4db0-9292-838ea75d3d59", "url": "https://85d5ddd1-c199-4373-8258-28d81e6a8ab0.ifr.fr-par.scaleway.com", + "public_network": {}, "disable_auth": false } ], diff --git a/internal/namespaces/inference/v1/testdata/test-deployment-create-simple-deployment.golden b/internal/namespaces/inference/v1/testdata/test-deployment-create-simple-deployment.golden index 36369b91db..09a1dcdeaa 100644 --- a/internal/namespaces/inference/v1/testdata/test-deployment-create-simple-deployment.golden +++ b/internal/namespaces/inference/v1/testdata/test-deployment-create-simple-deployment.golden @@ -29,6 +29,7 @@ ID URL { "id": "79319256-5e07-4b5a-8c08-b81f1c585b26", "url": "https://956f2366-8cf5-439a-9dbc-5a0ee3036465.ifr.fr-par.scaleway.com", + "public_network": {}, "disable_auth": false } ], diff --git a/internal/namespaces/mcp/server/mcp_resources.go b/internal/namespaces/mcp/server/mcp_resources.go index 4a1449a0ff..90f6157d3f 100644 --- a/internal/namespaces/mcp/server/mcp_resources.go +++ b/internal/namespaces/mcp/server/mcp_resources.go @@ -190,7 +190,11 @@ func (cr *CommandResource) Execute( // Format the result var resultStr string if result != nil { - if data, err := json.Marshal(result, jsontext.WithIndent(" ")); err == nil { + if data, err := json.Marshal( + result, + core.OmitEmptyLegacy, + jsontext.WithIndent(" "), + ); err == nil { resultStr = string(data) } else { resultStr = fmt.Sprintf("%v", result) diff --git a/internal/namespaces/mcp/server/mcp_tools.go b/internal/namespaces/mcp/server/mcp_tools.go index da63ae3c1e..134baea576 100644 --- a/internal/namespaces/mcp/server/mcp_tools.go +++ b/internal/namespaces/mcp/server/mcp_tools.go @@ -231,7 +231,11 @@ func (ct *CommandTool) Execute( result = reflect.MakeSlice(v.Type(), 0, 0).Interface() } - if data, err := json.Marshal(result, jsontext.WithIndent(" ")); err == nil { + if data, err := json.Marshal( + result, + core.OmitEmptyLegacy, + jsontext.WithIndent(" "), + ); err == nil { resultStr = string(data) } else { resultStr = fmt.Sprintf("%v", result) diff --git a/internal/namespaces/rdb/v1/testdata/test-clone-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-clone-instance-simple.golden index b319698c3b..d017129a6c 100644 --- a/internal/namespaces/rdb/v1/testdata/test-clone-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-clone-instance-simple.golden @@ -62,7 +62,8 @@ work_mem 4 "id": "cabf3e8b-60d6-4e0a-ad86-9649f58056fb", "ip": "51.159.114.202", "port": 23659, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -107,7 +108,8 @@ work_mem 4 "id": "cabf3e8b-60d6-4e0a-ad86-9649f58056fb", "ip": "51.159.114.202", "port": 23659, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-ipam-private-endpoint.golden b/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-ipam-private-endpoint.golden index fd93af1f65..18e7c9fb3c 100644 --- a/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-ipam-private-endpoint.golden +++ b/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-ipam-private-endpoint.golden @@ -72,7 +72,8 @@ Password: "id": "02229f84-eb4c-4ba6-a94a-f8f07131ae21", "ip": "195.154.70.203", "port": 4837, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -129,7 +130,8 @@ Password: "id": "02229f84-eb4c-4ba6-a94a-f8f07131ae21", "ip": "195.154.70.203", "port": 4837, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-static-private-endpoint.golden b/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-static-private-endpoint.golden index 8a754c54ea..7ae449fe7c 100644 --- a/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-static-private-endpoint.golden +++ b/internal/namespaces/rdb/v1/testdata/test-create-instance-init-endpoints-with-public-and-static-private-endpoint.golden @@ -72,7 +72,8 @@ Password: "id": "efc7ca3b-9f17-41cc-9cdf-bebb5415748d", "ip": "51.159.8.181", "port": 14800, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -129,7 +130,8 @@ Password: "id": "efc7ca3b-9f17-41cc-9cdf-bebb5415748d", "ip": "51.159.8.181", "port": 14800, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-create-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-create-instance-simple.golden index fe8c73a925..2b6e2ebb10 100644 --- a/internal/namespaces/rdb/v1/testdata/test-create-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-create-instance-simple.golden @@ -65,7 +65,8 @@ Password: "id": "4e6e7f82-a155-43c6-a364-925b6413e7c3", "ip": "195.154.71.12", "port": 6467, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -110,7 +111,8 @@ Password: "id": "4e6e7f82-a155-43c6-a364-925b6413e7c3", "ip": "195.154.71.12", "port": 6467, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-ipam.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-ipam.golden index 43d97270e2..9394d1895e 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-ipam.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-ipam.golden @@ -11,7 +11,8 @@ b15296de-3c6a-4f83-afcc-11b624ec5ffd 172.16.0.2 5432 - - "id": "424247b7-0231-43c5-89e5-9f8f1abc9447", "ip": "51.159.114.202", "port": 23524, - "name": null + "name": null, + "load_balancer": {} }, { "id": "b15296de-3c6a-4f83-afcc-11b624ec5ffd", diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-static.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-static.golden index 32069be5ce..8660ab3a07 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-static.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-private-static.golden @@ -11,7 +11,8 @@ e609c33d-72a5-4d32-89a2-3706fba74fec 172.16.0.3 5432 - - "id": "af6a39da-94fe-462f-81d3-ba36dae53b8c", "ip": "195.154.71.12", "port": 7212, - "name": null + "name": null, + "load_balancer": {} }, { "id": "e609c33d-72a5-4d32-89a2-3706fba74fec", diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-public.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-public.golden index 0464387afe..b9f24ad95c 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-create-public.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-create-public.golden @@ -23,7 +23,8 @@ ID IP PORT NAME HOSTNAME "id": "9f32c59c-cc84-4d57-9d23-0c1a639af825", "ip": "195.154.69.50", "port": 28739, - "name": null + "name": null, + "load_balancer": {} } ], "Success": { diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-get-public.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-get-public.golden index 315b73a6df..0cbfe51e6d 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-get-public.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-get-public.golden @@ -8,5 +8,6 @@ Port 17183 "id": "563846c5-a0f3-4710-85b0-9a6f3d6a4e18", "ip": "195.154.71.12", "port": 17183, - "name": null + "name": null, + "load_balancer": {} } diff --git a/internal/namespaces/rdb/v1/testdata/test-endpoint-list-multiple-endpoints.golden b/internal/namespaces/rdb/v1/testdata/test-endpoint-list-multiple-endpoints.golden index 5ea69ef512..e287f7df2f 100644 --- a/internal/namespaces/rdb/v1/testdata/test-endpoint-list-multiple-endpoints.golden +++ b/internal/namespaces/rdb/v1/testdata/test-endpoint-list-multiple-endpoints.golden @@ -21,6 +21,7 @@ ab06a941-0824-4b06-8f9c-1645a1de755f 172.16.0.3 5432 - - "id": "23857e88-0019-4b3f-98d5-8cd64090109f", "ip": "195.154.71.12", "port": 21923, - "name": null + "name": null, + "load_balancer": {} } ] diff --git a/internal/namespaces/rdb/v1/testdata/test-get-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-get-instance-simple.golden index 73e8369c82..a23f29ae88 100644 --- a/internal/namespaces/rdb/v1/testdata/test-get-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-get-instance-simple.golden @@ -66,7 +66,8 @@ IP PROTOCOL DIRECTION ACTION DESCRIPTION PORT "id": "737d3510-55ac-475d-9adc-ab0ddc56a9f6", "ip": "51.159.8.181", "port": 27851, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -111,7 +112,8 @@ IP PROTOCOL DIRECTION ACTION DESCRIPTION PORT "id": "737d3510-55ac-475d-9adc-ab0ddc56a9f6", "ip": "51.159.8.181", "port": 27851, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-list-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-list-instance-simple.golden index 3c5be133a7..8d483c780b 100644 --- a/internal/namespaces/rdb/v1/testdata/test-list-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-list-instance-simple.golden @@ -23,7 +23,8 @@ c71b4866-d96c-453e-919a-687f7cd1b350 cli-test db-dev-s ready PostgreSQL-15 "id": "56e0207e-7ed1-486a-a5ac-f3d23ce91bda", "ip": "195.154.71.12", "port": 21189, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -68,7 +69,8 @@ c71b4866-d96c-453e-919a-687f7cd1b350 cli-test db-dev-s ready PostgreSQL-15 "id": "56e0207e-7ed1-486a-a5ac-f3d23ce91bda", "ip": "195.154.71.12", "port": 21189, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-modify-default-work-mem-from4-to8mb.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-modify-default-work-mem-from4-to8mb.golden index 7cd7835b44..54dfe6fd09 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-modify-default-work-mem-from4-to8mb.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-modify-default-work-mem-from4-to8mb.golden @@ -62,7 +62,8 @@ work_mem 8 "id": "8834804a-b146-4719-8d0d-de6c114ee328", "ip": "51.159.74.117", "port": 5417, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -107,7 +108,8 @@ work_mem 8 "id": "8834804a-b146-4719-8d0d-de6c114ee328", "ip": "51.159.74.117", "port": 5417, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-modify3-settings+-add-a-new-one.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-modify3-settings+-add-a-new-one.golden index 8682f4a4f3..3c2e46173e 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-modify3-settings+-add-a-new-one.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-modify3-settings+-add-a-new-one.golden @@ -62,7 +62,8 @@ work_mem 16 "id": "e1e87bb7-3e2f-4d36-ab2f-5d74a0e8672d", "ip": "195.154.69.220", "port": 12333, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -107,7 +108,8 @@ work_mem 16 "id": "e1e87bb7-3e2f-4d36-ab2f-5d74a0e8672d", "ip": "195.154.69.220", "port": 12333, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-set-a-timezone.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-set-a-timezone.golden index 7f35ac35a0..7860a8ed40 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-set-a-timezone.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-set-a-timezone.golden @@ -63,7 +63,8 @@ work_mem 4 "id": "65012218-d264-479f-9bbc-c2974b7bd257", "ip": "51.159.8.181", "port": 19874, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -112,7 +113,8 @@ work_mem 4 "id": "65012218-d264-479f-9bbc-c2974b7bd257", "ip": "51.159.8.181", "port": 19874, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-name.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-name.golden index 2920228470..c0287cb100 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-name.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-name.golden @@ -62,7 +62,8 @@ work_mem 4 "id": "c1419b65-cb75-4dee-8160-8ca0a7212318", "ip": "195.154.69.220", "port": 10635, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -107,7 +108,8 @@ work_mem 4 "id": "c1419b65-cb75-4dee-8160-8ca0a7212318", "ip": "195.154.69.220", "port": 10635, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-tags.golden b/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-tags.golden index eb9bed5190..d54f5faba1 100644 --- a/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-tags.golden +++ b/internal/namespaces/rdb/v1/testdata/test-update-instance-update-instance-tags.golden @@ -63,7 +63,8 @@ work_mem 4 "id": "67f04d0a-5b9e-4bc2-8346-7f271b34d12b", "ip": "51.159.74.117", "port": 11119, - "name": null + "name": null, + "load_balancer": {} }, "tags": [ "a" @@ -110,7 +111,8 @@ work_mem 4 "id": "67f04d0a-5b9e-4bc2-8346-7f271b34d12b", "ip": "51.159.74.117", "port": 11119, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/rdb/v1/testdata/test-upgrade-instance-simple.golden b/internal/namespaces/rdb/v1/testdata/test-upgrade-instance-simple.golden index 93cbb9b4a9..99f3788204 100644 --- a/internal/namespaces/rdb/v1/testdata/test-upgrade-instance-simple.golden +++ b/internal/namespaces/rdb/v1/testdata/test-upgrade-instance-simple.golden @@ -62,7 +62,8 @@ work_mem 4 "id": "2684cb6f-6aa4-497b-8b93-216d4f4e0339", "ip": "195.154.75.244", "port": 18952, - "name": null + "name": null, + "load_balancer": {} }, "tags": [], "settings": [ @@ -107,7 +108,8 @@ work_mem 4 "id": "2684cb6f-6aa4-497b-8b93-216d4f4e0339", "ip": "195.154.75.244", "port": 18952, - "name": null + "name": null, + "load_balancer": {} } ], "logs_policy": { diff --git a/internal/namespaces/redis/v1/testdata/test-endpoints-single-public-endpoint.golden b/internal/namespaces/redis/v1/testdata/test-endpoints-single-public-endpoint.golden index 1537d2cdc4..e7e72e81c0 100644 --- a/internal/namespaces/redis/v1/testdata/test-endpoints-single-public-endpoint.golden +++ b/internal/namespaces/redis/v1/testdata/test-endpoints-single-public-endpoint.golden @@ -30,6 +30,7 @@ ID IP CIDR DESCRIPTION "endpoints": [ { "port": 6379, + "public_network": {}, "ips": [ "78.232.49.55" ],