public void Start_RespondsToCancellationRequest()
        {
            var crdList = new TestCustomResourceList();

            _k8sClient.Setup(p => p.ListNamespacedCustomObjectWithHttpMessagesAsync(It.IsAny <CustomResourceDefinition>()))
            .Returns(Task.FromResult(new HttpOperationResponse <object>
            {
                Body     = new object(),
                Response = new HttpResponseMessage {
                    Content = new StringContent(JsonConvert.SerializeObject(crdList))
                }
            }));

            var watcher = new CustomResourceWatcher <TestCustomResourceList, TestCustomResource>(
                _logger.Object, _k8sClient.Object, _customResourceDefinition, _cancellationTokenSource.Token, (eventType, item) =>
            {
            });

            watcher.Start(100);
            Thread.Sleep(150);
            _cancellationTokenSource.Cancel();
            Thread.Sleep(100);
            _k8sClient.Verify(v => v.ListNamespacedCustomObjectWithHttpMessagesAsync(It.IsAny <CustomResourceDefinition>()), Times.AtLeastOnce());
            _logger.VerifyLogging($"No CRD found in type: {_customResourceDefinition.ApiVersion}/{_customResourceDefinition.Kind}", LogLevel.Warning, Times.AtLeastOnce());
            _logger.VerifyLogging($"Cancallation requested, CRD watcher stopped.", LogLevel.Information, Times.Once());
        }
Esempio n. 2
0
        private async Task BackgroundProcessing(CancellationToken cancellationToken)
        {
            _logger.Log(LogLevel.Information, "Job Store Hosted Service is running.");

            _watcher = new CustomResourceWatcher <JobCustomResourceList, JobCustomResource>(
                _loggerFactory.CreateLogger <CustomResourceWatcher <JobCustomResourceList, JobCustomResource> >(),
                _kubernetesClient,
                CustomResourceDefinition.JobsCrd,
                cancellationToken,
                HandleJobEvents);

            await Task.Run(() => _watcher.Start(_configuration.Value.CrdReadIntervals));
        }
Esempio n. 3
0
        protected async Task BackgroundProcessing(CancellationToken stoppingToken)
        {
            if (_configuration.Value.ReadAeTitlesFromCrd)
            {
                _logger.Log(LogLevel.Information, "Kubernetes CRD Monitor Hosted Service is running.");

                _configuration.Value.Dicom.Scp.AeTitles.Clear();
                _lLocalAeTitleCrdWatcher = new CustomResourceWatcher <ClaraApplicationEntityCustomResourceList, ClaraApplicationEntityCustomResource>(
                    _loggerFactory.CreateLogger <CustomResourceWatcher <ClaraApplicationEntityCustomResourceList, ClaraApplicationEntityCustomResource> >(),
                    _kubernetesClient,
                    CustomResourceDefinition.ClaraAeTitleCrd,
                    stoppingToken,
                    HandleClaraAeTitleEvents);
                await Task.Run(() => _lLocalAeTitleCrdWatcher.Start(_configuration.Value.CrdReadIntervals));

                _configuration.Value.Dicom.Scp.Sources.Clear();
                _sourceAeTitleCrdWatcher = new CustomResourceWatcher <SourceApplicationEntityCustomResourceList, SourceApplicationEntityCustomResource>(
                    _loggerFactory.CreateLogger <CustomResourceWatcher <SourceApplicationEntityCustomResourceList, SourceApplicationEntityCustomResource> >(),
                    _kubernetesClient,
                    CustomResourceDefinition.SourceAeTitleCrd,
                    stoppingToken,
                    HandleSourceAeTitleEvents);
                await Task.Run(() => _sourceAeTitleCrdWatcher.Start(_configuration.Value.CrdReadIntervals));

                _configuration.Value.Dicom.Scu.Destinations.Clear();
                _destinationAeTitleCrdWatcher = new CustomResourceWatcher <DestinationApplicationEntityCustomResourceList, DestinationApplicationEntityCustomResource>(
                    _loggerFactory.CreateLogger <CustomResourceWatcher <DestinationApplicationEntityCustomResourceList, DestinationApplicationEntityCustomResource> >(),
                    _kubernetesClient,
                    CustomResourceDefinition.DestinationAeTitleCrd,
                    stoppingToken,
                    HandleDestinationAeTitleEvents);
                await Task.Run(() => _destinationAeTitleCrdWatcher.Start(_configuration.Value.CrdReadIntervals));
            }
            else
            {
                _logger.Log(LogLevel.Information, "Reading AE Title from CRD is disabled.");
            }
        }
        public void Start_HandledCrdEvents()
        {
            var crdList1 = TestData1();
            var crdList2 = TestData2();
            var crdList3 = TestData3();
            var crdList4 = TestData4();
            var crdList5 = TestData5();

            _k8sClient.SetupSequence(p => p.ListNamespacedCustomObjectWithHttpMessagesAsync(It.IsAny <CustomResourceDefinition>()))
            .Returns(Task.FromResult(new HttpOperationResponse <object>
            {
                Body     = new object(),
                Response = new HttpResponseMessage {
                    Content = new StringContent(JsonConvert.SerializeObject(crdList1))
                }
            }))
            .Returns(Task.FromResult(new HttpOperationResponse <object>
            {
                Body     = new object(),
                Response = new HttpResponseMessage {
                    Content = new StringContent(JsonConvert.SerializeObject(crdList2))
                }
            }))
            .Returns(Task.FromResult(new HttpOperationResponse <object>
            {
                Body     = new object(),
                Response = new HttpResponseMessage {
                    Content = new StringContent(JsonConvert.SerializeObject(crdList3))
                }
            }))
            .Returns(Task.FromResult(new HttpOperationResponse <object>
            {
                Body     = new object(),
                Response = new HttpResponseMessage {
                    Content = new StringContent(JsonConvert.SerializeObject(crdList4))
                }
            }))
            .Returns(Task.FromResult(new HttpOperationResponse <object>
            {
                Body     = new object(),
                Response = new HttpResponseMessage {
                    Content = new StringContent(JsonConvert.SerializeObject(crdList5))
                }
            }));

            var countdownEvent = new CountdownEvent(9);
            var callCount      = 0;
            var addedCount     = 0;
            var deletedCount   = 0;
            var watcher        = new CustomResourceWatcher <TestCustomResourceList, TestCustomResource>(
                _logger.Object, _k8sClient.Object, _customResourceDefinition, _cancellationTokenSource.Token, (eventType, item) =>
            {
                Console.WriteLine($"Call #{callCount}");
                switch (eventType)
                {
                case WatchEventType.Added:
                    Console.WriteLine($"Added {item.Metadata.Name}");
                    addedCount++;
                    break;

                case WatchEventType.Deleted:
                    Console.WriteLine($"Deleted {item.Metadata.Name}");
                    deletedCount++;
                    break;
                }

                countdownEvent.Signal();
            });

            watcher.Start(100);
            countdownEvent.Wait();
            _k8sClient.Verify(v => v.ListNamespacedCustomObjectWithHttpMessagesAsync(It.IsAny <CustomResourceDefinition>()), Times.AtLeastOnce());
            _logger.VerifyLogging($"No CRD found in type: {_customResourceDefinition.Namespace}/{_customResourceDefinition.PluralName}", LogLevel.Warning, Times.Never());
            Assert.Equal(6, addedCount);
            Assert.Equal(3, deletedCount);
        }