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  }