summaryrefslogtreecommitdiff
path: root/pkg/kube
diff options
context:
space:
mode:
authorMiguel Ángel García <magmax@users.noreply.github.com>2021-03-26 11:13:46 +0100
committerGitHub <noreply@github.com>2021-03-26 11:13:46 +0100
commit274d19c7a06a8413db07672d9983c0821f488ba5 (patch)
tree85029d70045bac81846b89fbcdb381320ce3ab6d /pkg/kube
parent21df300598eed7ca52a015a15de9e4ccc4d75107 (diff)
feat: #164 Send events on image change (#167)
* Send events on image change * fix lints * fix the rest of lints * Addressing feedback: parameterize kubeEvents * small fixes * Running kustomize * try to fix the problem after running make manifests * Move the message to the correct place * reduce annotation size and randomness * Provide full image names as well * goimports/lint
Diffstat (limited to 'pkg/kube')
-rw-r--r--pkg/kube/kubernetes.go43
-rw-r--r--pkg/kube/kubernetes_test.go30
2 files changed, 71 insertions, 2 deletions
diff --git a/pkg/kube/kubernetes.go b/pkg/kube/kubernetes.go
index a46efb1..bfe7dde 100644
--- a/pkg/kube/kubernetes.go
+++ b/pkg/kube/kubernetes.go
@@ -6,11 +6,14 @@ import (
"context"
"fmt"
"os"
+ "time"
"github.com/argoproj-labs/argocd-image-updater/pkg/metrics"
+ appv1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/pkg/client/clientset/versioned"
- v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ v1 "k8s.io/api/core/v1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)
@@ -68,7 +71,7 @@ func NewKubernetesClientFromConfig(ctx context.Context, namespace string, kubeco
// GetSecretData returns the raw data from named K8s secret in given namespace
func (client *KubernetesClient) GetSecretData(namespace string, secretName string) (map[string][]byte, error) {
- secret, err := client.Clientset.CoreV1().Secrets(namespace).Get(client.Context, secretName, v1.GetOptions{})
+ secret, err := client.Clientset.CoreV1().Secrets(namespace).Get(client.Context, secretName, metav1.GetOptions{})
metrics.Clients().IncreaseK8sClientRequest(1)
if err != nil {
metrics.Clients().IncreaseK8sClientRequest(1)
@@ -91,3 +94,39 @@ func (client *KubernetesClient) GetSecretField(namespace string, secretName stri
return string(data), nil
}
}
+
+// CreateApplicationevent creates a kubernetes event with a custom reason and message for an application.
+func (client *KubernetesClient) CreateApplicationEvent(app *appv1alpha1.Application, reason string, message string, annotations map[string]string) (*v1.Event, error) {
+ t := metav1.Time{Time: time.Now()}
+
+ event := v1.Event{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: fmt.Sprintf("%v.%x", app.ObjectMeta.Name, t.UnixNano()),
+ Namespace: client.Namespace,
+ Annotations: annotations,
+ },
+ Source: v1.EventSource{
+ Component: "ArgocdImageUpdater",
+ },
+ InvolvedObject: v1.ObjectReference{
+ Kind: app.Kind,
+ APIVersion: app.APIVersion,
+ Name: app.ObjectMeta.Name,
+ Namespace: app.ObjectMeta.Namespace,
+ ResourceVersion: app.ObjectMeta.ResourceVersion,
+ UID: app.ObjectMeta.UID,
+ },
+ FirstTimestamp: t,
+ LastTimestamp: t,
+ Count: 1,
+ Message: message,
+ Type: v1.EventTypeNormal,
+ Reason: reason,
+ }
+
+ result, err := client.Clientset.CoreV1().Events(client.Namespace).Create(client.Context, &event, metav1.CreateOptions{})
+ if err != nil {
+ return nil, err
+ }
+ return result, nil
+}
diff --git a/pkg/kube/kubernetes_test.go b/pkg/kube/kubernetes_test.go
index ef719d2..3fe6453 100644
--- a/pkg/kube/kubernetes_test.go
+++ b/pkg/kube/kubernetes_test.go
@@ -4,6 +4,9 @@ import (
"context"
"testing"
+ appv1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
"github.com/argoproj-labs/argocd-image-updater/test/fake"
"github.com/argoproj-labs/argocd-image-updater/test/fixture"
@@ -66,3 +69,30 @@ func Test_GetDataFromSecrets(t *testing.T) {
require.Empty(t, data)
})
}
+
+func Test_CreateApplicationEvent(t *testing.T) {
+ t.Run("Create Event", func(t *testing.T) {
+ application := &appv1alpha1.Application{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "test-app",
+ Namespace: "argocd",
+ },
+ Spec: appv1alpha1.ApplicationSpec{},
+ Status: appv1alpha1.ApplicationStatus{
+ Summary: appv1alpha1.ApplicationSummary{
+ Images: []string{"nginx:1.12.2", "that/image", "quay.io/dexidp/dex:v1.23.0"},
+ },
+ },
+ }
+ annotations := map[string]string{
+ "origin": "nginx:1.12.2",
+ }
+ clientset := fake.NewFakeClientsetWithResources()
+ client := &KubernetesClient{Clientset: clientset, Namespace: "default"}
+ event, err := client.CreateApplicationEvent(application, "TestEvent", "test-message", annotations)
+ require.NoError(t, err)
+ require.NotNil(t, event)
+ assert.Equal(t, "ArgocdImageUpdater", event.Source.Component)
+ assert.Equal(t, "default", client.Namespace)
+ })
+}