From 8c8385aabb1a13de8883417c330c6e9b0017fdee Mon Sep 17 00:00:00 2001 From: Misha Ketslah Date: Thu, 19 Nov 2020 23:19:42 +0200 Subject: [PATCH] pass annotations from scheduler to created backup (#3067) * pass annotations from scheduler to created backup Signed-off-by: Michael * add change log Signed-off-by: Michael * add test for annotations in controller Signed-off-by: Michael * If no annotations are set - do not copy empty list Signed-off-by: Michael * remove unneeded var Signed-off-by: Michael * add empty annotations and actually check annotations in backups Signed-off-by: Michael * add empty missing label and empty annotations Signed-off-by: Michael * revert empty annotations as seems they are nil as expected Signed-off-by: Michael * fix typo in changelog Signed-off-by: Michael Co-authored-by: Michael --- changelogs/unreleased/3067-funkycode | 2 ++ pkg/builder/backup_builder.go | 5 +++++ pkg/builder/object_meta.go | 18 ++++++++++++++++++ pkg/cmd/cli/backup/create_test.go | 5 ++++- pkg/controller/schedule_controller_test.go | 9 ++++++++- 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/3067-funkycode diff --git a/changelogs/unreleased/3067-funkycode b/changelogs/unreleased/3067-funkycode new file mode 100644 index 000000000..62d9891ca --- /dev/null +++ b/changelogs/unreleased/3067-funkycode @@ -0,0 +1,2 @@ +Pass annotations from schedule to backup it creates the same way it is done for labels +Add WithannotationsMap function to builder to be able to pass map instead of key/val list \ No newline at end of file diff --git a/pkg/builder/backup_builder.go b/pkg/builder/backup_builder.go index 0c88cd9a6..5090700bc 100644 --- a/pkg/builder/backup_builder.go +++ b/pkg/builder/backup_builder.go @@ -83,6 +83,11 @@ func (b *BackupBuilder) FromSchedule(schedule *velerov1api.Schedule) *BackupBuil b.object.Spec = schedule.Spec.Template b.ObjectMeta(WithLabelsMap(labels)) + + if schedule.Annotations != nil { + b.ObjectMeta(WithAnnotationsMap(schedule.Annotations)) + } + return b } diff --git a/pkg/builder/object_meta.go b/pkg/builder/object_meta.go index c404013cb..92cfb29ef 100644 --- a/pkg/builder/object_meta.go +++ b/pkg/builder/object_meta.go @@ -76,6 +76,24 @@ func WithAnnotations(vals ...string) func(obj metav1.Object) { } } +// WithAnnotationsMap is a functional option that applies the specified annotations map to +// an object. +func WithAnnotationsMap(annotations map[string]string) func(obj metav1.Object) { + return func(obj metav1.Object) { + objAnnotations := obj.GetAnnotations() + if objAnnotations == nil { + objAnnotations = make(map[string]string) + } + + // If the label already exists in the object, it will be overwritten + for k, v := range annotations { + objAnnotations[k] = v + } + + obj.SetAnnotations(objAnnotations) + } +} + func setMapEntries(m map[string]string, vals ...string) map[string]string { if m == nil { m = make(map[string]string) diff --git a/pkg/cmd/cli/backup/create_test.go b/pkg/cmd/cli/backup/create_test.go index 43cffe619..09bffd81e 100644 --- a/pkg/cmd/cli/backup/create_test.go +++ b/pkg/cmd/cli/backup/create_test.go @@ -68,7 +68,7 @@ func TestCreateOptions_BuildBackupFromSchedule(t *testing.T) { }) expectedBackupSpec := builder.ForBackup("test", testNamespace).IncludedNamespaces("test").Result().Spec - schedule := builder.ForSchedule(testNamespace, "test").Template(expectedBackupSpec).ObjectMeta(builder.WithLabels("velero.io/test", "true")).Result() + schedule := builder.ForSchedule(testNamespace, "test").Template(expectedBackupSpec).ObjectMeta(builder.WithLabels("velero.io/test", "true"), builder.WithAnnotations("velero.io/test", "true")).Result() o.client.VeleroV1().Schedules(testNamespace).Create(context.TODO(), schedule, metav1.CreateOptions{}) t.Run("existing schedule", func(t *testing.T) { @@ -80,6 +80,9 @@ func TestCreateOptions_BuildBackupFromSchedule(t *testing.T) { "velero.io/test": "true", velerov1api.ScheduleNameLabel: "test", }, backup.GetLabels()) + assert.Equal(t, map[string]string{ + "velero.io/test": "true", + }, backup.GetAnnotations()) }) t.Run("command line labels take precedence over schedule labels", func(t *testing.T) { diff --git a/pkg/controller/schedule_controller_test.go b/pkg/controller/schedule_controller_test.go index b4ea04304..2dfff7c06 100644 --- a/pkg/controller/schedule_controller_test.go +++ b/pkg/controller/schedule_controller_test.go @@ -431,11 +431,17 @@ func TestGetBackup(t *testing.T) { Result(), }, { - name: "ensure schedule labels is copied", + name: "ensure schedule labels are copied", schedule: builder.ForSchedule("foo", "bar").ObjectMeta(builder.WithLabels("foo", "bar", "bar", "baz")).Result(), testClockTime: "2017-07-25 14:15:00", expectedBackup: builder.ForBackup("foo", "bar-20170725141500").ObjectMeta(builder.WithLabels(velerov1api.ScheduleNameLabel, "bar", "bar", "baz", "foo", "bar")).Result(), }, + { + name: "ensure schedule annotations are copied", + schedule: builder.ForSchedule("foo", "bar").ObjectMeta(builder.WithAnnotations("foo", "bar", "bar", "baz")).Result(), + testClockTime: "2017-07-25 14:15:00", + expectedBackup: builder.ForBackup("foo", "bar-20170725141500").ObjectMeta(builder.WithLabels(velerov1api.ScheduleNameLabel, "bar"), builder.WithAnnotations("bar", "baz", "foo", "bar")).Result(), + }, } for _, test := range tests { @@ -448,6 +454,7 @@ func TestGetBackup(t *testing.T) { assert.Equal(t, test.expectedBackup.Namespace, backup.Namespace) assert.Equal(t, test.expectedBackup.Name, backup.Name) assert.Equal(t, test.expectedBackup.Labels, backup.Labels) + assert.Equal(t, test.expectedBackup.Annotations, backup.Annotations) assert.Equal(t, test.expectedBackup.Spec, backup.Spec) }) }