From c690d874c34bca5045ce57efaf64569604e225a1 Mon Sep 17 00:00:00 2001 From: Karolis Rusenas Date: Mon, 3 Jul 2017 22:50:36 +0100 Subject: [PATCH] setting annotations --- provider/kubernetes/unversioned_updates.go | 28 ++++++---- .../kubernetes/unversioned_updates_test.go | 42 ++++++++------ provider/kubernetes/versioned_updates.go | 18 +++--- provider/kubernetes/versioned_updates_test.go | 56 +++++++++++-------- types/types.go | 5 ++ 5 files changed, 89 insertions(+), 60 deletions(-) diff --git a/provider/kubernetes/unversioned_updates.go b/provider/kubernetes/unversioned_updates.go index 41ea9629..23cab94e 100644 --- a/provider/kubernetes/unversioned_updates.go +++ b/provider/kubernetes/unversioned_updates.go @@ -31,7 +31,7 @@ func (p *Provider) checkUnversionedDeployment(policy types.PolicyType, repo *typ // Remove version if any // containerImageName := versionreg.ReplaceAllString(c.Image, "") - conatinerImageRef, err := image.Parse(c.Image) + containerImageRef, err := image.Parse(c.Image) if err != nil { log.WithFields(log.Fields{ "error": err, @@ -43,41 +43,47 @@ func (p *Provider) checkUnversionedDeployment(policy types.PolicyType, repo *typ log.WithFields(log.Fields{ "name": deployment.Name, "namespace": deployment.Namespace, - "parsed_image_name": conatinerImageRef.Remote(), + "parsed_image_name": containerImageRef.Remote(), "target_image_name": repo.Name, "target_tag": repo.Tag, "policy": policy, "image": c.Image, }).Info("provider.kubernetes: checking image") - if conatinerImageRef.Repository() != eventRepoRef.Repository() { + if containerImageRef.Repository() != eventRepoRef.Repository() { log.WithFields(log.Fields{ - "parsed_image_name": conatinerImageRef.Remote(), + "parsed_image_name": containerImageRef.Remote(), "target_image_name": repo.Name, }).Info("provider.kubernetes: images do not match, ignoring") continue } // updating image - if conatinerImageRef.Registry() == image.DefaultRegistryHostname { - c.Image = fmt.Sprintf("%s:%s", conatinerImageRef.ShortName(), repo.Tag) + if containerImageRef.Registry() == image.DefaultRegistryHostname { + c.Image = fmt.Sprintf("%s:%s", containerImageRef.ShortName(), repo.Tag) } else { - c.Image = fmt.Sprintf("%s:%s", conatinerImageRef.Repository(), repo.Tag) + c.Image = fmt.Sprintf("%s:%s", containerImageRef.Repository(), repo.Tag) } deployment.Spec.Template.Spec.Containers[idx] = c // marking this deployment for update shouldUpdateDeployment = true + // updating annotations + annotations := deployment.GetAnnotations() // updating digest if available if repo.Digest != "" { - annotations := deployment.GetAnnotations() - annotations[types.KeelDigestAnnotation+"/"+conatinerImageRef.Remote()] = repo.Digest - deployment.SetAnnotations(annotations) + + annotations[types.KeelDigestAnnotation+"/"+containerImageRef.Remote()] = repo.Digest } + // adding image for updates + annotations = addImageToPull(annotations, c.Image) + + deployment.SetAnnotations(annotations) + log.WithFields(log.Fields{ - "parsed_image": conatinerImageRef.Remote(), + "parsed_image": containerImageRef.Remote(), "raw_image_name": c.Image, "target_image": repo.Name, "target_image_tag": repo.Tag, diff --git a/provider/kubernetes/unversioned_updates_test.go b/provider/kubernetes/unversioned_updates_test.go index c8e5589c..3b1a160d 100644 --- a/provider/kubernetes/unversioned_updates_test.go +++ b/provider/kubernetes/unversioned_updates_test.go @@ -37,9 +37,10 @@ func TestProvider_checkUnversionedDeployment(t *testing.T) { deployment: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -58,9 +59,10 @@ func TestProvider_checkUnversionedDeployment(t *testing.T) { wantUpdated: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{forceUpdateImageAnnotation: "gcr.io/v2-namespace/hello-world:latest"}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -86,9 +88,10 @@ func TestProvider_checkUnversionedDeployment(t *testing.T) { deployment: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -107,9 +110,10 @@ func TestProvider_checkUnversionedDeployment(t *testing.T) { wantUpdated: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -135,9 +139,10 @@ func TestProvider_checkUnversionedDeployment(t *testing.T) { deployment: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "force"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "force"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -156,9 +161,10 @@ func TestProvider_checkUnversionedDeployment(t *testing.T) { wantUpdated: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "force"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{forceUpdateImageAnnotation: "karolisr/keel:0.2.0"}, + Labels: map[string]string{types.KeelPolicyLabel: "force"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ diff --git a/provider/kubernetes/versioned_updates.go b/provider/kubernetes/versioned_updates.go index cf906cf9..96dcc747 100644 --- a/provider/kubernetes/versioned_updates.go +++ b/provider/kubernetes/versioned_updates.go @@ -71,12 +71,14 @@ func (p *Provider) checkVersionedDeployment(newVersion *types.Version, policy ty // marking this deployment for update shouldUpdateDeployment = true // updating digest if available - if repo.Digest != "" { - annotations := deployment.GetAnnotations() - annotations[types.KeelDigestAnnotation+"/"+conatinerImageRef.Remote()] = repo.Digest - deployment.SetAnnotations(annotations) - } + annotations := deployment.GetAnnotations() + if repo.Digest != "" { + annotations[types.KeelDigestAnnotation+"/"+conatinerImageRef.Remote()] = repo.Digest + } + annotations = addImageToPull(annotations, c.Image) + + deployment.SetAnnotations(annotations) log.WithFields(log.Fields{ "parsed_image": conatinerImageRef.Remote(), "raw_image_name": c.Image, @@ -135,12 +137,14 @@ func (p *Provider) checkVersionedDeployment(newVersion *types.Version, policy ty deployment.Spec.Template.Spec.Containers[idx] = c // marking this deployment for update shouldUpdateDeployment = true + + // updating annotations + annotations := deployment.GetAnnotations() // updating digest if available if repo.Digest != "" { - annotations := deployment.GetAnnotations() annotations[types.KeelDigestAnnotation+"/"+conatinerImageRef.Remote()] = repo.Digest - deployment.SetAnnotations(annotations) } + deployment.SetAnnotations(annotations) log.WithFields(log.Fields{ "parsed_image": conatinerImageRef.Remote(), diff --git a/provider/kubernetes/versioned_updates_test.go b/provider/kubernetes/versioned_updates_test.go index c7fd3f6e..8e87ee69 100644 --- a/provider/kubernetes/versioned_updates_test.go +++ b/provider/kubernetes/versioned_updates_test.go @@ -49,9 +49,10 @@ func TestProvider_checkVersionedDeployment(t *testing.T) { deployment: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -70,9 +71,10 @@ func TestProvider_checkVersionedDeployment(t *testing.T) { wantUpdated: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -99,9 +101,10 @@ func TestProvider_checkVersionedDeployment(t *testing.T) { deployment: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -120,9 +123,10 @@ func TestProvider_checkVersionedDeployment(t *testing.T) { wantUpdated: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -149,9 +153,10 @@ func TestProvider_checkVersionedDeployment(t *testing.T) { deployment: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -173,9 +178,10 @@ func TestProvider_checkVersionedDeployment(t *testing.T) { wantUpdated: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "all"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "all"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -205,9 +211,10 @@ func TestProvider_checkVersionedDeployment(t *testing.T) { deployment: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "force"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{}, + Labels: map[string]string{types.KeelPolicyLabel: "force"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ @@ -229,9 +236,10 @@ func TestProvider_checkVersionedDeployment(t *testing.T) { wantUpdated: v1beta1.Deployment{ meta_v1.TypeMeta{}, meta_v1.ObjectMeta{ - Name: "dep-1", - Namespace: "xxxx", - Labels: map[string]string{types.KeelPolicyLabel: "force"}, + Name: "dep-1", + Namespace: "xxxx", + Annotations: map[string]string{forceUpdateImageAnnotation: "gcr.io/v2-namespace/hello-world:1.1.2"}, + Labels: map[string]string{types.KeelPolicyLabel: "force"}, }, v1beta1.DeploymentSpec{ Template: v1.PodTemplateSpec{ diff --git a/types/types.go b/types/types.go index 5ab5d6d1..63b963f6 100644 --- a/types/types.go +++ b/types/types.go @@ -25,6 +25,11 @@ const KeelPollDefaultSchedule = "@every 1m" // KeelDigestAnnotation - digest annotation const KeelDigestAnnotation = "keel.sh/digest" +// KeelUpdateStrategyAnnotation - update strategy annotation is used to +// to inform provider how to handle update, ie: keel.sh/updateStrategy=pullImage +// will +const KeelUpdateStrategyAnnotation = "keel.sh/updateStrategy" + type Repository struct { Host string `json:"host"` Name string `json:"name"`