From b4003ae6939bba75dead88dd6fc16baea2a05ced Mon Sep 17 00:00:00 2001 From: Karolis Rusenas Date: Tue, 24 Apr 2018 09:26:45 +0100 Subject: [PATCH] gr fixes --- internal/k8s/resource.go | 31 +++++--- internal/k8s/translator.go | 3 + provider/kubernetes/kubernetes.go | 12 ++-- .../kubernetes/unversioned_updates_test.go | 72 +++++++++++++++++++ 4 files changed, 105 insertions(+), 13 deletions(-) diff --git a/internal/k8s/resource.go b/internal/k8s/resource.go index 208f3b3f..aff640e4 100644 --- a/internal/k8s/resource.go +++ b/internal/k8s/resource.go @@ -120,11 +120,11 @@ func (r *GenericResource) GetResource() interface{} { func (r *GenericResource) GetLabels() (labels map[string]string) { switch obj := r.obj.(type) { case *apps_v1.Deployment: - return obj.GetLabels() + return getOrInitialise(obj.GetLabels()) case *apps_v1.StatefulSet: - return obj.GetLabels() + return getOrInitialise(obj.GetLabels()) case *apps_v1.DaemonSet: - return obj.GetLabels() + return getOrInitialise(obj.GetLabels()) } return } @@ -152,9 +152,17 @@ func (r *GenericResource) GetSpecAnnotations() (annotations map[string]string) { } return a case *apps_v1.StatefulSet: - return obj.Spec.Template.GetAnnotations() + a := obj.Spec.Template.GetAnnotations() + if a == nil { + return make(map[string]string) + } + return a case *apps_v1.DaemonSet: - return obj.Spec.Template.GetAnnotations() + a := obj.Spec.Template.GetAnnotations() + if a == nil { + return make(map[string]string) + } + return a } return } @@ -172,15 +180,22 @@ func (r *GenericResource) SetSpecAnnotations(annotations map[string]string) { return } +func getOrInitialise(a map[string]string) map[string]string { + if a == nil { + return make(map[string]string) + } + return a +} + // GetAnnotations - get resource annotations func (r *GenericResource) GetAnnotations() (annotations map[string]string) { switch obj := r.obj.(type) { case *apps_v1.Deployment: - return obj.GetAnnotations() + return getOrInitialise(obj.GetAnnotations()) case *apps_v1.StatefulSet: - return obj.GetAnnotations() + return getOrInitialise(obj.GetAnnotations()) case *apps_v1.DaemonSet: - return obj.GetAnnotations() + return getOrInitialise(obj.GetAnnotations()) } return } diff --git a/internal/k8s/translator.go b/internal/k8s/translator.go index eb08c5c4..5376c955 100644 --- a/internal/k8s/translator.go +++ b/internal/k8s/translator.go @@ -18,6 +18,7 @@ func (t *Translator) OnAdd(obj interface{}) { t.Errorf("OnAdd failed to add resource %T: %#v", obj, obj) return } + t.Infof("added %s %s", gr.Kind(), gr.Name) t.GenericResourceCache.Add(gr) } @@ -27,6 +28,7 @@ func (t *Translator) OnUpdate(oldObj, newObj interface{}) { t.Errorf("OnUpdate failed to update resource %T: %#v", newObj, newObj) return } + t.Infof("updated %s %s", gr.Kind(), gr.Name) t.GenericResourceCache.Add(gr) } @@ -36,5 +38,6 @@ func (t *Translator) OnDelete(obj interface{}) { t.Errorf("OnDelete failed to delete resource %T: %#v", obj, obj) return } + t.Infof("deleted %s %s", gr.Kind(), gr.Name) t.GenericResourceCache.Remove(gr.GetIdentifier()) } diff --git a/provider/kubernetes/kubernetes.go b/provider/kubernetes/kubernetes.go index faf28bc5..e7887b88 100644 --- a/provider/kubernetes/kubernetes.go +++ b/provider/kubernetes/kubernetes.go @@ -28,7 +28,7 @@ var kubernetesVersionedUpdatesCounter = prometheus.NewCounterVec( Name: "kubernetes_versioned_updates_total", Help: "How many versioned deployments were updated, partitioned by deployment name.", }, - []string{"deployment"}, + []string{"kubernetes"}, ) var kubernetesUnversionedUpdatesCounter = prometheus.NewCounterVec( @@ -36,7 +36,7 @@ var kubernetesUnversionedUpdatesCounter = prometheus.NewCounterVec( Name: "kubernetes_unversioned_updates_total", Help: "How many unversioned deployments were updated, partitioned by deployment name.", }, - []string{"deployment"}, + []string{"kubernetes"}, ) func init() { @@ -261,15 +261,16 @@ func (p *Provider) updateDeployments(plans []*UpdatePlan) (updated []*k8s.Generi resource.SetAnnotations(annotations) err = p.implementer.Update(resource) - kubernetesVersionedUpdatesCounter.With(prometheus.Labels{resource.Kind(): fmt.Sprintf("%s/%s", resource.Namespace, resource.Name)}).Inc() + kubernetesVersionedUpdatesCounter.With(prometheus.Labels{"kubernetes": fmt.Sprintf("%s/%s", resource.Namespace, resource.Name)}).Inc() // } if err != nil { log.WithFields(log.Fields{ "error": err, "namespace": resource.Namespace, "deployment": resource.Name, + "kind": resource.Kind(), "update": fmt.Sprintf("%s->%s", plan.CurrentVersion, plan.NewVersion), - }).Error("provider.kubernetes: got error while update deployment") + }).Error("provider.kubernetes: got error while updating resource") p.sender.Send(types.EventNotification{ Name: "update resource", @@ -294,8 +295,9 @@ func (p *Provider) updateDeployments(plans []*UpdatePlan) (updated []*k8s.Generi log.WithFields(log.Fields{ "name": resource.Name, + "kind": resource.Kind(), "namespace": resource.Namespace, - }).Info("provider.kubernetes: deployment updated") + }).Info("provider.kubernetes: resource updated") updated = append(updated, resource) } diff --git a/provider/kubernetes/unversioned_updates_test.go b/provider/kubernetes/unversioned_updates_test.go index 340a6c6f..d59a94df 100644 --- a/provider/kubernetes/unversioned_updates_test.go +++ b/provider/kubernetes/unversioned_updates_test.go @@ -491,6 +491,78 @@ func TestProvider_checkUnversionedDeployment(t *testing.T) { wantShouldUpdateDeployment: false, wantErr: false, }, + { + name: "poll trigger, force-match, same tag on eu.gcr.io, daemonset", + args: args{ + policy: types.PolicyTypeForce, + repo: &types.Repository{Host: "eu.gcr.io", Name: "karolisr/keel", Tag: "latest-staging"}, + resource: MustParseGR(&apps_v1.DaemonSet{ + meta_v1.TypeMeta{}, + meta_v1.ObjectMeta{ + Name: "dep-1", + Namespace: "xxxx", + Labels: map[string]string{types.KeelPolicyLabel: "force"}, + Annotations: map[string]string{ + types.KeelPollScheduleAnnotation: types.KeelPollDefaultSchedule, + types.KeelForceTagMatchLabel: "yup", + }, + }, + apps_v1.DaemonSetSpec{ + Template: v1.PodTemplateSpec{ + ObjectMeta: meta_v1.ObjectMeta{ + Annotations: map[string]string{ + "this": "that", + }, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + v1.Container{ + Image: "eu.gcr.io/karolisr/keel:latest-staging", + }, + }, + }, + }, + }, + apps_v1.DaemonSetStatus{}, + }), + }, + wantUpdatePlan: &UpdatePlan{ + Resource: MustParseGR(&apps_v1.DaemonSet{ + meta_v1.TypeMeta{}, + meta_v1.ObjectMeta{ + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{ + types.KeelPollScheduleAnnotation: types.KeelPollDefaultSchedule, + types.KeelForceTagMatchLabel: "yup", + }, + Labels: map[string]string{types.KeelPolicyLabel: "force"}, + }, + apps_v1.DaemonSetSpec{ + Template: v1.PodTemplateSpec{ + ObjectMeta: meta_v1.ObjectMeta{ + Annotations: map[string]string{ + "this": "that", + // "time": timeutil.Now().String(), + }, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + v1.Container{ + Image: "eu.gcr.io/karolisr/keel:latest-staging", + }, + }, + }, + }, + }, + apps_v1.DaemonSetStatus{}, + }), + NewVersion: "latest-staging", + CurrentVersion: "latest-staging", + }, + wantShouldUpdateDeployment: true, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {