diff --git a/src/KubernetesClient.Models/ResourceQuantity.cs b/src/KubernetesClient.Models/ResourceQuantity.cs index 757acef..2d1a489 100644 --- a/src/KubernetesClient.Models/ResourceQuantity.cs +++ b/src/KubernetesClient.Models/ResourceQuantity.cs @@ -99,7 +99,7 @@ namespace k8s.Models protected bool Equals(ResourceQuantity other) { - return Format == other?.Format && _unitlessValue.Equals(other._unitlessValue); + return _unitlessValue.Equals(other?._unitlessValue); } public override bool Equals(object obj) diff --git a/src/KubernetesClient.Models/ResourceQuantityJsonConverter.cs b/src/KubernetesClient.Models/ResourceQuantityJsonConverter.cs index 3d64f48..6132086 100644 --- a/src/KubernetesClient.Models/ResourceQuantityJsonConverter.cs +++ b/src/KubernetesClient.Models/ResourceQuantityJsonConverter.cs @@ -2,9 +2,23 @@ namespace k8s.Models { internal sealed class ResourceQuantityJsonConverter : JsonConverter { + // https://github.com/kubernetes/apimachinery/blob/4b14f804a0babdcc58e695d72f77ad29f536511e/pkg/api/resource/quantity.go#L683 public override ResourceQuantity Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - return new ResourceQuantity(reader.GetString()); + switch (reader.TokenType) + { + case JsonTokenType.Null: + return new ResourceQuantity(null); + case JsonTokenType.Number: + if (reader.TryGetDouble(out var val)) + { + return new ResourceQuantity(Convert.ToString(val)); + } + + return reader.GetDecimal(); + default: + return new ResourceQuantity(reader.GetString()); + } } public override void Write(Utf8JsonWriter writer, ResourceQuantity value, JsonSerializerOptions options) diff --git a/tests/KubernetesClient.Tests/QuantityValueTests.cs b/tests/KubernetesClient.Tests/QuantityValueTests.cs index ede6ce7..752fa60 100644 --- a/tests/KubernetesClient.Tests/QuantityValueTests.cs +++ b/tests/KubernetesClient.Tests/QuantityValueTests.cs @@ -1,5 +1,6 @@ using k8s.Models; using System; +using System.Collections.Generic; using Xunit; using static k8s.Models.ResourceQuantity.SuffixFormat; @@ -200,7 +201,7 @@ namespace k8s.Tests } [Fact] - public void Serialize() + public void SerializeJson() { { ResourceQuantity quantity = 12000; @@ -209,10 +210,25 @@ namespace k8s.Tests } [Fact] - public void DeserializeYaml() + public void DeserializeJson() { - var value = KubernetesYaml.Deserialize("\"1\""); - Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value); + // str + { + var value = KubernetesJson.Deserialize>(@"{""cpu"": ""1.1""}"); + Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value["cpu"]); + } + + // int + { + var value = KubernetesJson.Deserialize>(@"{""cpu"": 1}"); + Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value["cpu"]); + } + + // double + { + var value = KubernetesJson.Deserialize>(@"{""cpu"": 1.1}"); + Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value["cpu"]); + } } [Fact] @@ -221,5 +237,27 @@ namespace k8s.Tests var value = KubernetesYaml.Serialize(new ResourceQuantity(1, -1, DecimalSI)); Assert.Equal("100m", value); } + + [Fact] + public void DeserializeYaml() + { + // str + { + var value = KubernetesYaml.Deserialize("\"1\""); + Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value); + } + + // int + { + var value = KubernetesYaml.Deserialize("1"); + Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value); + } + + // double + { + var value = KubernetesYaml.Deserialize("1.1"); + Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value); + } + } } }