Skip to content

Commit fcc07f0

Browse files
authored
Merge pull request #1049 from fluxcd/prevent-flux-overrides
Prevent Flux from overriding Flagger managed objects
2 parents 3f43526 + 45ecaa9 commit fcc07f0

File tree

5 files changed

+39
-6
lines changed

5 files changed

+39
-6
lines changed

pkg/router/kubernetes_default.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, nam
150150
Name: name,
151151
Namespace: canary.Namespace,
152152
Labels: metadata.Labels,
153-
Annotations: metadata.Annotations,
153+
Annotations: filterMetadata(metadata.Annotations),
154154
OwnerReferences: []metav1.OwnerReference{
155155
*metav1.NewControllerRef(canary, schema.GroupVersionKind{
156156
Group: flaggerv1.SchemeGroupVersion.Group,
@@ -217,6 +217,10 @@ func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, nam
217217
}
218218

219219
if updateService {
220+
if svcClone.ObjectMeta.Annotations == nil {
221+
svcClone.ObjectMeta.Annotations = make(map[string]string)
222+
}
223+
svcClone.ObjectMeta.Annotations = filterMetadata(svcClone.ObjectMeta.Annotations)
220224
_, err = c.kubeClient.CoreV1().Services(canary.Namespace).Update(context.TODO(), svcClone, metav1.UpdateOptions{})
221225
if err != nil {
222226
return fmt.Errorf("service %s update error: %w", name, err)

pkg/router/kubernetes_default_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ func TestServiceRouter_InitializeMetadata(t *testing.T) {
391391

392392
primarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get(context.TODO(), "podinfo-primary", metav1.GetOptions{})
393393
require.NoError(t, err)
394-
assert.Equal(t, 0, len(primarySvc.Annotations))
394+
assert.Equal(t, 1, len(primarySvc.Annotations))
395395
assert.Equal(t, "podinfo-primary", primarySvc.Labels["app"])
396396
}
397397

@@ -423,12 +423,12 @@ func TestServiceRouter_ReconcileMetadata(t *testing.T) {
423423

424424
canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get(context.TODO(), "podinfo-canary", metav1.GetOptions{})
425425
require.NoError(t, err)
426-
assert.Equal(t, 0, len(canarySvc.Annotations))
426+
assert.Equal(t, 1, len(canarySvc.Annotations))
427427
assert.Equal(t, "podinfo-canary", canarySvc.Labels["app"])
428428

429429
primarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get(context.TODO(), "podinfo-primary", metav1.GetOptions{})
430430
require.NoError(t, err)
431-
assert.Equal(t, 0, len(primarySvc.Annotations))
431+
assert.Equal(t, 1, len(primarySvc.Annotations))
432432
assert.Equal(t, "podinfo-primary", primarySvc.Labels["app"])
433433

434434
mocks.canary.Spec.Service.Apex = &flaggerv1.CustomMetadata{

pkg/router/traefik_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestTraefikRouter_Reconcile(t *testing.T) {
5252
assert.Equal(t, uint(100), services[0].Weight)
5353

5454
assert.Equal(t, ts.ObjectMeta.Labels, mocks.canary.Spec.Service.Apex.Labels)
55-
assert.Equal(t, ts.ObjectMeta.Annotations, mocks.canary.Spec.Service.Apex.Annotations)
55+
assert.Equal(t, ts.ObjectMeta.Annotations, filterMetadata(mocks.canary.Spec.Service.Apex.Annotations))
5656

5757
for _, tt := range []struct {
5858
name string

pkg/router/util.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import (
44
"strings"
55
)
66

7-
const toolkitMarker = "toolkit.fluxcd.io"
7+
const (
8+
toolkitMarker = "toolkit.fluxcd.io"
9+
toolkitReconcileKey = "kustomize.toolkit.fluxcd.io/reconcile"
10+
toolkitReconcileValue = "disabled"
11+
)
812

913
func includeLabelsByPrefix(labels map[string]string, includeLabelPrefixes []string) map[string]string {
1014
filteredLabels := make(map[string]string)
@@ -26,10 +30,14 @@ func includeLabelsByPrefix(labels map[string]string, includeLabelPrefixes []stri
2630
func filterMetadata(meta map[string]string) map[string]string {
2731
res := make(map[string]string)
2832
for k, v := range meta {
33+
// remove Flux ownership
2934
if strings.Contains(k, toolkitMarker) {
3035
continue
3136
}
3237
res[k] = v
3338
}
39+
40+
// prevent Flux from overriding Flagger managed objects
41+
res[toolkitReconcileKey] = toolkitReconcileValue
3442
return res
3543
}

test/kubernetes/test-deployment.sh

+21
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@ set -o errexit
88
REPO_ROOT=$(git rev-parse --show-toplevel)
99

1010
cat <<EOF | kubectl apply -f -
11+
apiVersion: v1
12+
kind: Service
13+
metadata:
14+
name: podinfo-svc
15+
namespace: test
16+
spec:
17+
type: ClusterIP
18+
selector:
19+
app: podinfo
20+
ports:
21+
- name: http
22+
port: 9898
23+
protocol: TCP
24+
targetPort: http
25+
---
1126
apiVersion: flagger.app/v1beta1
1227
kind: Canary
1328
metadata:
@@ -72,6 +87,12 @@ until ${ok}; do
7287
fi
7388
done
7489

90+
passed=$(kubectl -n test get svc/podinfo-svc -oyaml 2>&1 | { grep 'kustomize.toolkit.fluxcd.io/reconcile' || true; })
91+
if [ -z "$passed" ]; then
92+
echo -e '\u2716 toolkit annotation test failed'
93+
kubectl -n test get svc/podinfo-svc -oyaml
94+
exit 1
95+
fi
7596
passed=$(kubectl -n test get deploy/podinfo-primary -oyaml 2>&1 | { grep test-label-prefix || true; })
7697
if [ -z "$passed" ]; then
7798
echo -e '\u2716 primary copy labels by prefix test failed'

0 commit comments

Comments
 (0)