Skip to content

[K8s Plugin] Add helper function to add variant label and annotation #5857

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 22, 2025
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions pkg/app/pipedv1/plugin/kubernetes/deployment/misc.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,15 @@ func makeSuffixedName(name, suffix string) string {
}
return name
}

// addVariantLabelsAndAnnotations adds the variant label and annotation to the given manifests.
func addVariantLabelsAndAnnotations(m []provider.Manifest, variantLabel, variant string) {
for _, m := range m {
m.AddLabels(map[string]string{
variantLabel: variant,
})
m.AddAnnotations(map[string]string{
variantLabel: variant,
})
}
}
73 changes: 73 additions & 0 deletions pkg/app/pipedv1/plugin/kubernetes/deployment/misc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,3 +276,76 @@ spec:
})
}
}

func TestAddVariantLabelsAndAnnotations(t *testing.T) {
t.Parallel()

testcases := []struct {
name string
inputYAML string
variantLabel string
variant string
wantLabels map[string]string
wantAnnots map[string]string
}{
{
name: "single manifest",
inputYAML: `
apiVersion: v1
kind: ConfigMap
metadata:
name: test-config
`,
variantLabel: "pipecd.dev/variant",
variant: "primary",
wantLabels: map[string]string{"pipecd.dev/variant": "primary"},
wantAnnots: map[string]string{"pipecd.dev/variant": "primary"},
},
{
name: "multiple manifests",
inputYAML: `
apiVersion: v1
kind: ConfigMap
metadata:
name: config1
---
apiVersion: v1
kind: ConfigMap
metadata:
name: config2
`,
variantLabel: "custom/label",
variant: "canary",
wantLabels: map[string]string{"custom/label": "canary"},
wantAnnots: map[string]string{"custom/label": "canary"},
},
}

for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
manifests, err := provider.ParseManifests(tc.inputYAML)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add t.Parallel()? (I'm not confident😅)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, thank you. I'll add it.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added.
c98d2af

require.NoError(t, err)
require.NotEmpty(t, manifests)

addVariantLabelsAndAnnotations(manifests, tc.variantLabel, tc.variant)

for _, m := range manifests {
labelsMap, _, err := m.NestedMap("metadata", "labels")
require.NoError(t, err)
labels := map[string]string{}
for k, v := range labelsMap {
if strVal, ok := v.(string); ok {
labels[k] = strVal
}
}
for k, v := range tc.wantLabels {
assert.Equal(t, v, labels[k], "label %q should be %q", k, v)
}
annots := m.GetAnnotations()
for k, v := range tc.wantAnnots {
assert.Equal(t, v, annots[k], "annotation %q should be %q", k, v)
}
}
})
}
}
10 changes: 1 addition & 9 deletions pkg/app/pipedv1/plugin/kubernetes/deployment/primary.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,7 @@ func (p *Plugin) executeK8sPrimaryRolloutStage(ctx context.Context, input *sdk.E
}
lp.Successf("Successfully generated %d manifests for PRIMARY variant", len(primaryManifests))

// Add variant annotations to all manifests.
for i := range primaryManifests {
primaryManifests[i].AddLabels(map[string]string{
variantLabel: primaryVariant,
})
primaryManifests[i].AddAnnotations(map[string]string{
variantLabel: primaryVariant,
})
}
addVariantLabelsAndAnnotations(primaryManifests, variantLabel, primaryVariant)

if err := annotateConfigHash(primaryManifests); err != nil {
lp.Errorf("Unable to set %q annotation into the workload manifest (%v)", provider.AnnotationConfigHash, err)
Expand Down
10 changes: 1 addition & 9 deletions pkg/app/pipedv1/plugin/kubernetes/deployment/rollback.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,7 @@ func (p *Plugin) executeK8sRollbackStage(ctx context.Context, input *sdk.Execute
}
}

// Add variant labels and annotations to all manifests.
for i := range manifests {
manifests[i].AddLabels(map[string]string{
variantLabel: primaryVariant,
})
manifests[i].AddAnnotations(map[string]string{
variantLabel: primaryVariant,
})
}
addVariantLabelsAndAnnotations(manifests, variantLabel, primaryVariant)

if err := annotateConfigHash(manifests); err != nil {
lp.Errorf("Unable to set %q annotation into the workload manifest (%v)", provider.AnnotationConfigHash, err)
Expand Down
10 changes: 1 addition & 9 deletions pkg/app/pipedv1/plugin/kubernetes/deployment/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,7 @@ func (p *Plugin) executeK8sSyncStage(ctx context.Context, input *sdk.ExecuteStag
}
}

// Add variant annotations to all manifests.
for i := range manifests {
manifests[i].AddLabels(map[string]string{
variantLabel: primaryVariant,
})
manifests[i].AddAnnotations(map[string]string{
variantLabel: primaryVariant,
})
}
addVariantLabelsAndAnnotations(manifests, variantLabel, primaryVariant)

if err := annotateConfigHash(manifests); err != nil {
lp.Errorf("Unable to set %q annotation into the workload manifest (%v)", provider.AnnotationConfigHash, err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,15 @@ func ensureVariantSelectorInWorkload(m provider.Manifest, variantLabel, variant
}
return m.AddStringMapValues(variantMap, "spec", "template", "metadata", "labels")
}

// addVariantLabelsAndAnnotations adds the variant label and annotation to the given manifests.
func addVariantLabelsAndAnnotations(m []provider.Manifest, variantLabel, variant string) {
for _, m := range m {
m.AddLabels(map[string]string{
variantLabel: variant,
})
m.AddAnnotations(map[string]string{
variantLabel: variant,
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,76 @@ spec:
}

}

func TestAddVariantLabelsAndAnnotations(t *testing.T) {
t.Parallel()

testcases := []struct {
name string
inputYAML string
variantLabel string
variant string
wantLabels map[string]string
wantAnnots map[string]string
}{
{
name: "single manifest",
inputYAML: `
apiVersion: v1
kind: ConfigMap
metadata:
name: test-config
`,
variantLabel: "pipecd.dev/variant",
variant: "primary",
wantLabels: map[string]string{"pipecd.dev/variant": "primary"},
wantAnnots: map[string]string{"pipecd.dev/variant": "primary"},
},
{
name: "multiple manifests",
inputYAML: `
apiVersion: v1
kind: ConfigMap
metadata:
name: config1
---
apiVersion: v1
kind: ConfigMap
metadata:
name: config2
`,
variantLabel: "custom/label",
variant: "canary",
wantLabels: map[string]string{"custom/label": "canary"},
wantAnnots: map[string]string{"custom/label": "canary"},
},
}

for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
manifests, err := provider.ParseManifests(tc.inputYAML)
require.NoError(t, err)
require.NotEmpty(t, manifests)

addVariantLabelsAndAnnotations(manifests, tc.variantLabel, tc.variant)

for _, m := range manifests {
labelsMap, _, err := m.NestedMap("metadata", "labels")
require.NoError(t, err)
labels := map[string]string{}
for k, v := range labelsMap {
if strVal, ok := v.(string); ok {
labels[k] = strVal
}
}
for k, v := range tc.wantLabels {
assert.Equal(t, v, labels[k], "label %q should be %q", k, v)
}
annots := m.GetAnnotations()
for k, v := range tc.wantAnnots {
assert.Equal(t, v, annots[k], "annotation %q should be %q", k, v)
}
}
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -161,15 +161,7 @@ func (p *Plugin) rollback(ctx context.Context, input *sdk.ExecuteStageInput[kube
}
}

// Add variant labels and annotations to all manifests.
for i := range manifests {
manifests[i].AddLabels(map[string]string{
variantLabel: primaryVariant,
})
manifests[i].AddAnnotations(map[string]string{
variantLabel: primaryVariant,
})
}
addVariantLabelsAndAnnotations(manifests, variantLabel, primaryVariant)

if err := annotateConfigHash(manifests); err != nil {
lp.Errorf("Unable to set %q annotation into the workload manifest (%v)", provider.AnnotationConfigHash, err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,7 @@ func (p *Plugin) sync(
}
}

// Add variant annotations to all manifests.
for i := range manifests {
manifests[i].AddLabels(map[string]string{
variantLabel: primaryVariant,
})
manifests[i].AddAnnotations(map[string]string{
variantLabel: primaryVariant,
})
}
addVariantLabelsAndAnnotations(manifests, variantLabel, primaryVariant)

if err := annotateConfigHash(manifests); err != nil {
lp.Errorf("Unable to set %q annotation into the workload manifest (%v)", provider.AnnotationConfigHash, err)
Expand Down
Loading