@@ -649,5 +649,104 @@ await client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true,
649
649
} ) . ConfigureAwait ( false ) ;
650
650
}
651
651
}
652
+
653
+ [ Fact ]
654
+ public async Task ContinueWatchingThroughInactivity ( )
655
+ {
656
+ try
657
+ {
658
+ var eventsReceived = new AsyncCountdownEvent ( 1 ) ;
659
+
660
+
661
+ var client = new Kubernetes ( KubernetesClientConfiguration . BuildConfigFromConfigFile ( ) ) ;
662
+
663
+ var listTask = await client . ListNamespacedPodWithHttpMessagesAsync ( "testns" , watch : true ) . ConfigureAwait ( false ) ;
664
+
665
+ var events = new HashSet < V1Pod > ( ) ;
666
+ var errors = 0 ;
667
+ var connclosed = 0 ;
668
+ var eventcount = 0 ;
669
+ var watcher = listTask . Watch < V1Pod , V1PodList > (
670
+ ( type , item ) =>
671
+ {
672
+ testOutput . WriteLine ( $ "Watcher received '{ type } ' event.") ;
673
+
674
+ events . Add ( item ) ;
675
+ eventsReceived . Signal ( ) ;
676
+ } ,
677
+ error =>
678
+ {
679
+ testOutput . WriteLine ( $ "Watcher received '{ error . GetType ( ) . FullName } ' error.") ;
680
+
681
+ errors += 1 ;
682
+ eventsReceived . Signal ( ) ;
683
+ } ,
684
+ ( ) =>
685
+ {
686
+ connclosed += 1 ;
687
+ } ) ;
688
+
689
+ var pod1 = GetTestPod ( "test1" ) ;
690
+ client . CreateNamespacedPod ( pod1 , "testns" ) ;
691
+
692
+ // wait server yields all events
693
+ await Task . WhenAny ( eventsReceived . WaitAsync ( ) , Task . Delay ( 3000 ) ) . ConfigureAwait ( false ) ;
694
+
695
+ // wait for some time to pass before generating another event
696
+ await Task . Delay ( TimeSpan . FromMinutes ( 2 ) ) . ConfigureAwait ( false ) ;
697
+
698
+ eventcount = events . Count ;
699
+
700
+ var pod2 = GetTestPod ( "test2" ) ;
701
+ client . CreateNamespacedPod ( pod2 , "testns" ) ;
702
+
703
+ // Allow 30 seconds for the event to come through
704
+ await Task . Delay ( TimeSpan . FromSeconds ( 30 ) ) . ConfigureAwait ( false ) ;
705
+
706
+ // validate that one new event has been recieved after a pause
707
+ Assert . True (
708
+ events . Count == ( eventcount + 1 ) ,
709
+ $ "No Events Were Received after Pause Event Count Is { eventcount } ") ;
710
+
711
+
712
+ Assert . Equal ( 1 , errors ) ;
713
+
714
+ Assert . True ( watcher . Watching ) ;
715
+ // cleanup after
716
+ client . DeleteNamespacedPod ( "test1" , "default" ) ;
717
+
718
+ client . DeleteNamespacedPod ( "test2" , "default" ) ;
719
+
720
+ }
721
+ catch ( Exception ex )
722
+ {
723
+ Debug . WriteLine ( ex . Message ) ;
724
+ }
725
+ }
726
+
727
+ private V1Pod GetTestPod ( string name )
728
+ {
729
+ var containerList = new List < V1Container > ( ) ;
730
+ containerList . Add ( new V1Container
731
+ {
732
+ Image = "busybox" ,
733
+ Name = "container" ,
734
+ } ) ;
735
+
736
+ return
737
+ new V1Pod
738
+ {
739
+ ApiVersion = "v1" ,
740
+ Kind = "Pod" ,
741
+ Spec = new V1PodSpec
742
+ {
743
+ Containers = containerList ,
744
+ } ,
745
+ Metadata = new V1ObjectMeta
746
+ {
747
+ Name = name ,
748
+ } ,
749
+ } ;
750
+ }
652
751
}
653
752
}
0 commit comments