Skip to content

Commit 2de8aad

Browse files
author
Ahmed El-Sayed
authored
Merge pull request #110 from weaveworks/dev
Reference flux objects in violations events instead of the original resource object
2 parents cedd4ab + 9ddde49 commit 2de8aad

File tree

8 files changed

+122
-45
lines changed

8 files changed

+122
-45
lines changed

helm/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
apiVersion: v2
2-
appVersion: "1.2.0"
2+
appVersion: "1.2.1"
33
description: A Helm chart for Kubernetes to configure the policy agent
44
name: policy-agent
5-
version: 1.2.0
5+
version: 1.2.1
66
maintainers:
77
- name: Weaveworks
88
email: support@weave.works

internal/sink/flux-notification/flux_notification.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/MagalixTechnologies/core/logger"
88
"github.com/MagalixTechnologies/policy-core/domain"
9+
"github.com/weaveworks/policy-agent/internal/utils"
910
"k8s.io/client-go/tools/record"
1011
)
1112

@@ -65,7 +66,7 @@ func (f *FluxNotificationSink) writeWorker(ctx context.Context) error {
6566
}
6667

6768
func (f *FluxNotificationSink) write(result domain.PolicyValidation) {
68-
fluxObject := getFluxObject(result.Entity.Labels)
69+
fluxObject := utils.GetFluxObject(result.Entity.Labels)
6970
if fluxObject == nil {
7071
logger.Debugw(
7172
fmt.Sprintf("discarding %s result for orphan entity", result.Type),

internal/sink/flux-notification/utils_test.go

Lines changed: 0 additions & 30 deletions
This file was deleted.

internal/sink/k8s-event/k8s_event.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/MagalixTechnologies/core/logger"
88
"github.com/MagalixTechnologies/policy-core/domain"
9+
"github.com/weaveworks/policy-agent/internal/utils"
910
v1 "k8s.io/api/core/v1"
1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1112

@@ -90,6 +91,20 @@ func (k *K8sEventSink) write(ctx context.Context, result domain.PolicyValidation
9091
)
9192
return
9293
}
94+
95+
fluxObject := utils.GetFluxObject(result.Entity.Labels)
96+
if fluxObject != nil {
97+
event.InvolvedObject = v1.ObjectReference{
98+
UID: fluxObject.GetUID(),
99+
APIVersion: fluxObject.GetAPIVersion(),
100+
Kind: fluxObject.GetKind(),
101+
Name: fluxObject.GetName(),
102+
Namespace: fluxObject.GetNamespace(),
103+
ResourceVersion: fluxObject.GetResourceVersion(),
104+
}
105+
event.Namespace = fluxObject.GetNamespace()
106+
}
107+
93108
event.ReportingController = k.reportingController
94109
event.ReportingInstance = k.reportingInstance
95110
event.Source = v1.EventSource{Component: k.reportingController}

internal/sink/k8s-event/k8s_event_test.go

Lines changed: 70 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,41 @@ func TestK8sEventSink(t *testing.T) {
5757
Labels: map[string]string{},
5858
}
5959

60+
fluxHelmViolatingEntity := domain.Entity{
61+
ID: uuid.NewV4().String(),
62+
APIVersion: "v1",
63+
Kind: "Deployment",
64+
Name: "my-helm-violating-entity",
65+
Namespace: "default",
66+
Manifest: map[string]interface{}{},
67+
ResourceVersion: "1",
68+
Labels: map[string]string{
69+
"helm.toolkit.fluxcd.io/name": "my-helm-app-name",
70+
"helm.toolkit.fluxcd.io/namespace": "my-helm-app-namespace",
71+
},
72+
}
73+
74+
fluxKustomizeViolatingEntity := domain.Entity{
75+
ID: uuid.NewV4().String(),
76+
APIVersion: "v1",
77+
Kind: "Deployment",
78+
Name: "my-kustomize-violating-entity",
79+
Namespace: "default",
80+
Manifest: map[string]interface{}{},
81+
ResourceVersion: "1",
82+
Labels: map[string]string{
83+
"kustomize.toolkit.fluxcd.io/name": "my-kustomize-app-name",
84+
"kustomize.toolkit.fluxcd.io/namespace": "my-kustomize-app-namespace",
85+
},
86+
}
87+
6088
results := []domain.PolicyValidation{
6189
{
6290
ID: uuid.NewV4().String(),
6391
Policy: policy,
6492
Entity: violatingEntity,
6593
Status: domain.PolicyValidationStatusViolating,
66-
Message: "message",
94+
Message: "violating-entity",
6795
Type: "Admission",
6896
Trigger: "Admission",
6997
CreatedAt: time.Now(),
@@ -73,7 +101,27 @@ func TestK8sEventSink(t *testing.T) {
73101
Policy: policy,
74102
Entity: compliantEntity,
75103
Status: domain.PolicyValidationStatusCompliant,
76-
Message: "message",
104+
Message: "compliant-entity",
105+
Type: "Admission",
106+
Trigger: "Admission",
107+
CreatedAt: time.Now(),
108+
},
109+
{
110+
ID: uuid.NewV4().String(),
111+
Policy: policy,
112+
Entity: fluxHelmViolatingEntity,
113+
Status: domain.PolicyValidationStatusViolating,
114+
Message: "flux-helm-entity",
115+
Type: "Admission",
116+
Trigger: "Admission",
117+
CreatedAt: time.Now(),
118+
},
119+
{
120+
ID: uuid.NewV4().String(),
121+
Policy: policy,
122+
Entity: fluxKustomizeViolatingEntity,
123+
Status: domain.PolicyValidationStatusViolating,
124+
Message: "flux-kustomize-entity",
77125
Type: "Admission",
78126
Trigger: "Admission",
79127
CreatedAt: time.Now(),
@@ -93,35 +141,49 @@ func TestK8sEventSink(t *testing.T) {
93141
t.Error(err)
94142
}
95143

96-
time.Sleep(2 * time.Second)
144+
time.Sleep(4 * time.Second)
97145

98146
events, err := sink.kubeClient.CoreV1().Events("").List(ctx, metav1.ListOptions{})
99147
if err != nil {
100148
t.Error(err)
101149
}
102150

103-
assert.Equal(t, len(events.Items), 2, "did not receive expected events")
151+
assert.Equal(t, len(events.Items), 4, "did not receive expected events")
104152

105153
for _, event := range events.Items {
106-
if event.Type == v1.EventTypeWarning {
154+
if event.Message == "violating-entity" {
107155
assert.Equal(t, event.Reason, domain.EventReasonPolicyViolation)
108156
assert.Equal(t, event.Action, domain.EventActionRejected)
109-
110157
// verify involved object holds entity info
111158
assert.Equal(t, event.InvolvedObject.APIVersion, violatingEntity.APIVersion)
112159
assert.Equal(t, event.InvolvedObject.Kind, violatingEntity.Kind)
113160
assert.Equal(t, event.InvolvedObject.Name, violatingEntity.Name)
114161
assert.Equal(t, event.InvolvedObject.Namespace, violatingEntity.Namespace)
115162

116-
} else if event.Type == v1.EventTypeNormal {
163+
} else if event.Message == "compliant-entity" {
117164
assert.Equal(t, event.Reason, domain.EventReasonPolicyCompliance)
118165
assert.Equal(t, event.Action, domain.EventActionAllowed)
119-
120166
// verify involved object holds entity info
121167
assert.Equal(t, event.InvolvedObject.APIVersion, compliantEntity.APIVersion)
122168
assert.Equal(t, event.InvolvedObject.Kind, compliantEntity.Kind)
123169
assert.Equal(t, event.InvolvedObject.Name, compliantEntity.Name)
124170
assert.Equal(t, event.InvolvedObject.Namespace, compliantEntity.Namespace)
171+
} else if event.Message == "flux-helm-entity" {
172+
assert.Equal(t, event.Reason, domain.EventReasonPolicyViolation)
173+
assert.Equal(t, event.Action, domain.EventActionRejected)
174+
// verify involved object holds entity info
175+
assert.Equal(t, event.InvolvedObject.APIVersion, "helm.toolkit.fluxcd.io")
176+
assert.Equal(t, event.InvolvedObject.Kind, "HelmRelease")
177+
assert.Equal(t, event.InvolvedObject.Name, "my-helm-app-name")
178+
assert.Equal(t, event.InvolvedObject.Namespace, "my-helm-app-namespace")
179+
} else if event.Message == "compliant-entity" {
180+
assert.Equal(t, event.Reason, domain.EventReasonPolicyViolation)
181+
assert.Equal(t, event.Action, domain.EventActionRejected)
182+
// verify involved object holds entity info
183+
assert.Equal(t, event.InvolvedObject.APIVersion, "kustomize.toolkit.fluxcd.io")
184+
assert.Equal(t, event.InvolvedObject.Kind, "Kustomization")
185+
assert.Equal(t, event.InvolvedObject.Name, "my-kustomize-app-name")
186+
assert.Equal(t, event.InvolvedObject.Namespace, "my-kustomize-app-namespace")
125187
}
126188

127189
// verify involved object holds entity info

internal/sink/flux-notification/utils.go renamed to internal/utils/utils.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
package flux_notification
1+
package utils
22

33
import (
44
"fmt"
55

66
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
7-
"k8s.io/apimachinery/pkg/runtime"
87
)
98

109
var fluxControllerKindMap = map[string]string{
1110
"helm.toolkit.fluxcd.io": "HelmRelease",
1211
"kustomize.toolkit.fluxcd.io": "Kustomization",
1312
}
1413

15-
func getFluxObject(labels map[string]string) runtime.Object {
14+
func GetFluxObject(labels map[string]string) *unstructured.Unstructured {
1615
for apiVersion, kind := range fluxControllerKindMap {
1716
name, ok := labels[fmt.Sprintf("%s/name", apiVersion)]
1817
if !ok {

internal/utils/utils_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package utils
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestGetFluxObject(t *testing.T) {
11+
fluxObj := GetFluxObject(map[string]string{})
12+
13+
if fluxObj != nil {
14+
t.Error("unexpected flux object")
15+
}
16+
17+
for apiVersion, kind := range fluxControllerKindMap {
18+
fluxObj := GetFluxObject(map[string]string{
19+
fmt.Sprintf("%s/name", apiVersion): "my-app",
20+
fmt.Sprintf("%s/namespace", apiVersion): "default",
21+
})
22+
23+
assert.NotEqual(t, fluxObj, nil)
24+
25+
assert.Equal(t, fluxObj.GetAPIVersion(), apiVersion)
26+
assert.Equal(t, fluxObj.GetKind(), kind)
27+
assert.Equal(t, fluxObj.GetNamespace(), "default")
28+
assert.Equal(t, fluxObj.GetName(), "my-app")
29+
}
30+
}

version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.2.0
1+
1.2.1

0 commit comments

Comments
 (0)