10
10
using KubeOps . Operator . Finalizer ;
11
11
using KubeOps . Operator . Queue ;
12
12
using Microsoft . Extensions . DependencyInjection ;
13
- using Microsoft . Extensions . Hosting ;
14
13
using Microsoft . Extensions . Logging ;
15
14
16
15
namespace KubeOps . Operator . Controller
17
16
{
18
17
// TODO: namespaced controller (only watch resource of a specific namespace)
19
18
// TODO: Webhooks?
20
19
21
- public abstract class ResourceControllerBase < TResource > : IHostedService
22
- where TResource : IKubernetesObject < V1ObjectMeta >
20
+ public abstract class ResourceControllerBase < TEntity > : IResourceController < TEntity >
21
+ where TEntity : IKubernetesObject < V1ObjectMeta >
23
22
{
24
- private readonly IReadOnlyList < EntityEventType > _requeueableEvents = new [ ]
23
+ private readonly IReadOnlyList < ResourceEventType > _requeueableEvents = new [ ]
25
24
{
26
- EntityEventType . Created ,
27
- EntityEventType . Updated ,
28
- EntityEventType . NotModified ,
25
+ ResourceEventType . Created ,
26
+ ResourceEventType . Updated ,
27
+ ResourceEventType . NotModified ,
29
28
} ;
30
29
31
- private readonly ILogger < ResourceControllerBase < TResource > > _logger ;
32
- private readonly EntityEventQueue < TResource > _eventQueue ;
33
-
34
- private readonly Lazy < IKubernetesClient > _client =
35
- new Lazy < IKubernetesClient > ( ( ) => DependencyInjector . Services . GetRequiredService < IKubernetesClient > ( ) ) ;
30
+ private readonly ILogger < ResourceControllerBase < TEntity > > _logger ;
31
+ private readonly IResourceEventQueue < TEntity > _eventQueue ;
36
32
37
33
protected ResourceControllerBase ( )
34
+ : this (
35
+ DependencyInjector . Services . GetRequiredService < ILogger < ResourceControllerBase < TEntity > > > ( ) ,
36
+ DependencyInjector . Services . GetRequiredService < IKubernetesClient > ( ) ,
37
+ DependencyInjector . Services . GetRequiredService < IResourceEventQueue < TEntity > > ( ) )
38
+ {
39
+ }
40
+
41
+ protected ResourceControllerBase (
42
+ ILogger < ResourceControllerBase < TEntity > > logger ,
43
+ IKubernetesClient client ,
44
+ IResourceEventQueue < TEntity > eventQueue )
38
45
{
39
- _logger = DependencyInjector . Services . GetRequiredService < ILogger < ResourceControllerBase < TResource > > > ( ) ;
40
- _eventQueue = new EntityEventQueue < TResource > ( ) ;
46
+ _logger = logger ;
47
+ _eventQueue = eventQueue ;
48
+ Client = client ;
41
49
}
42
50
43
- protected IKubernetesClient Client => _client . Value ;
51
+ protected IKubernetesClient Client { get ; }
44
52
45
53
public async Task StartAsync ( CancellationToken cancellationToken )
46
54
{
47
- _logger . LogInformation ( @"Startup CRD Controller for ""{resource}""." , typeof ( TResource ) ) ;
55
+ _logger . LogInformation ( @"Startup CRD Controller for ""{resource}""." , typeof ( TEntity ) ) ;
48
56
49
57
_eventQueue . ResourceEvent += OnResourceEvent ;
50
58
await _eventQueue . Start ( ) ;
51
59
}
52
60
53
61
public Task StopAsync ( CancellationToken cancellationToken )
54
62
{
55
- _logger . LogInformation ( @"Shutdown CRD Controller for ""{resource}""." , typeof ( TResource ) ) ;
63
+ _logger . LogInformation ( @"Shutdown CRD Controller for ""{resource}""." , typeof ( TEntity ) ) ;
56
64
57
65
_eventQueue . Stop ( ) ;
58
66
_eventQueue . ResourceEvent -= OnResourceEvent ;
59
67
60
68
return Task . CompletedTask ;
61
69
}
62
70
63
- protected virtual Task < TimeSpan ? > Created ( TResource resource )
71
+ protected virtual Task < TimeSpan ? > Created ( TEntity resource )
64
72
{
65
73
_logger . LogDebug (
66
74
@"Object ""{kind}/{name}"" fired ""created"" event." ,
@@ -69,7 +77,7 @@ public Task StopAsync(CancellationToken cancellationToken)
69
77
return Task . FromResult ( default ( TimeSpan ? ) ) ;
70
78
}
71
79
72
- protected virtual Task < TimeSpan ? > Updated ( TResource resource )
80
+ protected virtual Task < TimeSpan ? > Updated ( TEntity resource )
73
81
{
74
82
_logger . LogDebug (
75
83
@"Object ""{kind}/{name}"" fired ""updated"" event." ,
@@ -78,7 +86,7 @@ public Task StopAsync(CancellationToken cancellationToken)
78
86
return Task . FromResult ( default ( TimeSpan ? ) ) ;
79
87
}
80
88
81
- protected virtual Task < TimeSpan ? > NotModified ( TResource resource )
89
+ protected virtual Task < TimeSpan ? > NotModified ( TEntity resource )
82
90
{
83
91
_logger . LogDebug (
84
92
@"Object ""{kind}/{name}"" fired ""not modified"" event." ,
@@ -87,7 +95,7 @@ public Task StopAsync(CancellationToken cancellationToken)
87
95
return Task . FromResult ( default ( TimeSpan ? ) ) ;
88
96
}
89
97
90
- protected virtual Task StatusModified ( TResource resource )
98
+ protected virtual Task StatusModified ( TEntity resource )
91
99
{
92
100
_logger . LogDebug (
93
101
@"Object ""{kind}/{name}"" fired ""status modified"" event." ,
@@ -96,7 +104,7 @@ protected virtual Task StatusModified(TResource resource)
96
104
return Task . CompletedTask ;
97
105
}
98
106
99
- protected virtual Task Deleted ( TResource resource )
107
+ protected virtual Task Deleted ( TEntity resource )
100
108
{
101
109
_logger . LogDebug (
102
110
@"Object ""{kind}/{name}"" fired ""deleted"" event." ,
@@ -105,7 +113,7 @@ protected virtual Task Deleted(TResource resource)
105
113
return Task . FromResult ( default ( TimeSpan ? ) ) ;
106
114
}
107
115
108
- private async void OnResourceEvent ( object ? _ , ( EntityEventType type , TResource resource ) args )
116
+ private async void OnResourceEvent ( object ? _ , ( ResourceEventType type , TEntity resource ) args )
109
117
{
110
118
var ( type , resource ) = args ;
111
119
@@ -117,15 +125,15 @@ private async void OnResourceEvent(object? _, (EntityEventType type, TResource r
117
125
resource . Kind ,
118
126
resource . Metadata . Name ) ;
119
127
120
- if ( type == EntityEventType . Finalizing )
128
+ if ( type == ResourceEventType . Finalizing )
121
129
{
122
130
if ( resource . Metadata . Finalizers == null || resource . Metadata . Finalizers . Count == 0 )
123
131
{
124
132
return ;
125
133
}
126
134
127
135
var finalizer = DependencyInjector . Services
128
- . GetServices < IResourceFinalizer < TResource > > ( )
136
+ . GetServices < IResourceFinalizer < TEntity > > ( )
129
137
. FirstOrDefault ( f => f . Identifier == resource . Metadata . Finalizers . First ( ) ) ;
130
138
if ( finalizer == null )
131
139
{
@@ -152,10 +160,10 @@ private async void OnResourceEvent(object? _, (EntityEventType type, TResource r
152
160
{
153
161
switch ( type )
154
162
{
155
- case EntityEventType . StatusUpdated :
163
+ case ResourceEventType . StatusUpdated :
156
164
await StatusModified ( resource ) ;
157
165
break ;
158
- case EntityEventType . Deleted :
166
+ case ResourceEventType . Deleted :
159
167
await Deleted ( resource ) ;
160
168
break ;
161
169
}
@@ -172,9 +180,9 @@ private async void OnResourceEvent(object? _, (EntityEventType type, TResource r
172
180
173
181
var requeue = type switch
174
182
{
175
- EntityEventType . Created => await Created ( resource ) ,
176
- EntityEventType . Updated => await Updated ( resource ) ,
177
- EntityEventType . NotModified => await NotModified ( resource ) ,
183
+ ResourceEventType . Created => await Created ( resource ) ,
184
+ ResourceEventType . Updated => await Updated ( resource ) ,
185
+ ResourceEventType . NotModified => await NotModified ( resource ) ,
178
186
_ => throw new ArgumentOutOfRangeException ( ) ,
179
187
} ;
180
188
0 commit comments