@@ -18,13 +18,17 @@ package controller
18
18
19
19
import (
20
20
"context"
21
+ "fmt"
21
22
22
23
"k8s.io/apimachinery/pkg/api/errors"
24
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
23
25
ctrl "sigs.k8s.io/controller-runtime"
24
26
"sigs.k8s.io/controller-runtime/pkg/client"
25
27
"sigs.k8s.io/controller-runtime/pkg/log"
26
28
27
29
v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1"
30
+ "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2"
31
+ "sigs.k8s.io/gateway-api-inference-extension/pkg/common"
28
32
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore"
29
33
logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging"
30
34
)
@@ -35,31 +39,72 @@ import (
35
39
type InferencePoolReconciler struct {
36
40
client.Reader
37
41
Datastore datastore.Datastore
42
+ PoolGKNN common.GKNN
38
43
}
39
44
40
45
func (c * InferencePoolReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
41
- logger := log .FromContext (ctx ).WithValues ("inferencePool" , req .NamespacedName ).V (logutil .DEFAULT )
46
+ logger := log .FromContext (ctx ).WithValues ("group" , c . PoolGKNN . Group , " inferencePool" , req .NamespacedName ).V (logutil .DEFAULT )
42
47
ctx = ctrl .LoggerInto (ctx , logger )
43
48
44
- logger .Info ("Reconciling InferencePool" )
49
+ logger .Info ("Reconciling InferencePool" , "group" , c . PoolGKNN . Group , "inferencePool" , req . NamespacedName )
45
50
46
- infPool := & v1.InferencePool {}
51
+ // 1. Initialize a generic client.Object based on the group.
52
+ var obj client.Object
53
+ switch c .PoolGKNN .Group {
54
+ case v1 .GroupName :
55
+ obj = & v1.InferencePool {}
56
+ case v1alpha2 .GroupName :
57
+ obj = & v1alpha2.InferencePool {}
58
+ default :
59
+ // Handle unsupported groups gracefully.
60
+ err := fmt .Errorf ("unsupported API group: %s" , c .PoolGKNN .Group )
61
+ logger .Error (err , "Cannot reconcile InferencePool" )
62
+ return ctrl.Result {}, err
63
+ }
47
64
48
- if err := c .Get (ctx , req .NamespacedName , infPool ); err != nil {
65
+ // 2. Perform a single, generic fetch for the object.
66
+ if err := c .Get (ctx , req .NamespacedName , obj ); err != nil {
49
67
if errors .IsNotFound (err ) {
50
68
logger .Info ("InferencePool not found. Clearing the datastore" )
51
69
c .Datastore .Clear ()
52
70
return ctrl.Result {}, nil
53
71
}
54
72
logger .Error (err , "Unable to get InferencePool" )
55
73
return ctrl.Result {}, err
56
- } else if ! infPool .DeletionTimestamp .IsZero () {
74
+ }
75
+
76
+ // 3. Perform common checks using the client.Object interface.
77
+ if ! obj .GetDeletionTimestamp ().IsZero () {
57
78
logger .Info ("InferencePool is marked for deletion. Clearing the datastore" )
58
79
c .Datastore .Clear ()
59
80
return ctrl.Result {}, nil
60
81
}
61
- // update pool in datastore
62
- if err := c .Datastore .PoolSet (ctx , c .Reader , infPool ); err != nil {
82
+
83
+ // 4. Convert the fetched object to the canonical v1.InferencePool.
84
+ var v1infPool * v1.InferencePool
85
+
86
+ switch pool := obj .(type ) {
87
+ case * v1.InferencePool :
88
+ // If it's already a v1 object, just use it.
89
+ v1infPool = pool
90
+ case * v1alpha2.InferencePool :
91
+ // If it's a v1alpha2 object, convert it to v1.
92
+ var uns * unstructured.Unstructured
93
+ uns , err := common .ToUnstructured (pool )
94
+ if err != nil {
95
+ logger .Error (err , "Failed to convert inferencePool to unstructured" )
96
+ return ctrl.Result {}, err
97
+ }
98
+ v1infPool , err = common .ToInferencePool (uns )
99
+ if err != nil {
100
+ logger .Error (err , "Failed to convert unstructured to inferencePool" )
101
+ return ctrl.Result {}, err
102
+ }
103
+ default :
104
+ return ctrl.Result {}, fmt .Errorf ("unsupported API group: %s" , c .PoolGKNN .Group )
105
+ }
106
+
107
+ if err := c .Datastore .PoolSet (ctx , c .Reader , v1infPool ); err != nil {
63
108
logger .Error (err , "Failed to update datastore" )
64
109
return ctrl.Result {}, err
65
110
}
@@ -68,7 +113,16 @@ func (c *InferencePoolReconciler) Reconcile(ctx context.Context, req ctrl.Reques
68
113
}
69
114
70
115
func (c * InferencePoolReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
71
- return ctrl .NewControllerManagedBy (mgr ).
72
- For (& v1.InferencePool {}).
73
- Complete (c )
116
+ switch c .PoolGKNN .Group {
117
+ case v1alpha2 .GroupName :
118
+ return ctrl .NewControllerManagedBy (mgr ).
119
+ For (& v1alpha2.InferencePool {}).
120
+ Complete (c )
121
+ case v1 .GroupName :
122
+ return ctrl .NewControllerManagedBy (mgr ).
123
+ For (& v1.InferencePool {}).
124
+ Complete (c )
125
+ default :
126
+ return fmt .Errorf ("unknown group %s" , c .PoolGKNN .Group )
127
+ }
74
128
}
0 commit comments