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 }