diff --git a/examples/watch/Program.cs b/examples/watch/Program.cs index 99da5a3..8b80922 100644 --- a/examples/watch/Program.cs +++ b/examples/watch/Program.cs @@ -1,18 +1,36 @@ using System; using System.Threading; +using System.Threading.Tasks; using k8s; using k8s.Models; +using Microsoft.Rest; namespace watch { internal class Program { - private static void Main(string[] args) + private async static Task Main(string[] args) { var config = KubernetesClientConfiguration.BuildConfigFromConfigFile(); IKubernetes client = new Kubernetes(config); + var podlistResp = client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true); + // C# 8 required https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/november/csharp-iterating-with-async-enumerables-in-csharp-8 + await foreach (var (type, item) in podlistResp.WatchAsync()) + { + Console.WriteLine("==on watch event=="); + Console.WriteLine(type); + Console.WriteLine(item.Metadata.Name); + Console.WriteLine("==on watch event=="); + } + + // uncomment if you prefer callback api + // WatchUsingCallback(client); + } + + private static void WatchUsingCallback(IKubernetes client) + { var podlistResp = client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true); using (podlistResp.Watch((type, item) => { diff --git a/src/KubernetesClient/WatcherExt.cs b/src/KubernetesClient/WatcherExt.cs index e162a20..bd49f58 100644 --- a/src/KubernetesClient/WatcherExt.cs +++ b/src/KubernetesClient/WatcherExt.cs @@ -66,6 +66,15 @@ namespace k8s return Watch(Task.FromResult(response), onEvent, onError, onClosed); } + /// + /// create an IAsyncEnumerable from a call to api server with watch=true + /// see https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/november/csharp-iterating-with-async-enumerables-in-csharp-8 + /// + /// type of the event object + /// type of the HttpOperationResponse object + /// the api response + /// a callbak when any exception was caught during watching + /// IAsyncEnumerable of watch events public static IAsyncEnumerable<(WatchEventType, T)> WatchAsync( this Task> responseTask, Action onError = null)