Skip to content

Commit 8016b6c

Browse files
Merge pull request #47 from tg123/objorstatus
better way to #46
2 parents b370b92 + 00f7426 commit 8016b6c

File tree

4 files changed

+162
-31
lines changed

4 files changed

+162
-31
lines changed

examples/namespace/Namespace.cs

+38-31
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
namespace simple
2-
{
3-
using System;
4-
using System.IO;
5-
using System.Net;
6-
using System.Threading.Tasks;
7-
using k8s;
8-
using k8s.Models;
1+
using System;
2+
using System.Net;
3+
using System.Threading.Tasks;
4+
using k8s;
5+
using k8s.Models;
96

7+
namespace @namespace
8+
{
109
class NamespaceExample
1110
{
1211
static void ListNamespaces(IKubernetes client) {
13-
var listTask = client.ListNamespaceWithHttpMessagesAsync().Result;
14-
var list = listTask.Body;
12+
var list = client.ListNamespace();
1513
foreach (var item in list.Items) {
1614
Console.WriteLine(item.Metadata.Name);
1715
}
@@ -20,13 +18,12 @@ static void ListNamespaces(IKubernetes client) {
2018
}
2119
}
2220

23-
static async Task asyncAwaitDelete(IKubernetes client, string name, int delayMillis) {
21+
static async Task DeleteAsync(IKubernetes client, string name, int delayMillis) {
2422
while (true) {
2523
await Task.Delay(delayMillis);
26-
try {
27-
var result = await client.ReadNamespaceWithHttpMessagesAsync(name);
28-
var ns = result.Body;
29-
Console.WriteLine(ns);
24+
try
25+
{
26+
await client.ReadNamespaceAsync(name);
3027
} catch (AggregateException ex) {
3128
foreach (var innerEx in ex.InnerExceptions) {
3229
if (innerEx is Microsoft.Rest.HttpOperationException) {
@@ -46,34 +43,44 @@ static async Task asyncAwaitDelete(IKubernetes client, string name, int delayMil
4643
}
4744
}
4845

49-
static void awaitDelete(IKubernetes client, string name, int delayMillis) {
50-
asyncAwaitDelete(client, name, delayMillis).Wait();
46+
static void Delete(IKubernetes client, string name, int delayMillis) {
47+
DeleteAsync(client, name, delayMillis).Wait();
5148
}
5249

53-
static void Main(string[] args)
50+
private static void Main(string[] args)
5451
{
55-
var k8sClientConfig = KubernetesClientConfiguration.BuildConfigFromConfigFile();
56-
IKubernetes client = new Kubernetes(k8sClientConfig);
52+
var k8SClientConfig = KubernetesClientConfiguration.BuildConfigFromConfigFile();
53+
IKubernetes client = new Kubernetes(k8SClientConfig);
5754

5855
ListNamespaces(client);
5956

60-
var ns = new Corev1Namespace();
61-
ns.Metadata = new V1ObjectMeta();
62-
ns.Metadata.Name = "test";
57+
var ns = new Corev1Namespace
58+
{
59+
Metadata = new V1ObjectMeta
60+
{
61+
Name = "test"
62+
}
63+
};
6364

64-
var result = client.CreateNamespaceWithHttpMessagesAsync(ns).Result;
65+
var result = client.CreateNamespace(ns);
6566
Console.WriteLine(result);
6667

6768
ListNamespaces(client);
6869

69-
var task = client.DeleteNamespaceWithHttpMessagesAsync(new V1DeleteOptions(), ns.Metadata.Name);
70-
var obj = ObjectOrStatus<Corev1Namespace>.ReadObjectOrStatus(task);
71-
72-
if (obj.Status != null) {
73-
Console.WriteLine(obj.Status);
74-
} else {
75-
awaitDelete(client, ns.Metadata.Name, 3 * 1000);
70+
var status = client.DeleteNamespace(new V1DeleteOptions(), ns.Metadata.Name);
71+
72+
if (status.HasObject)
73+
{
74+
var obj = status.ObjectView<Corev1Namespace>();
75+
Console.WriteLine(obj.Status.Phase);
76+
77+
Delete(client, ns.Metadata.Name, 3 * 1000);
7678
}
79+
else
80+
{
81+
Console.WriteLine(status.Message);
82+
}
83+
7784
ListNamespaces(client);
7885
}
7986
}

src/Kubernetes.Auth.cs

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using k8s.Models;
2+
13
namespace k8s
24
{
35
using System;
@@ -46,6 +48,8 @@ public Kubernetes(KubernetesClientConfiguration config)
4648
// set credentails for the kubernernet client
4749
this.SetCredentials(config, handler);
4850
this.InitializeHttpClient(handler, new DelegatingHandler[]{new WatcherDelegatingHandler()});
51+
52+
DeserializationSettings.Converters.Add(new V1Status.V1StatusObjectViewConverter());
4953
}
5054

5155
private X509Certificate2 CaCert { get; set; }

src/V1Status.ObjectView.cs

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
using Newtonsoft.Json.Linq;
4+
5+
namespace k8s.Models
6+
{
7+
public partial class V1Status
8+
{
9+
internal class V1StatusObjectViewConverter : JsonConverter
10+
{
11+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
12+
{
13+
serializer.Serialize(writer, value);
14+
}
15+
16+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
17+
JsonSerializer serializer)
18+
{
19+
var obj = JToken.Load(reader);
20+
21+
try
22+
{
23+
return obj.ToObject(objectType);
24+
}
25+
catch (JsonException)
26+
{
27+
// should be an object
28+
}
29+
30+
return new V1Status
31+
{
32+
_original = obj,
33+
HasObject = true
34+
};
35+
}
36+
37+
public override bool CanConvert(Type objectType)
38+
{
39+
return typeof(V1Status) == objectType;
40+
}
41+
}
42+
43+
private JToken _original;
44+
45+
public bool HasObject { get; private set; }
46+
47+
public T ObjectView<T>()
48+
{
49+
return _original.ToObject<T>();
50+
}
51+
}
52+
}

tests/V1StatusObjectViewTests.cs

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using k8s.Models;
2+
using k8s.Tests.Mock;
3+
using Newtonsoft.Json;
4+
using Xunit;
5+
6+
namespace k8s.Tests
7+
{
8+
public class V1StatusObjectViewTests
9+
{
10+
[Fact]
11+
public void TestReturnStatus()
12+
{
13+
var v1Status = new V1Status
14+
{
15+
Message = "test message",
16+
Status = "test status"
17+
};
18+
19+
using (var server = new MockKubeApiServer(resp: JsonConvert.SerializeObject(v1Status)))
20+
{
21+
var client = new Kubernetes(new KubernetesClientConfiguration
22+
{
23+
Host = server.Uri.ToString()
24+
});
25+
26+
var status = client.DeleteNamespace(new V1DeleteOptions(), "test");
27+
28+
Assert.False(status.HasObject);
29+
Assert.Equal(v1Status.Message, status.Message);
30+
Assert.Equal(v1Status.Status, status.Status);
31+
}
32+
}
33+
34+
[Fact]
35+
public void TestReturnObject()
36+
{
37+
var corev1Namespace = new Corev1Namespace()
38+
{
39+
Metadata = new V1ObjectMeta()
40+
{
41+
Name = "test name"
42+
},
43+
Status = new Corev1NamespaceStatus()
44+
{
45+
Phase = "test termating"
46+
}
47+
};
48+
49+
using (var server = new MockKubeApiServer(resp: JsonConvert.SerializeObject(corev1Namespace)))
50+
{
51+
var client = new Kubernetes(new KubernetesClientConfiguration
52+
{
53+
Host = server.Uri.ToString()
54+
});
55+
56+
var status = client.DeleteNamespace(new V1DeleteOptions(), "test");
57+
58+
Assert.True(status.HasObject);
59+
60+
var obj = status.ObjectView<Corev1Namespace>();
61+
62+
Assert.Equal(obj.Metadata.Name, corev1Namespace.Metadata.Name);
63+
Assert.Equal(obj.Status.Phase, corev1Namespace.Status.Phase);
64+
}
65+
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)