github.com/cilium/cilium@v1.16.2/pkg/k8s/watchers/subscriber/service.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package subscriber 5 6 import ( 7 "fmt" 8 9 slim_corev1 "github.com/cilium/cilium/pkg/k8s/slim/k8s/api/core/v1" 10 ) 11 12 var _ Service = (*ServiceChain)(nil) 13 14 // Service is implemented by event handlers responding to K8s Service 15 // events. 16 type Service interface { 17 OnAddService(*slim_corev1.Service) error 18 OnUpdateService(oldObj, newObj *slim_corev1.Service) error 19 OnDeleteService(*slim_corev1.Service) error 20 } 21 22 // ServiceChain holds the subscriber.Service implementations that are notified when 23 // reacting to K8s Service resource / object changes in the K8s watchers. 24 // 25 // ServiceChain itself is an implementation of subscriber.Service with 26 // an additional Register method for attaching children subscribers to the 27 // chain. 28 type ServiceChain struct { 29 list 30 31 subs []Service 32 } 33 34 // NewServiceChain 35 func NewServiceChain() *ServiceChain { 36 return &ServiceChain{} 37 } 38 39 // Register registers ServiceHandler as a subscriber for reacting to Service 40 // objects into the list. 41 func (l *ServiceChain) Register(s Service) { 42 l.Lock() 43 l.subs = append(l.subs, s) 44 l.Unlock() 45 } 46 47 // OnAddService notifies all the subscribers of an add event to a service. 48 func (l *ServiceChain) OnAddService(svc *slim_corev1.Service) error { 49 l.RLock() 50 defer l.RUnlock() 51 errs := []error{} 52 for _, s := range l.subs { 53 if err := s.OnAddService(svc); err != nil { 54 errs = append(errs, err) 55 } 56 } 57 if len(errs) > 0 { 58 return fmt.Errorf("Errors: %v", errs) 59 } 60 return nil 61 } 62 63 // OnUpdateService notifies all the subscribers of an update event to a service. 64 func (l *ServiceChain) OnUpdateService(oldSvc, newSvc *slim_corev1.Service) error { 65 l.RLock() 66 defer l.RUnlock() 67 errs := []error{} 68 for _, s := range l.subs { 69 if err := s.OnUpdateService(oldSvc, newSvc); err != nil { 70 errs = append(errs, err) 71 } 72 } 73 if len(errs) > 0 { 74 return fmt.Errorf("Errors: %v", errs) 75 } 76 return nil 77 } 78 79 // OnDeleteService notifies all the subscribers of an update event to a service. 80 func (l *ServiceChain) OnDeleteService(svc *slim_corev1.Service) error { 81 l.RLock() 82 defer l.RUnlock() 83 errs := []error{} 84 for _, s := range l.subs { 85 if err := s.OnDeleteService(svc); err != nil { 86 errs = append(errs, err) 87 } 88 } 89 if len(errs) > 0 { 90 return fmt.Errorf("Errors: %v", errs) 91 } 92 return nil 93 }