@@ -30,6 +30,7 @@ import (
30
30
"sigs.k8s.io/controller-runtime/pkg/builder"
31
31
"sigs.k8s.io/controller-runtime/pkg/client"
32
32
"sigs.k8s.io/controller-runtime/pkg/controller"
33
+ "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
33
34
"sigs.k8s.io/controller-runtime/pkg/event"
34
35
"sigs.k8s.io/controller-runtime/pkg/handler"
35
36
ctrllog "sigs.k8s.io/controller-runtime/pkg/log"
@@ -38,6 +39,7 @@ import (
38
39
"sigs.k8s.io/controller-runtime/pkg/source"
39
40
40
41
networkingv1 "github.com/alibaba/hybridnet/pkg/apis/networking/v1"
42
+ "github.com/alibaba/hybridnet/pkg/constants"
41
43
"github.com/alibaba/hybridnet/pkg/controllers/concurrency"
42
44
"github.com/alibaba/hybridnet/pkg/controllers/utils"
43
45
ipamtypes "github.com/alibaba/hybridnet/pkg/ipam/types"
@@ -80,6 +82,17 @@ func (r *SubnetStatusReconciler) Reconcile(ctx context.Context, req ctrl.Request
80
82
return ctrl.Result {}, wrapError ("unable to fetch Subnet" , client .IgnoreNotFound (err ))
81
83
}
82
84
85
+ if subnet .DeletionTimestamp != nil {
86
+ cleanSubnetMetrics (subnet .Spec .Network , subnet .Name )
87
+ return ctrl.Result {}, wrapError ("unable to remove finalizer" , r .removeFinalizer (ctx , subnet ))
88
+
89
+ }
90
+
91
+ // make sure metrics will be un-registered before deletion
92
+ if err = r .addFinalizer (ctx , subnet ); err != nil {
93
+ return ctrl.Result {}, wrapError ("unable to add finalizer to subnet" , err )
94
+ }
95
+
83
96
// fetch subnet usage from manager
84
97
var usage * ipamtypes.Usage
85
98
if usage , err = r .IPAMManager .GetSubnetUsage (subnet .Spec .Network , subnet .Name ); err != nil {
@@ -147,15 +160,65 @@ func updateSubnetUsageMetrics(networkName, subnetName string, subnetStatus *netw
147
160
}
148
161
}
149
162
163
+ func cleanSubnetMetrics (networkName , subnetName string ) {
164
+ _ = metrics .SubnetIPUsageGauge .Delete (
165
+ prometheus.Labels {
166
+ "subnetName" : subnetName ,
167
+ "networkName" : networkName ,
168
+ "usageType" : metrics .IPTotalUsageType ,
169
+ })
170
+
171
+ _ = metrics .SubnetIPUsageGauge .Delete (
172
+ prometheus.Labels {
173
+ "subnetName" : subnetName ,
174
+ "networkName" : networkName ,
175
+ "usageType" : metrics .IPUsedUsageType ,
176
+ })
177
+
178
+ _ = metrics .SubnetIPUsageGauge .Delete (
179
+ prometheus.Labels {
180
+ "subnetName" : subnetName ,
181
+ "networkName" : networkName ,
182
+ "usageType" : metrics .IPAvailableUsageType ,
183
+ })
184
+ }
185
+
186
+ func (r * SubnetStatusReconciler ) addFinalizer (ctx context.Context , subnet * networkingv1.Subnet ) error {
187
+ if controllerutil .ContainsFinalizer (subnet , constants .FinalizerMetricsRegistered ) {
188
+ return nil
189
+ }
190
+
191
+ patch := client .StrategicMergeFrom (subnet .DeepCopy ())
192
+ controllerutil .AddFinalizer (subnet , constants .FinalizerMetricsRegistered )
193
+ return retry .RetryOnConflict (retry .DefaultRetry , func () error {
194
+ return r .Patch (ctx , subnet , patch )
195
+ })
196
+ }
197
+
198
+ func (r * SubnetStatusReconciler ) removeFinalizer (ctx context.Context , subnet * networkingv1.Subnet ) error {
199
+ if ! controllerutil .ContainsFinalizer (subnet , constants .FinalizerMetricsRegistered ) {
200
+ return nil
201
+ }
202
+
203
+ patch := client .StrategicMergeFrom (subnet .DeepCopy ())
204
+ controllerutil .RemoveFinalizer (subnet , constants .FinalizerMetricsRegistered )
205
+ return retry .RetryOnConflict (retry .DefaultRetry , func () error {
206
+ return r .Patch (ctx , subnet , patch )
207
+ })
208
+ }
209
+
150
210
// SetupWithManager sets up the controller with the Manager.
151
211
func (r * SubnetStatusReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
152
212
return ctrl .NewControllerManagedBy (mgr ).
153
213
Named (ControllerSubnetStatus ).
154
214
For (& networkingv1.Subnet {},
155
215
builder .WithPredicates (
156
- & predicate.GenerationChangedPredicate {},
157
216
& utils.IgnoreDeletePredicate {},
158
- & utils.SubnetSpecChangePredicate {},
217
+ & predicate.ResourceVersionChangedPredicate {},
218
+ predicate .Or (
219
+ & utils.SubnetSpecChangePredicate {},
220
+ & utils.TerminatingPredicate {},
221
+ ),
159
222
)).
160
223
Watches (& source.Kind {Type : & networkingv1.IPInstance {}},
161
224
handler .EnqueueRequestsFromMapFunc (func (object client.Object ) []reconcile.Request {
0 commit comments