From 670854707bd214b443e5b92a79d4295cc4dee51b Mon Sep 17 00:00:00 2001 From: Gabriele Fedi Date: Mon, 10 Nov 2025 15:01:27 +0100 Subject: [PATCH 1/4] feat: support backup hooks on sidecars Add support for configuring Kubernates native Sidecars as target containrs for Backup Hooks commands. This is purely a validation level patch as the actual pods/exec API doesn't make any distinction between standard and sidecar containers. Signed-off-by: Gabriele Fedi --- pkg/podexec/pod_command_executor.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/pkg/podexec/pod_command_executor.go b/pkg/podexec/pod_command_executor.go index b1d7fbf59a..0dbc28e951 100644 --- a/pkg/podexec/pod_command_executor.go +++ b/pkg/podexec/pod_command_executor.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "net/url" + "slices" "time" "github.com/pkg/errors" @@ -184,10 +185,22 @@ func (e *defaultPodCommandExecutor) ExecutePodCommand(log logrus.FieldLogger, it } func ensureContainerExists(pod *corev1api.Pod, container string) error { - for _, c := range pod.Spec.Containers { - if c.Name == container { - return nil - } + existsAsMainContainer := slices.ContainsFunc(pod.Spec.Containers, func(c corev1api.Container) bool { + return c.Name == container + }) + + if existsAsMainContainer { + return nil + } + + existsAsSidecar := slices.ContainsFunc(pod.Spec.InitContainers, func(c corev1api.Container) bool { + return c.RestartPolicy != nil && + *c.RestartPolicy == corev1api.ContainerRestartPolicyAlways && + c.Name == container + }) + + if existsAsSidecar { + return nil } return errors.Errorf("no such container: %q", container) From 7f4da93e5a7fd995e07100356745d7280990b531 Mon Sep 17 00:00:00 2001 From: Gabriele Fedi Date: Mon, 10 Nov 2025 15:14:05 +0100 Subject: [PATCH 2/4] test: extend unit tests Signed-off-by: Gabriele Fedi --- pkg/podexec/pod_command_executor_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pkg/podexec/pod_command_executor_test.go b/pkg/podexec/pod_command_executor_test.go index e28eb04587..790c8d3237 100644 --- a/pkg/podexec/pod_command_executor_test.go +++ b/pkg/podexec/pod_command_executor_test.go @@ -35,6 +35,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/rest" "k8s.io/client-go/tools/remotecommand" + "k8s.io/utils/ptr" v1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" velerotest "github.com/vmware-tanzu/velero/pkg/test" @@ -253,6 +254,15 @@ func TestEnsureContainerExists(t *testing.T) { Name: "foo", }, }, + InitContainers: []corev1api.Container{ + { + Name: "baz", + }, + { + Name: "qux", + RestartPolicy: ptr.To(corev1api.ContainerRestartPolicyAlways), + }, + }, }, } @@ -261,6 +271,12 @@ func TestEnsureContainerExists(t *testing.T) { err = ensureContainerExists(pod, "foo") assert.NoError(t, err) + + err = ensureContainerExists(pod, "baz") + require.EqualError(t, err, `no such container: "baz"`) + + err = ensureContainerExists(pod, "qux") + assert.NoError(t, err) } func TestPodCompeted(t *testing.T) { From 181797d53b256f776b25631da78511ad7499df79 Mon Sep 17 00:00:00 2001 From: Gabriele Fedi Date: Mon, 10 Nov 2025 15:33:42 +0100 Subject: [PATCH 3/4] chore: changelog Signed-off-by: Gabriele Fedi --- changelogs/unreleased/9403-GabriFedi97 | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelogs/unreleased/9403-GabriFedi97 diff --git a/changelogs/unreleased/9403-GabriFedi97 b/changelogs/unreleased/9403-GabriFedi97 new file mode 100644 index 0000000000..515549220f --- /dev/null +++ b/changelogs/unreleased/9403-GabriFedi97 @@ -0,0 +1 @@ +Include InitContainer configured as Sidecars when validating the existence of the target containers configured for the Backup Hooks From 0fc8460ae55a0dd8f789233d412cccfc9b18c155 Mon Sep 17 00:00:00 2001 From: Gabriele Fedi Date: Wed, 10 Dec 2025 09:12:48 +0100 Subject: [PATCH 4/4] style: fix linter issues Signed-off-by: Gabriele Fedi --- pkg/podexec/pod_command_executor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/podexec/pod_command_executor_test.go b/pkg/podexec/pod_command_executor_test.go index 790c8d3237..3286ba42dd 100644 --- a/pkg/podexec/pod_command_executor_test.go +++ b/pkg/podexec/pod_command_executor_test.go @@ -270,13 +270,13 @@ func TestEnsureContainerExists(t *testing.T) { require.EqualError(t, err, `no such container: "bar"`) err = ensureContainerExists(pod, "foo") - assert.NoError(t, err) + require.NoError(t, err) err = ensureContainerExists(pod, "baz") require.EqualError(t, err, `no such container: "baz"`) err = ensureContainerExists(pod, "qux") - assert.NoError(t, err) + require.NoError(t, err) } func TestPodCompeted(t *testing.T) {