Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#251 initial work on cron job support #257

Merged
merged 5 commits into from
Aug 29, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
#251 initial work on cron job support
  • Loading branch information
rusenask committed Aug 29, 2018
commit 25fa0e33a23d7b1b5a67d93cc9e314d20aa39f3a
11 changes: 11 additions & 0 deletions internal/k8s/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package k8s

import (
apps_v1 "k8s.io/api/apps/v1"
v1beta1 "k8s.io/api/batch/v1beta1"
core_v1 "k8s.io/api/core/v1"
)

Expand Down Expand Up @@ -50,3 +51,13 @@ func getDaemonsetSetIdentifier(s *apps_v1.DaemonSet) string {
func updateDaemonsetSetContainer(s *apps_v1.DaemonSet, index int, image string) {
s.Spec.Template.Spec.Containers[index].Image = image
}

// cron

func getCronJobIdentifier(s *v1beta1.CronJob) string {
return "cronjob/" + s.Namespace + "/" + s.Name
}

func updateCronJobContainer(s *v1beta1.CronJob, index int, image string) {
s.Spec.JobTemplate.Spec.Template.Spec.Containers[index].Image = image
}
37 changes: 33 additions & 4 deletions internal/k8s/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"strings"

apps_v1 "k8s.io/api/apps/v1"
v1beta1 "k8s.io/api/batch/v1beta1"
core_v1 "k8s.io/api/core/v1"
)

Expand Down Expand Up @@ -40,6 +41,8 @@ func NewGenericResource(obj interface{}) (*GenericResource, error) {
switch obj.(type) {
case *apps_v1.Deployment, *apps_v1.StatefulSet, *apps_v1.DaemonSet:
// ok
case *v1beta1.CronJob:
// ok
default:
return nil, fmt.Errorf("unsupported resource type: %v", reflect.TypeOf(obj).Kind())
}
Expand Down Expand Up @@ -76,6 +79,8 @@ func (r *GenericResource) DeepCopy() *GenericResource {
gr.obj = obj.DeepCopy()
case *apps_v1.DaemonSet:
gr.obj = obj.DeepCopy()
case *v1beta1.CronJob:
gr.obj = obj.DeepCopy()
}

return gr
Expand All @@ -90,6 +95,8 @@ func (r *GenericResource) GetIdentifier() string {
return getStatefulSetIdentifier(obj)
case *apps_v1.DaemonSet:
return getDaemonsetSetIdentifier(obj)
case *v1beta1.CronJob:
return getCronJobIdentifier(obj)
}
return ""
}
Expand All @@ -103,6 +110,8 @@ func (r *GenericResource) GetName() string {
return obj.GetName()
case *apps_v1.DaemonSet:
return obj.GetName()
case *v1beta1.CronJob:
return obj.GetName()
}
return ""
}
Expand All @@ -116,6 +125,8 @@ func (r *GenericResource) GetNamespace() string {
return obj.GetNamespace()
case *apps_v1.DaemonSet:
return obj.GetNamespace()
case *v1beta1.CronJob:
return obj.GetNamespace()
}
return ""
}
Expand All @@ -129,6 +140,8 @@ func (r *GenericResource) Kind() string {
return "statefulset"
case *apps_v1.DaemonSet:
return "daemonset"
case *v1beta1.CronJob:
return "cronjob"
}
return ""
}
Expand All @@ -147,6 +160,8 @@ func (r *GenericResource) GetLabels() (labels map[string]string) {
return getOrInitialise(obj.GetLabels())
case *apps_v1.DaemonSet:
return getOrInitialise(obj.GetLabels())
case *v1beta1.CronJob:
return getOrInitialise(obj.GetLabels())
}
return
}
Expand All @@ -160,8 +175,9 @@ func (r *GenericResource) SetLabels(labels map[string]string) {
obj.SetLabels(labels)
case *apps_v1.DaemonSet:
obj.SetLabels(labels)
case *v1beta1.CronJob:
obj.SetLabels(labels)
}
return
}

// GetSpecAnnotations - get resource spec template annotations
Expand All @@ -173,6 +189,8 @@ func (r *GenericResource) GetSpecAnnotations() (annotations map[string]string) {
return getOrInitialise(obj.Spec.Template.GetAnnotations())
case *apps_v1.DaemonSet:
return getOrInitialise(obj.Spec.Template.GetAnnotations())
case *v1beta1.CronJob:
return getOrInitialise(obj.Spec.JobTemplate.GetAnnotations())
}
return
}
Expand All @@ -186,8 +204,9 @@ func (r *GenericResource) SetSpecAnnotations(annotations map[string]string) {
obj.Spec.Template.SetAnnotations(annotations)
case *apps_v1.DaemonSet:
obj.Spec.Template.SetAnnotations(annotations)
case *v1beta1.CronJob:
obj.Spec.JobTemplate.SetAnnotations(annotations)
}
return
}

func getOrInitialise(a map[string]string) map[string]string {
Expand All @@ -206,6 +225,8 @@ func (r *GenericResource) GetAnnotations() (annotations map[string]string) {
return getOrInitialise(obj.GetAnnotations())
case *apps_v1.DaemonSet:
return getOrInitialise(obj.GetAnnotations())
case *v1beta1.CronJob:
return getOrInitialise(obj.GetAnnotations())
}
return
}
Expand All @@ -219,8 +240,9 @@ func (r *GenericResource) SetAnnotations(annotations map[string]string) {
obj.SetAnnotations(annotations)
case *apps_v1.DaemonSet:
obj.SetAnnotations(annotations)
case *v1beta1.CronJob:
obj.SetAnnotations(annotations)
}
return
}

// GetImagePullSecrets - returns secrets from pod spec
Expand All @@ -232,6 +254,8 @@ func (r *GenericResource) GetImagePullSecrets() (secrets []string) {
return getImagePullSecrets(obj.Spec.Template.Spec.ImagePullSecrets)
case *apps_v1.DaemonSet:
return getImagePullSecrets(obj.Spec.Template.Spec.ImagePullSecrets)
case *v1beta1.CronJob:
return getImagePullSecrets(obj.Spec.JobTemplate.Spec.Template.Spec.ImagePullSecrets)
}
return
}
Expand All @@ -245,6 +269,8 @@ func (r *GenericResource) GetImages() (images []string) {
return getContainerImages(obj.Spec.Template.Spec.Containers)
case *apps_v1.DaemonSet:
return getContainerImages(obj.Spec.Template.Spec.Containers)
case *v1beta1.CronJob:
return getContainerImages(obj.Spec.JobTemplate.Spec.Template.Spec.Containers)
}
return
}
Expand All @@ -258,6 +284,8 @@ func (r *GenericResource) Containers() (containers []core_v1.Container) {
return obj.Spec.Template.Spec.Containers
case *apps_v1.DaemonSet:
return obj.Spec.Template.Spec.Containers
case *v1beta1.CronJob:
return obj.Spec.JobTemplate.Spec.Template.Spec.Containers
}
return
}
Expand All @@ -271,6 +299,7 @@ func (r *GenericResource) UpdateContainer(index int, image string) {
updateStatefulSetContainer(obj, index, image)
case *apps_v1.DaemonSet:
updateDaemonsetSetContainer(obj, index, image)
case *v1beta1.CronJob:
updateCronJobContainer(obj, index, image)
}
return
}
6 changes: 6 additions & 0 deletions internal/k8s/watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/sirupsen/logrus"

apps_v1 "k8s.io/api/apps/v1"
v1beta1 "k8s.io/api/batch/v1beta1"
"k8s.io/api/core/v1"

"k8s.io/apimachinery/pkg/fields"
Expand All @@ -30,6 +31,11 @@ func WatchDaemonSets(g *workgroup.Group, client *kubernetes.Clientset, log logru
watch(g, client.AppsV1().RESTClient(), log, "daemonsets", new(apps_v1.DaemonSet), rs...)
}

// WatchCronJobs creates a SharedInformer for v1beta1.CronJob and registers it with g.
func WatchCronJobs(g *workgroup.Group, client *kubernetes.Clientset, log logrus.FieldLogger, rs ...cache.ResourceEventHandler) {
watch(g, client.BatchV1beta1().RESTClient(), log, "cronjobs", new(v1beta1.CronJob), rs...)
}

func watch(g *workgroup.Group, c cache.Getter, log logrus.FieldLogger, resource string, objType runtime.Object, rs ...cache.ResourceEventHandler) {
lw := cache.NewListWatchFromClient(c, resource, v1.NamespaceAll, fields.Everything())
sw := cache.NewSharedInformer(lw, objType, 30*time.Minute)
Expand Down