github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/pkg/kubernetes/resources/job/adapt.go (about)

     1  package job
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"strings"
     7  	"time"
     8  
     9  	"github.com/caos/orbos/pkg/kubernetes"
    10  	"github.com/caos/orbos/pkg/kubernetes/resources"
    11  	batch "k8s.io/api/batch/v1"
    12  	corev1 "k8s.io/api/core/v1"
    13  	macherrs "k8s.io/apimachinery/pkg/api/errors"
    14  )
    15  
    16  func AdaptFuncToEnsure(job *batch.Job) (resources.QueryFunc, error) {
    17  	return func(k8sClient kubernetes.ClientInt, _ map[string]interface{}) (resources.EnsureFunc, error) {
    18  
    19  		jobDef, err := k8sClient.GetJob(job.GetNamespace(), job.GetName())
    20  		if err != nil && !macherrs.IsNotFound(err) {
    21  			return nil, err
    22  		} else if macherrs.IsNotFound(err) {
    23  			return func(k8sClient kubernetes.ClientInt) error {
    24  				return k8sClient.ApplyJob(job)
    25  			}, nil
    26  		}
    27  
    28  		jobDry := *job
    29  		if job.Spec.Selector == nil {
    30  			jobDry.Spec.Selector = jobDef.Spec.Selector
    31  		}
    32  		if job.Spec.Template.Labels == nil {
    33  			jobDry.Spec.Template.Labels = jobDef.Spec.Template.Labels
    34  		}
    35  		if err := k8sClient.ApplyJobDryRun(&jobDry); err != nil && !strings.Contains(err.Error(), "field is immutable") {
    36  			return nil, err
    37  		}
    38  
    39  		if jobDef.Spec.Template.Spec.SecurityContext != nil && jobDry.Spec.Template.Spec.SecurityContext == nil {
    40  			jobDry.Spec.Template.Spec.SecurityContext = &corev1.PodSecurityContext{}
    41  		}
    42  
    43  		if reflect.DeepEqual(jobDry.Spec.Template.Spec, jobDef.Spec.Template.Spec) &&
    44  			fmt.Sprint(jobDry.Labels) == fmt.Sprint(jobDef.Labels) &&
    45  			fmt.Sprint(jobDry.Annotations) == fmt.Sprint(jobDef.Annotations) {
    46  			return func(k8sClient kubernetes.ClientInt) error {
    47  				return nil
    48  			}, nil
    49  		}
    50  
    51  		return func(k8sClient kubernetes.ClientInt) error {
    52  			if err := k8sClient.ApplyJob(job); err != nil && strings.Contains(err.Error(), "field is immutable") {
    53  				if err := k8sClient.DeleteJob(job.GetNamespace(), job.GetName()); err != nil {
    54  					return err
    55  				}
    56  				time.Sleep(1 * time.Second)
    57  				return k8sClient.ApplyJob(job)
    58  			}
    59  			return err
    60  		}, nil
    61  	}, nil
    62  }
    63  
    64  func AdaptFuncToDestroy(namespace, name string) (resources.DestroyFunc, error) {
    65  	return func(client kubernetes.ClientInt) error {
    66  		return client.DeleteJob(namespace, name)
    67  	}, nil
    68  }