@@ -20,6 +20,7 @@ import (
2020 "context"
2121 "fmt"
2222 "reflect"
23+ "sync"
2324
2425 corev1 "k8s.io/api/core/v1"
2526 apimeta "k8s.io/apimachinery/pkg/api/meta"
@@ -39,6 +40,7 @@ import (
3940 "sigs.k8s.io/controller-runtime/pkg/handler"
4041 "sigs.k8s.io/controller-runtime/pkg/log"
4142 "sigs.k8s.io/controller-runtime/pkg/predicate"
43+ "sigs.k8s.io/controller-runtime/pkg/reconcile"
4244 lws "sigs.k8s.io/lws/api/leaderworkerset/v1"
4345 applyconfigurationv1 "sigs.k8s.io/lws/client-go/applyconfiguration/leaderworkerset/v1"
4446
@@ -52,8 +54,10 @@ import (
5254// ServiceReconciler reconciles a Service object
5355type ServiceReconciler struct {
5456 client.Client
55- Scheme * runtime.Scheme
56- Record record.EventRecorder
57+ Scheme * runtime.Scheme
58+ Record record.EventRecorder
59+ GlobalConfigsMutex sync.RWMutex
60+ GlobalConfigs * helper.GlobalConfigs
5761}
5862
5963func NewServiceReconciler (client client.Client , scheme * runtime.Scheme , record record.EventRecorder ) * ServiceReconciler {
@@ -86,15 +90,12 @@ func (r *ServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
8690
8791 logger .V (10 ).Info ("reconcile Service" , "Service" , klog .KObj (service ))
8892
89- cm := & corev1.ConfigMap {}
90- if err := r .Get (ctx , types.NamespacedName {Name : "llmaz-global-config" , Namespace : "llmaz-system" }, cm ); err != nil {
91- if client .IgnoreNotFound (err ) != nil {
92- return ctrl.Result {}, fmt .Errorf ("failed to get llmaz-global-config configmap: %w" , err )
93- }
94- }
95- configs , err := helper .ParseGlobalConfigmap (cm )
96- if err != nil {
97- return ctrl.Result {}, fmt .Errorf ("failed to parse global configurations: %w" , err )
93+ r .GlobalConfigsMutex .RLock ()
94+ configs := r .GlobalConfigs
95+ r .GlobalConfigsMutex .RUnlock ()
96+
97+ if configs == nil {
98+ return ctrl.Result {}, fmt .Errorf ("globel configs not init" )
9899 }
99100
100101 // Set the global configurations to the service.
@@ -160,9 +161,39 @@ func (r *ServiceReconciler) SetupWithManager(mgr ctrl.Manager) error {
160161 return ! reflect .DeepEqual (oldBar .Status , newBar .Status )
161162 },
162163 })).
164+ Watches (& corev1.ConfigMap {}, handler .EnqueueRequestsFromMapFunc (r .updateGlobalConfig ),
165+ builder .WithPredicates (predicate.Funcs {
166+ UpdateFunc : func (e event.UpdateEvent ) bool {
167+ cm := e .ObjectOld .(* corev1.ConfigMap )
168+ return cm .Name == helper .GlobalConfigMapName && cm .Namespace == helper .GlobalConfigMapNamespace
169+ },
170+ CreateFunc : func (e event.CreateEvent ) bool {
171+ cm := e .Object .(* corev1.ConfigMap )
172+ return cm .Name == helper .GlobalConfigMapName && cm .Namespace == helper .GlobalConfigMapNamespace
173+ },
174+ })).
163175 Complete (r )
164176}
165177
178+ func (r * ServiceReconciler ) updateGlobalConfig (ctx context.Context , obj client.Object ) []reconcile.Request {
179+ logger := log .FromContext (ctx )
180+ cm , ok := obj .(* corev1.ConfigMap )
181+ if ! ok {
182+ return nil
183+ }
184+
185+ newConfig , err := helper .ParseGlobalConfigmap (cm )
186+ if err != nil {
187+ logger .Error (err , "failed to parse global config" )
188+ return nil
189+ }
190+ r .GlobalConfigsMutex .Lock ()
191+ defer r .GlobalConfigsMutex .Unlock ()
192+ r .GlobalConfigs = newConfig
193+ logger .Info ("global config updated" , "config" , newConfig )
194+ return nil
195+ }
196+
166197func buildWorkloadApplyConfiguration (service * inferenceapi.Service , models []* coreapi.OpenModel , configs * helper.GlobalConfigs ) (* applyconfigurationv1.LeaderWorkerSetApplyConfiguration , error ) {
167198 workload := applyconfigurationv1 .LeaderWorkerSet (service .Name , service .Namespace )
168199
0 commit comments