controller: added finalizer processing
This commit is contained in:
+66
-9
@@ -127,7 +127,11 @@ func (cont *Controller) addService(obj any) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
cont.log.Debugf("Service %s/%s forwarded", service.Namespace, service.Name)
|
cont.log.Debugf("Service %s/%s forwarded", service.Namespace, service.Name)
|
||||||
err := cont.patchService(service)
|
err := cont.addStatus(service)
|
||||||
|
if err != nil {
|
||||||
|
cont.log.Debugf("Error patch service %s/%s: %v", service.Namespace, service.Name, err)
|
||||||
|
}
|
||||||
|
err = cont.addFinalizer(service)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cont.log.Debugf("Error patch service %s/%s: %v", service.Namespace, service.Name, err)
|
cont.log.Debugf("Error patch service %s/%s: %v", service.Namespace, service.Name, err)
|
||||||
}
|
}
|
||||||
@@ -151,7 +155,7 @@ func (cont *Controller) updateService(oldObj, newObj any) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err := cont.patchService(newService)
|
err := cont.addStatus(newService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cont.log.Errorf("Error patch service %s/%s: %v", newService.Namespace, newService.Name, err)
|
cont.log.Errorf("Error patch service %s/%s: %v", newService.Namespace, newService.Name, err)
|
||||||
}
|
}
|
||||||
@@ -171,6 +175,10 @@ func (cont *Controller) deleteService(obj any) {
|
|||||||
cont.log.Errorf("Error unforwarding service %s/%s: %v", service.Namespace, service.Name, err)
|
cont.log.Errorf("Error unforwarding service %s/%s: %v", service.Namespace, service.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
err := cont.deleteFinalizer(service)
|
||||||
|
if err != nil {
|
||||||
|
cont.log.Debugf("Error patch service %s/%s: %v", service.Namespace, service.Name, err)
|
||||||
|
}
|
||||||
cont.log.Debugf("Service %s/%s unforwarded", service.Namespace, service.Name)
|
cont.log.Debugf("Service %s/%s unforwarded", service.Namespace, service.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -197,12 +205,50 @@ func makeForwardings(service *kubecore.Service) []*Forwarding {
|
|||||||
return forwardings
|
return forwardings
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cont *Controller) patchService(svc *kubecore.Service) error {
|
const LoadBalancerFinalizer = "service.kubernetes.io/load-balancer"
|
||||||
|
|
||||||
|
func (cont *Controller) addFinalizer(oldSvc *kubecore.Service) error {
|
||||||
var err error
|
var err error
|
||||||
oldData, err := json.Marshal(svc)
|
for _, finalizer := range oldSvc.ObjectMeta.Finalizers {
|
||||||
|
if finalizer == LoadBalancerFinalizer {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
newSvc := oldSvc.DeepCopy()
|
||||||
|
newSvc.ObjectMeta.Finalizers = append(newSvc.ObjectMeta.Finalizers, LoadBalancerFinalizer)
|
||||||
|
err = cont.patchService(oldSvc, newSvc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cont *Controller) deleteFinalizer(oldSvc *kubecore.Service) error {
|
||||||
|
var err error
|
||||||
|
haveFinalizer := false
|
||||||
|
newFinalizers := make([]string, 0)
|
||||||
|
for _, finalizer := range oldSvc.ObjectMeta.Finalizers {
|
||||||
|
if finalizer == LoadBalancerFinalizer {
|
||||||
|
haveFinalizer = true
|
||||||
|
} else {
|
||||||
|
newFinalizers = append(newFinalizers, finalizer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !haveFinalizer {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
newSvc := oldSvc.DeepCopy()
|
||||||
|
newSvc.ObjectMeta.Finalizers = newFinalizers
|
||||||
|
err = cont.patchService(oldSvc, newSvc)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cont *Controller) addStatus(oldSvc *kubecore.Service) error {
|
||||||
|
var err error
|
||||||
|
newSvc := oldSvc.DeepCopy()
|
||||||
ingressMode := kubecore.LoadBalancerIPModeProxy
|
ingressMode := kubecore.LoadBalancerIPModeProxy
|
||||||
ingresses := make([]kubecore.LoadBalancerIngress, 0)
|
ingresses := make([]kubecore.LoadBalancerIngress, 0)
|
||||||
ingresses = append(ingresses, kubecore.LoadBalancerIngress{
|
ingresses = append(ingresses, kubecore.LoadBalancerIngress{
|
||||||
@@ -212,13 +258,24 @@ func (cont *Controller) patchService(svc *kubecore.Service) error {
|
|||||||
status := kubecore.LoadBalancerStatus{
|
status := kubecore.LoadBalancerStatus{
|
||||||
Ingress: ingresses,
|
Ingress: ingresses,
|
||||||
}
|
}
|
||||||
svc.Status.LoadBalancer = status
|
newSvc.Status.LoadBalancer = status
|
||||||
|
err = cont.patchService(oldSvc, newSvc)
|
||||||
newData, err := json.Marshal(svc)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cont *Controller) patchService(oldSvc, newSvc *kubecore.Service) error {
|
||||||
|
var err error
|
||||||
|
oldData, err := json.Marshal(oldSvc)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
newData, err := json.Marshal(newSvc)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
patchBytes, err := k8patch.CreateTwoWayMergePatch(oldData, newData, kubecore.Service{})
|
patchBytes, err := k8patch.CreateTwoWayMergePatch(oldData, newData, kubecore.Service{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -228,8 +285,8 @@ func (cont *Controller) patchService(svc *kubecore.Service) error {
|
|||||||
ctx, _ := context.WithTimeout(cont.ctx, 5*time.Second)
|
ctx, _ := context.WithTimeout(cont.ctx, 5*time.Second)
|
||||||
patchServiceOpts := k8meta.PatchOptions{}
|
patchServiceOpts := k8meta.PatchOptions{}
|
||||||
strategy := k8types.StrategicMergePatchType
|
strategy := k8types.StrategicMergePatchType
|
||||||
_, err = cont.clientset.CoreV1().Services(svc.Namespace).
|
_, err = cont.clientset.CoreV1().Services(oldSvc.Namespace).
|
||||||
Patch(ctx, svc.Name, strategy, patchBytes, patchServiceOpts, "status")
|
Patch(ctx, oldSvc.Name, strategy, patchBytes, patchServiceOpts, "status")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user