diff --git a/cmd/crossplane/render/op/cmd.go b/cmd/crossplane/render/op/cmd.go index 63a045e2..c67a7853 100644 --- a/cmd/crossplane/render/op/cmd.go +++ b/cmd/crossplane/render/op/cmd.go @@ -221,6 +221,7 @@ func (c *Cmd) Run(k *kong.Context, log logging.Logger, sp terminal.SpinnerPrinte defer func() { if err := render.StopFunctionRuntimes(ctx, fnAddrs); err != nil { log.Info("Error stopping function runtimes", "error", err) + render.WarnCleanupFailure(k.Stderr, err) } }() diff --git a/cmd/crossplane/render/render.go b/cmd/crossplane/render/render.go index bed3f635..99109c9b 100644 --- a/cmd/crossplane/render/render.go +++ b/cmd/crossplane/render/render.go @@ -20,6 +20,8 @@ package render import ( "context" + "fmt" + "io" "strings" fnv1 "github.com/crossplane/function-sdk-go/proto/v1" @@ -196,3 +198,13 @@ func OverrideFunctionAnnotations(fns []pkgv1.Function, annotations []string) err } return nil } + +// WarnCleanupFailure writes a short warning about err to w. It does nothing if +// err is nil. Callers use it to surface function runtime cleanup failures that +// would otherwise only be visible with --verbose. +func WarnCleanupFailure(w io.Writer, err error) { + if err == nil { + return + } + _, _ = fmt.Fprintf(w, "warning: failed to clean up function runtimes; some resources (e.g. containers) may need to be removed manually: %v\n", err) +} diff --git a/cmd/crossplane/render/xr/cmd.go b/cmd/crossplane/render/xr/cmd.go index 0c2435cb..da3302bc 100644 --- a/cmd/crossplane/render/xr/cmd.go +++ b/cmd/crossplane/render/xr/cmd.go @@ -281,6 +281,7 @@ func (c *Cmd) Run(k *kong.Context, log logging.Logger, sp terminal.SpinnerPrinte defer func() { if err := render.StopFunctionRuntimes(ctx, fnAddrs); err != nil { log.Info("Error stopping function runtimes", "error", err) + render.WarnCleanupFailure(k.Stderr, err) } }()