Skip to content

Commit 0d68823

Browse files
Fix byte array encoding to yaml add a test to validate. (#485)
1 parent d7f9eb9 commit 0d68823

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

src/KubernetesClient/Yaml.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,42 @@ namespace k8s
1818
/// </summary>
1919
public static class Yaml
2020
{
21+
public class ByteArrayStringYamlConverter : IYamlTypeConverter
22+
{
23+
public bool Accepts(Type type)
24+
{
25+
return type == typeof(System.Byte[]);
26+
}
27+
28+
public object ReadYaml(IParser parser, Type type)
29+
{
30+
if (parser.Current is YamlDotNet.Core.Events.Scalar scalar)
31+
{
32+
try
33+
{
34+
if (string.IsNullOrEmpty(scalar.Value))
35+
{
36+
return null;
37+
}
38+
39+
return Encoding.UTF8.GetBytes(scalar.Value);
40+
}
41+
finally
42+
{
43+
parser.MoveNext();
44+
}
45+
}
46+
47+
throw new InvalidOperationException(parser.Current?.ToString());
48+
}
49+
50+
public void WriteYaml(IEmitter emitter, object value, Type type)
51+
{
52+
var obj = (System.Byte[])value;
53+
emitter.Emit(new YamlDotNet.Core.Events.Scalar(Encoding.UTF8.GetString(obj)));
54+
}
55+
}
56+
2157
/// <summary>
2258
/// Load a collection of objects from a stream asynchronously
2359
/// </summary>
@@ -65,6 +101,7 @@ public static List<object> LoadAllFromString(String content, Dictionary<String,
65101
.WithNamingConvention(new CamelCaseNamingConvention())
66102
.WithTypeInspector(ti => new AutoRestTypeInspector(ti))
67103
.WithTypeConverter(new IntOrStringYamlConverter())
104+
.WithTypeConverter(new ByteArrayStringYamlConverter())
68105
.IgnoreUnmatchedProperties()
69106
.Build();
70107
var types = new List<Type>();
@@ -81,6 +118,7 @@ public static List<object> LoadAllFromString(String content, Dictionary<String,
81118
.WithNamingConvention(new CamelCaseNamingConvention())
82119
.WithTypeInspector(ti => new AutoRestTypeInspector(ti))
83120
.WithTypeConverter(new IntOrStringYamlConverter())
121+
.WithTypeConverter(new ByteArrayStringYamlConverter())
84122
.Build();
85123
parser = new Parser(new StringReader(content));
86124
parser.Expect<StreamStart>();
@@ -118,6 +156,7 @@ public static T LoadFromString<T>(string content)
118156
.WithNamingConvention(new CamelCaseNamingConvention())
119157
.WithTypeInspector(ti => new AutoRestTypeInspector(ti))
120158
.WithTypeConverter(new IntOrStringYamlConverter())
159+
.WithTypeConverter(new ByteArrayStringYamlConverter())
121160
.Build();
122161
var obj = deserializer.Deserialize<T>(content);
123162
return obj;
@@ -135,6 +174,7 @@ public static string SaveToString<T>(T value)
135174
.WithNamingConvention(new CamelCaseNamingConvention())
136175
.WithTypeInspector(ti => new AutoRestTypeInspector(ti))
137176
.WithTypeConverter(new IntOrStringYamlConverter())
177+
.WithTypeConverter(new ByteArrayStringYamlConverter())
138178
.WithEventEmitter(e => new StringQuotingEmitter(e))
139179
.BuildValueSerializer();
140180
emitter.Emit(new StreamStart());

tests/KubernetesClient.Tests/YamlTests.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Linq;
5-
using k8s;
5+
using System.Text;
66
using k8s.Models;
77
using Xunit;
88

@@ -321,5 +321,23 @@ public void QuotedValuesShouldRemainQuotedAfterSerialization()
321321
var objStr = Yaml.SaveToString(obj);
322322
Assert.Equal(content, objStr);
323323
}
324+
325+
[Fact]
326+
public void LoadSecret()
327+
{
328+
string kManifest = @"
329+
apiVersion: v1
330+
kind: Secret
331+
metadata:
332+
name: test-secret
333+
data:
334+
username: bXktYXBw
335+
password: Mzk1MjgkdmRnN0pi
336+
";
337+
338+
var result = Yaml.LoadFromString<V1Secret>(kManifest);
339+
Assert.Equal(Encoding.UTF8.GetString(result.Data["username"]), "bXktYXBw");
340+
Assert.Equal(Encoding.UTF8.GetString(result.Data["password"]), "Mzk1MjgkdmRnN0pi");
341+
}
324342
}
325343
}

0 commit comments

Comments
 (0)