diff --git a/cmd/nerdctl/namespace/namespace_update.go b/cmd/nerdctl/namespace/namespace_update.go index dd15cd91a49..0e02f78a9c8 100644 --- a/cmd/nerdctl/namespace/namespace_update.go +++ b/cmd/nerdctl/namespace/namespace_update.go @@ -36,7 +36,8 @@ func updateCommand() *cobra.Command { SilenceUsage: true, SilenceErrors: true, } - cmd.Flags().StringArrayP("label", "l", nil, "Set labels for a namespace") + cmd.Flags().StringArrayP("label", "l", nil, "Set labels for a namespace (required)") + cmd.MarkFlagRequired("label") return cmd } diff --git a/pkg/cmd/namespace/common.go b/pkg/cmd/namespace/common.go index e08939e0427..309d2f90f90 100644 --- a/pkg/cmd/namespace/common.go +++ b/pkg/cmd/namespace/common.go @@ -16,7 +16,16 @@ package namespace -import "strings" +import ( + "context" + "fmt" + "slices" + "strings" + + "github.com/compose-spec/compose-go/v2/errdefs" + + "github.com/containerd/containerd/v2/pkg/namespaces" +) func objectWithLabelArgs(args []string) map[string]string { if len(args) >= 1 { @@ -39,3 +48,16 @@ func labelArgs(labelStrings []string) map[string]string { return labels } + +// namespaceExists checks if the namespace exists +func namespaceExists(ctx context.Context, store namespaces.Store, namespace string) error { + nsList, err := store.List(ctx) + if err != nil { + return err + } + if slices.Contains(nsList, namespace) { + return nil + } + + return fmt.Errorf("namespace %s: %w", namespace, errdefs.ErrNotFound) +} diff --git a/pkg/cmd/namespace/inspect.go b/pkg/cmd/namespace/inspect.go index 3a7a4932815..ebe327da3d0 100644 --- a/pkg/cmd/namespace/inspect.go +++ b/pkg/cmd/namespace/inspect.go @@ -21,6 +21,7 @@ import ( containerd "github.com/containerd/containerd/v2/client" "github.com/containerd/containerd/v2/pkg/namespaces" + "github.com/containerd/log" "github.com/containerd/nerdctl/v2/pkg/api/types" "github.com/containerd/nerdctl/v2/pkg/formatter" @@ -28,10 +29,17 @@ import ( ) func Inspect(ctx context.Context, client *containerd.Client, inspectedNamespaces []string, options types.NamespaceInspectOptions) error { - result := make([]interface{}, len(inspectedNamespaces)) - for index, ns := range inspectedNamespaces { + result := []interface{}{} + warns := []error{} + + for _, ns := range inspectedNamespaces { ctx = namespaces.WithNamespace(ctx, ns) - labels, err := client.NamespaceService().Labels(ctx, ns) + namespaceService := client.NamespaceService() + if err := namespaceExists(ctx, namespaceService, ns); err != nil { + warns = append(warns, err) + continue + } + labels, err := namespaceService.Labels(ctx, ns) if err != nil { return err } @@ -39,7 +47,13 @@ func Inspect(ctx context.Context, client *containerd.Client, inspectedNamespaces Name: ns, Labels: &labels, } - result[index] = nsInspect + result = append(result, nsInspect) + } + if err := formatter.FormatSlice(options.Format, options.Stdout, result); err != nil { + return err + } + for _, warn := range warns { + log.G(ctx).Warn(warn) } - return formatter.FormatSlice(options.Format, options.Stdout, result) + return nil } diff --git a/pkg/cmd/namespace/update.go b/pkg/cmd/namespace/update.go index 63d2d8a5971..91b6b714905 100644 --- a/pkg/cmd/namespace/update.go +++ b/pkg/cmd/namespace/update.go @@ -27,6 +27,9 @@ import ( func Update(ctx context.Context, client *containerd.Client, namespace string, options types.NamespaceUpdateOptions) error { labelsArg := objectWithLabelArgs(options.Labels) namespaces := client.NamespaceService() + if err := namespaceExists(ctx, namespaces, namespace); err != nil { + return err + } for k, v := range labelsArg { if err := namespaces.SetLabel(ctx, namespace, k, v); err != nil { return err