forked from nearmap/kcd
/
cron.go
74 lines (68 loc) · 2.26 KB
/
cron.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package k8s
import (
"fmt"
"strings"
cv1 "github.com/nearmap/cvmanager/gok8s/apis/custom/v1"
errs "github.com/nearmap/cvmanager/registry/errs"
"github.com/pkg/errors"
corev1 "k8s.io/api/core/v1"
k8serr "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
types "k8s.io/apimachinery/pkg/types"
)
const cronJobs = "CronJob"
func (k *K8sProvider) syncCronJobs(cv *cv1.ContainerVersion, version string, listOpts metav1.ListOptions) error {
// BatchV2alpha1 is 10.x onwards
ds, err := k.cs.BatchV1beta1().CronJobs(k.namespace).List(listOpts)
if err != nil {
k.Recorder.Event(k.Pod, corev1.EventTypeWarning, "CRSyncFailed", "Failed to get dependent cronjobs")
return errors.Wrap(err, "failed to read cronjobs ")
}
for _, d := range ds.Items {
if ci, err := k.checkPodSpec(d.Spec.JobTemplate.Spec.Template, d.Name, version, cv); err != nil {
if err == errs.ErrVersionMismatch {
return k.patchPodSpec(d.Spec.JobTemplate.Spec.Template, d.Name, ci, cv, func(i int) error {
_, err := k.cs.BatchV2alpha1().CronJobs(k.namespace).Patch(d.ObjectMeta.Name, types.StrategicMergePatchType,
[]byte(fmt.Sprintf(fmt.Sprintf(`
{
"spec": {
"jobTemplate": %s
}
}
}
`, podTemplateSpec), d.Spec.JobTemplate.Spec.Template.Spec.Containers[i].Name, cv.Spec.ImageRepo, version)))
return err
}, func() string { return cronJobs })
} else {
k.raiseSyncPodErrEvents(err, cronJobs, d.Name, cv.Spec.Tag, version)
}
}
}
return nil
}
func (k *K8sProvider) cvCronJobs(cv *cv1.ContainerVersion, listOpts metav1.ListOptions) ([]*Resource, error) {
ds, err := k.cs.BatchV1beta1().CronJobs(cv.Namespace).List(listOpts)
if err != nil {
if k8serr.IsNotFound(err) {
return nil, nil
}
return nil, errors.Wrap(err, "Failed to fetch cronjob")
}
var cvsList []*Resource
for _, dd := range ds.Items {
for _, c := range dd.Spec.JobTemplate.Spec.Template.Spec.Containers {
if cv.Spec.Container == c.Name {
cvsList = append(cvsList, &Resource{
Namespace: cv.Namespace,
Name: dd.Name,
Type: cronJobs,
Container: c.Name,
Version: strings.SplitAfterN(c.Image, ":", 2)[1],
CV: cv.Name,
Tag: cv.Spec.Tag,
})
}
}
}
return cvsList, nil
}