diff --git a/src/ES.Kubernetes.Reflector/Core/ConfigMapMirror.cs b/src/ES.Kubernetes.Reflector/Core/ConfigMapMirror.cs index 8a37efd..0a3949b 100644 --- a/src/ES.Kubernetes.Reflector/Core/ConfigMapMirror.cs +++ b/src/ES.Kubernetes.Reflector/Core/ConfigMapMirror.cs @@ -6,24 +6,18 @@ namespace ES.Kubernetes.Reflector.Core; -public class ConfigMapMirror(ILogger logger, IServiceProvider serviceProvider) - : ResourceMirror(logger, serviceProvider) +public class ConfigMapMirror(ILogger logger, IKubernetes kubernetesClient) + : ResourceMirror(logger, kubernetesClient) { - private readonly IServiceProvider _serviceProvider = serviceProvider; - protected override async Task OnResourceWithNameList(string itemRefName) { - using var client = _serviceProvider.GetRequiredService(); - return (await client.CoreV1.ListConfigMapForAllNamespacesAsync(fieldSelector: $"metadata.name={itemRefName}")) + return (await KubernetesClient.CoreV1.ListConfigMapForAllNamespacesAsync(fieldSelector: $"metadata.name={itemRefName}")) .Items .ToArray(); } - protected override async Task OnResourceApplyPatch(V1Patch patch, KubeRef refId) - { - using var client = _serviceProvider.GetRequiredService(); - await client.CoreV1.PatchNamespacedConfigMapAsync(patch, refId.Name, refId.Namespace); - } + protected override async Task OnResourceApplyPatch(V1Patch patch, KubeRef refId) + => await KubernetesClient.CoreV1.PatchNamespacedConfigMapAsync(patch, refId.Name, refId.Namespace); protected override Task OnResourceConfigurePatch(V1ConfigMap source, JsonPatchDocument patchDoc) { @@ -33,10 +27,7 @@ protected override Task OnResourceConfigurePatch(V1ConfigMap source, JsonPatchDo } protected override async Task OnResourceCreate(V1ConfigMap item, string ns) - { - using var client = _serviceProvider.GetRequiredService(); - await client.CoreV1.CreateNamespacedConfigMapAsync(item, ns); - } + => await KubernetesClient.CoreV1.CreateNamespacedConfigMapAsync(item, ns); protected override Task OnResourceClone(V1ConfigMap sourceResource) { @@ -50,14 +41,8 @@ protected override Task OnResourceClone(V1ConfigMap sourceResource) } protected override async Task OnResourceDelete(KubeRef resourceId) - { - using var client = _serviceProvider.GetRequiredService(); - await client.CoreV1.DeleteNamespacedConfigMapAsync(resourceId.Name, resourceId.Namespace); - } + => await KubernetesClient.CoreV1.DeleteNamespacedConfigMapAsync(resourceId.Name, resourceId.Namespace); protected override async Task OnResourceGet(KubeRef refId) - { - using var client = _serviceProvider.GetRequiredService(); - return await client.CoreV1.ReadNamespacedConfigMapAsync(refId.Name, refId.Namespace); - } + => await KubernetesClient.CoreV1.ReadNamespacedConfigMapAsync(refId.Name, refId.Namespace); } \ No newline at end of file diff --git a/src/ES.Kubernetes.Reflector/Core/ConfigMapWatcher.cs b/src/ES.Kubernetes.Reflector/Core/ConfigMapWatcher.cs index a53881b..d914037 100644 --- a/src/ES.Kubernetes.Reflector/Core/ConfigMapWatcher.cs +++ b/src/ES.Kubernetes.Reflector/Core/ConfigMapWatcher.cs @@ -11,14 +11,13 @@ namespace ES.Kubernetes.Reflector.Core; public class ConfigMapWatcher( ILogger logger, IMediator mediator, - IServiceProvider serviceProvider, + IKubernetes kubernetesClient, IOptionsMonitor options) - : WatcherBackgroundService(logger, mediator, serviceProvider, options) + : WatcherBackgroundService(logger, mediator, options) { - protected override Task> OnGetWatcher(IKubernetes client, - CancellationToken cancellationToken) + protected override Task> OnGetWatcher(CancellationToken cancellationToken) { - return client.CoreV1.ListConfigMapForAllNamespacesWithHttpMessagesAsync(watch: true, + return kubernetesClient.CoreV1.ListConfigMapForAllNamespacesWithHttpMessagesAsync(watch: true, timeoutSeconds: WatcherTimeout, cancellationToken: cancellationToken); } diff --git a/src/ES.Kubernetes.Reflector/Core/Mirroring/ResourceMirror.cs b/src/ES.Kubernetes.Reflector/Core/Mirroring/ResourceMirror.cs index 4a11b47..4cffef6 100644 --- a/src/ES.Kubernetes.Reflector/Core/Mirroring/ResourceMirror.cs +++ b/src/ES.Kubernetes.Reflector/Core/Mirroring/ResourceMirror.cs @@ -16,7 +16,7 @@ namespace ES.Kubernetes.Reflector.Core.Mirroring; -public abstract class ResourceMirror(ILogger logger, IServiceProvider serviceProvider) : +public abstract class ResourceMirror(ILogger logger, IKubernetes kubernetesClient) : INotificationHandler, INotificationHandler where TResource : class, IKubernetesObject @@ -28,6 +28,7 @@ public abstract class ResourceMirror(ILogger logger, IServiceProvider private readonly ConcurrentDictionary _notFoundCache = new(); private readonly ConcurrentDictionary _propertiesCache = new(); protected readonly ILogger Logger = logger; + protected readonly IKubernetes KubernetesClient = kubernetesClient; /// @@ -324,8 +325,7 @@ private async Task AutoReflectionForSource(KubeRef resourceRef, TResource? resou var autoReflectionList = _autoReflectionCache.GetOrAdd(resourceRef, _ => new List()); var matches = await OnResourceWithNameList(resourceRef.Name); - using var client = serviceProvider.GetRequiredService(); - var namespaces = (await client.CoreV1.ListNamespaceAsync(cancellationToken: cancellationToken)).Items; + var namespaces = (await KubernetesClient.CoreV1.ListNamespaceAsync(cancellationToken: cancellationToken)).Items; foreach (var match in matches) { diff --git a/src/ES.Kubernetes.Reflector/Core/NamespaceWatcher.cs b/src/ES.Kubernetes.Reflector/Core/NamespaceWatcher.cs index 47642df..1f30904 100644 --- a/src/ES.Kubernetes.Reflector/Core/NamespaceWatcher.cs +++ b/src/ES.Kubernetes.Reflector/Core/NamespaceWatcher.cs @@ -11,14 +11,13 @@ namespace ES.Kubernetes.Reflector.Core; public class NamespaceWatcher( ILogger logger, IMediator mediator, - IServiceProvider serviceProvider, + IKubernetes kubernetesClient, IOptionsMonitor options) - : WatcherBackgroundService(logger, mediator, serviceProvider, options) + : WatcherBackgroundService(logger, mediator, options) { - protected override Task> OnGetWatcher(IKubernetes client, - CancellationToken cancellationToken) + protected override Task> OnGetWatcher(CancellationToken cancellationToken) { - return client.CoreV1.ListNamespaceWithHttpMessagesAsync(watch: true, timeoutSeconds: WatcherTimeout, + return kubernetesClient.CoreV1.ListNamespaceWithHttpMessagesAsync(watch: true, timeoutSeconds: WatcherTimeout, cancellationToken: cancellationToken); } } \ No newline at end of file diff --git a/src/ES.Kubernetes.Reflector/Core/SecretMirror.cs b/src/ES.Kubernetes.Reflector/Core/SecretMirror.cs index f875915..cea4962 100644 --- a/src/ES.Kubernetes.Reflector/Core/SecretMirror.cs +++ b/src/ES.Kubernetes.Reflector/Core/SecretMirror.cs @@ -6,24 +6,18 @@ namespace ES.Kubernetes.Reflector.Core; -public class SecretMirror(ILogger logger, IServiceProvider serviceProvider) - : ResourceMirror(logger, serviceProvider) +public class SecretMirror(ILogger logger, IKubernetes kubernetesClient) + : ResourceMirror(logger, kubernetesClient) { - private readonly IServiceProvider _serviceProvider = serviceProvider; - protected override async Task OnResourceWithNameList(string itemRefName) { - using var client = _serviceProvider.GetRequiredService(); - return (await client.CoreV1.ListSecretForAllNamespacesAsync(fieldSelector: $"metadata.name={itemRefName}")) + return (await KubernetesClient.CoreV1.ListSecretForAllNamespacesAsync(fieldSelector: $"metadata.name={itemRefName}")) .Items .ToArray(); } protected override async Task OnResourceApplyPatch(V1Patch patch, KubeRef refId) - { - using var client = _serviceProvider.GetRequiredService(); - await client.CoreV1.PatchNamespacedSecretWithHttpMessagesAsync(patch, refId.Name, refId.Namespace); - } + => await KubernetesClient.CoreV1.PatchNamespacedSecretWithHttpMessagesAsync(patch, refId.Name, refId.Namespace); protected override Task OnResourceConfigurePatch(V1Secret source, JsonPatchDocument patchDoc) { @@ -32,10 +26,7 @@ protected override Task OnResourceConfigurePatch(V1Secret source, JsonPatchDocum } protected override async Task OnResourceCreate(V1Secret item, string ns) - { - using var client = _serviceProvider.GetRequiredService(); - await client.CoreV1.CreateNamespacedSecretAsync(item, ns); - } + => await KubernetesClient.CoreV1.CreateNamespacedSecretAsync(item, ns); protected override Task OnResourceClone(V1Secret sourceResource) { @@ -49,16 +40,10 @@ protected override Task OnResourceClone(V1Secret sourceResource) } protected override async Task OnResourceDelete(KubeRef resourceId) - { - using var client = _serviceProvider.GetRequiredService(); - await client.CoreV1.DeleteNamespacedSecretAsync(resourceId.Name, resourceId.Namespace); - } + => await KubernetesClient.CoreV1.DeleteNamespacedSecretAsync(resourceId.Name, resourceId.Namespace); protected override async Task OnResourceGet(KubeRef refId) - { - using var client = _serviceProvider.GetRequiredService(); - return await client.CoreV1.ReadNamespacedSecretAsync(refId.Name, refId.Namespace); - } + => await KubernetesClient.CoreV1.ReadNamespacedSecretAsync(refId.Name, refId.Namespace); protected override Task OnResourceIgnoreCheck(V1Secret item) { diff --git a/src/ES.Kubernetes.Reflector/Core/SecretWatcher.cs b/src/ES.Kubernetes.Reflector/Core/SecretWatcher.cs index cc8995d..937022c 100644 --- a/src/ES.Kubernetes.Reflector/Core/SecretWatcher.cs +++ b/src/ES.Kubernetes.Reflector/Core/SecretWatcher.cs @@ -11,14 +11,13 @@ namespace ES.Kubernetes.Reflector.Core; public class SecretWatcher( ILogger logger, IMediator mediator, - IServiceProvider serviceProvider, + IKubernetes kubernetesClient, IOptionsMonitor options) - : WatcherBackgroundService(logger, mediator, serviceProvider, options) + : WatcherBackgroundService(logger, mediator, options) { - protected override Task> OnGetWatcher(IKubernetes client, - CancellationToken cancellationToken) + protected override Task> OnGetWatcher(CancellationToken cancellationToken) { - return client.CoreV1.ListSecretForAllNamespacesWithHttpMessagesAsync(watch: true, + return kubernetesClient.CoreV1.ListSecretForAllNamespacesWithHttpMessagesAsync(watch: true, timeoutSeconds: WatcherTimeout, cancellationToken: cancellationToken); } diff --git a/src/ES.Kubernetes.Reflector/Core/Watchers/WatcherBackgroundService.cs b/src/ES.Kubernetes.Reflector/Core/Watchers/WatcherBackgroundService.cs index bbe1b0d..9cbbf2b 100644 --- a/src/ES.Kubernetes.Reflector/Core/Watchers/WatcherBackgroundService.cs +++ b/src/ES.Kubernetes.Reflector/Core/Watchers/WatcherBackgroundService.cs @@ -12,7 +12,6 @@ namespace ES.Kubernetes.Reflector.Core.Watchers; public abstract class WatcherBackgroundService( ILogger logger, IMediator mediator, - IServiceProvider serviceProvider, IOptionsMonitor options) : BackgroundService where TResource : IKubernetesObject @@ -27,8 +26,6 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) var sessionStopwatch = new Stopwatch(); while (!stoppingToken.IsCancellationRequested) { - await using var scope = serviceProvider.CreateAsyncScope(); - var sessionFaulted = false; sessionStopwatch.Restart(); @@ -40,9 +37,8 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) using var absoluteTimeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(WatcherTimeout + 3)); using var cancellationCts = CancellationTokenSource.CreateLinkedTokenSource(stoppingToken, absoluteTimeoutCts.Token); - using var client = scope.ServiceProvider.GetRequiredService(); - using var watcher = OnGetWatcher(client, stoppingToken); + using var watcher = OnGetWatcher(stoppingToken); var watchList = watcher.WatchAsync(cancellationToken: cancellationCts.Token); await foreach (var (type, item) in watchList) @@ -79,6 +75,5 @@ await Mediator.Publish(new WatcherClosed } } - protected abstract Task> OnGetWatcher(IKubernetes client, - CancellationToken cancellationToken); + protected abstract Task> OnGetWatcher(CancellationToken cancellationToken); } \ No newline at end of file diff --git a/src/ES.Kubernetes.Reflector/Program.cs b/src/ES.Kubernetes.Reflector/Program.cs index 08f140f..e1263ae 100644 --- a/src/ES.Kubernetes.Reflector/Program.cs +++ b/src/ES.Kubernetes.Reflector/Program.cs @@ -23,7 +23,7 @@ builder.Services.Configure(builder.Configuration.GetSection(nameof(ES.Kubernetes.Reflector))); - builder.Services.AddTransient(s => + builder.Services.AddSingleton(s => { var reflectorOptions = s.GetRequiredService>(); @@ -35,17 +35,13 @@ }); - builder.Services.AddTransient(s => + builder.Services.AddSingleton(s => new Kubernetes(s.GetRequiredService())); builder.Services.AddHostedService(); builder.Services.AddHostedService(); builder.Services.AddHostedService(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - - var app = builder.Build(); app.Ignite(); await app.RunAsync();