From 79be9c41ba004dc0dcc0f817de3b489e7f47c876 Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 07:13:05 +0200 Subject: [PATCH 1/9] HDDS-12995. Extract --prefix from ListOptions --- .../admin/nssummary/DiskUsageSubCommand.java | 6 +++- .../hadoop/ozone/shell/ListOptions.java | 8 ----- .../ozone/shell/PrefixFilterOption.java | 33 +++++++++++++++++++ .../ozone/shell/bucket/ListBucketHandler.java | 6 +++- .../ozone/shell/keys/ListKeyHandler.java | 14 +++++--- .../shell/snapshot/ListSnapshotHandler.java | 6 +++- .../ozone/shell/volume/ListVolumeHandler.java | 8 +++-- 7 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/PrefixFilterOption.java diff --git a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java index 119ecb603fef..02dbdf41645a 100644 --- a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java +++ b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java @@ -34,6 +34,7 @@ import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.server.JsonUtils; import org.apache.hadoop.ozone.shell.ListOptions; +import org.apache.hadoop.ozone.shell.PrefixFilterOption; import picocli.CommandLine; /** @@ -69,6 +70,9 @@ public class DiskUsageSubCommand implements Callable { @CommandLine.Mixin private ListOptions listOptions; + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; + private static final String ENDPOINT = "/api/v1/namespace/du"; // For text alignment @@ -147,7 +151,7 @@ public Void call() throws Exception { printWithUnderline("DU", true); printDUHeader(); int limit = listOptions.getLimit(); - String seekStr = listOptions.getPrefix(); + String seekStr = prefixFilter.getPrefix(); if (seekStr == null) { seekStr = ""; } diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListOptions.java index 3b0d7f117f8f..f5d0d2a0d026 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListOptions.java @@ -32,10 +32,6 @@ public class ListOptions { "This will be excluded from the result.") private String startItem; - @CommandLine.Option(names = {"--prefix", "-p"}, - description = "Prefix to filter the items") - private String prefix; - public int getLimit() { if (exclusiveLimit.all) { return Integer.MAX_VALUE; @@ -56,10 +52,6 @@ public String getStartItem() { return startItem; } - public String getPrefix() { - return prefix; - } - static class ExclusiveLimit { @CommandLine.Option(names = {"--length", "-l"}, description = "Maximum number of items to list", diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/PrefixFilterOption.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/PrefixFilterOption.java new file mode 100644 index 000000000000..d3c65a156e18 --- /dev/null +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/PrefixFilterOption.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.shell; + +import picocli.CommandLine; + +/** Option for filtering lists by prefix. */ +public class PrefixFilterOption { + + @CommandLine.Option(names = {"--prefix", "-p"}, + description = "Prefix to filter the items") + private String prefix; + + public String getPrefix() { + return prefix; + } + +} diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/bucket/ListBucketHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/bucket/ListBucketHandler.java index 23d60a9a30dd..ff544433154c 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/bucket/ListBucketHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/bucket/ListBucketHandler.java @@ -27,6 +27,7 @@ import org.apache.hadoop.ozone.client.OzoneVolume; import org.apache.hadoop.ozone.shell.ListOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; +import org.apache.hadoop.ozone.shell.PrefixFilterOption; import org.apache.hadoop.ozone.shell.volume.VolumeHandler; import picocli.CommandLine; import picocli.CommandLine.Command; @@ -42,6 +43,9 @@ public class ListBucketHandler extends VolumeHandler { @CommandLine.Mixin private ListOptions listOptions; + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; + @CommandLine.Option(names = {"--has-snapshot"}, description = "Only show buckets that have at least one active snapshot.") private boolean filterByHasSnapshot; @@ -54,7 +58,7 @@ protected void execute(OzoneClient client, OzoneAddress address) ObjectStore objectStore = client.getObjectStore(); OzoneVolume vol = objectStore.getVolume(volumeName); Iterator bucketIterator = - vol.listBuckets(listOptions.getPrefix(), + vol.listBuckets(prefixFilter.getPrefix(), listOptions.getStartItem(), filterByHasSnapshot); List bucketList = new ArrayList<>(); int counter = 0; diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java index 4635f0558293..9b61e13dd404 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java @@ -26,6 +26,7 @@ import org.apache.hadoop.ozone.client.OzoneVolume; import org.apache.hadoop.ozone.shell.ListOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; +import org.apache.hadoop.ozone.shell.PrefixFilterOption; import org.apache.hadoop.ozone.shell.common.VolumeBucketHandler; import picocli.CommandLine; import picocli.CommandLine.Command; @@ -41,6 +42,9 @@ public class ListKeyHandler extends VolumeBucketHandler { @CommandLine.Mixin private ListOptions listOptions; + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; + @Override protected void execute(OzoneClient client, OzoneAddress address) throws IOException { @@ -62,13 +66,13 @@ private void listKeysInsideBucket(OzoneClient client, OzoneAddress address) if (!Strings.isNullOrEmpty(snapshotNameWithIndicator)) { keyPrefix += snapshotNameWithIndicator; - if (!Strings.isNullOrEmpty(listOptions.getPrefix())) { + if (!Strings.isNullOrEmpty(prefixFilter.getPrefix())) { keyPrefix += "/"; } } - if (!Strings.isNullOrEmpty(listOptions.getPrefix())) { - keyPrefix += listOptions.getPrefix(); + if (!Strings.isNullOrEmpty(prefixFilter.getPrefix())) { + keyPrefix += prefixFilter.getPrefix(); } OzoneVolume vol = client.getObjectStore().getVolume(volumeName); @@ -111,8 +115,8 @@ private void listKeysInsideVolume(OzoneClient client, OzoneAddress address) vol.listBuckets(null); int maxKeyLimit = listOptions.getLimit(); String keyPrefix = ""; - if (!Strings.isNullOrEmpty(listOptions.getPrefix())) { - keyPrefix += listOptions.getPrefix(); + if (!Strings.isNullOrEmpty(prefixFilter.getPrefix())) { + keyPrefix += prefixFilter.getPrefix(); } int totalKeys = 0; diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java index f422126f80c4..3382e2d5be3e 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java @@ -24,6 +24,7 @@ import org.apache.hadoop.ozone.shell.Handler; import org.apache.hadoop.ozone.shell.ListOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; +import org.apache.hadoop.ozone.shell.PrefixFilterOption; import org.apache.hadoop.ozone.shell.bucket.BucketUri; import picocli.CommandLine; @@ -42,6 +43,9 @@ public class ListSnapshotHandler extends Handler { @CommandLine.Mixin private ListOptions listOptions; + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; + @Override protected OzoneAddress getAddress() { return snapshotPath.getValue(); @@ -54,7 +58,7 @@ protected void execute(OzoneClient client, OzoneAddress address) String bucketName = snapshotPath.getValue().getBucketName(); Iterator snapshotInfos = client.getObjectStore() - .listSnapshot(volumeName, bucketName, listOptions.getPrefix(), + .listSnapshot(volumeName, bucketName, prefixFilter.getPrefix(), listOptions.getStartItem()); int counter = printAsJsonArray(snapshotInfos, listOptions.getLimit()); if (isVerbose()) { diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/volume/ListVolumeHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/volume/ListVolumeHandler.java index c6bfa2f5d940..a117365556d0 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/volume/ListVolumeHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/volume/ListVolumeHandler.java @@ -25,6 +25,7 @@ import org.apache.hadoop.ozone.shell.Handler; import org.apache.hadoop.ozone.shell.ListOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; +import org.apache.hadoop.ozone.shell.PrefixFilterOption; import org.apache.hadoop.ozone.shell.Shell; import org.apache.hadoop.security.UserGroupInformation; import picocli.CommandLine; @@ -48,6 +49,9 @@ public class ListVolumeHandler extends Handler { @CommandLine.Mixin private ListOptions listOptions; + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; + @Option(names = {"--user", "-u"}, description = "List accessible volumes of the user. This will be ignored" + " if list all volumes option is specified.") @@ -71,10 +75,10 @@ protected void execute(OzoneClient client, OzoneAddress address) Iterator volumeIterator; if (userName != null && !listOptions.isAll()) { volumeIterator = client.getObjectStore().listVolumesByUser(userName, - listOptions.getPrefix(), listOptions.getStartItem()); + prefixFilter.getPrefix(), listOptions.getStartItem()); } else { volumeIterator = client.getObjectStore().listVolumes( - listOptions.getPrefix(), listOptions.getStartItem()); + prefixFilter.getPrefix(), listOptions.getStartItem()); } int counter = printAsJsonArray(volumeIterator, listOptions.getLimit()); From 646fdb8f082d6b75caccad29369a409d900e37bc Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 07:19:28 +0200 Subject: [PATCH 2/9] rename ListOptions to ListPaginationOptions --- .../hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java | 4 ++-- .../shell/{ListOptions.java => ListPaginationOptions.java} | 2 +- .../apache/hadoop/ozone/shell/bucket/ListBucketHandler.java | 4 ++-- .../org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java | 4 ++-- .../hadoop/ozone/shell/snapshot/ListSnapshotDiffHandler.java | 4 ++-- .../hadoop/ozone/shell/snapshot/ListSnapshotHandler.java | 4 ++-- .../apache/hadoop/ozone/shell/volume/ListVolumeHandler.java | 4 ++-- .../hadoop/ozone/debug/logs/container/ListContainers.java | 4 ++-- 8 files changed, 15 insertions(+), 15 deletions(-) rename hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/{ListOptions.java => ListPaginationOptions.java} (98%) diff --git a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java index 02dbdf41645a..43d2cfc956d3 100644 --- a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java +++ b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java @@ -33,7 +33,7 @@ import org.apache.commons.io.FileUtils; import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.server.JsonUtils; -import org.apache.hadoop.ozone.shell.ListOptions; +import org.apache.hadoop.ozone.shell.ListPaginationOptions; import org.apache.hadoop.ozone.shell.PrefixFilterOption; import picocli.CommandLine; @@ -68,7 +68,7 @@ public class DiskUsageSubCommand implements Callable { private boolean noHeader; @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; @CommandLine.Mixin private PrefixFilterOption prefixFilter; diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java similarity index 98% rename from hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListOptions.java rename to hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java index f5d0d2a0d026..7e538ec1e491 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java @@ -22,7 +22,7 @@ /** * Common options for 'list' commands. */ -public class ListOptions { +public class ListPaginationOptions { @CommandLine.ArgGroup(exclusive = true) private ExclusiveLimit exclusiveLimit = new ExclusiveLimit(); diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/bucket/ListBucketHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/bucket/ListBucketHandler.java index ff544433154c..69110f8a618a 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/bucket/ListBucketHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/bucket/ListBucketHandler.java @@ -25,7 +25,7 @@ import org.apache.hadoop.ozone.client.OzoneBucket; import org.apache.hadoop.ozone.client.OzoneClient; import org.apache.hadoop.ozone.client.OzoneVolume; -import org.apache.hadoop.ozone.shell.ListOptions; +import org.apache.hadoop.ozone.shell.ListPaginationOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; import org.apache.hadoop.ozone.shell.PrefixFilterOption; import org.apache.hadoop.ozone.shell.volume.VolumeHandler; @@ -41,7 +41,7 @@ public class ListBucketHandler extends VolumeHandler { @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; @CommandLine.Mixin private PrefixFilterOption prefixFilter; diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java index 9b61e13dd404..e5a9f2aa2283 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/keys/ListKeyHandler.java @@ -24,7 +24,7 @@ import org.apache.hadoop.ozone.client.OzoneClient; import org.apache.hadoop.ozone.client.OzoneKey; import org.apache.hadoop.ozone.client.OzoneVolume; -import org.apache.hadoop.ozone.shell.ListOptions; +import org.apache.hadoop.ozone.shell.ListPaginationOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; import org.apache.hadoop.ozone.shell.PrefixFilterOption; import org.apache.hadoop.ozone.shell.common.VolumeBucketHandler; @@ -40,7 +40,7 @@ public class ListKeyHandler extends VolumeBucketHandler { @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; @CommandLine.Mixin private PrefixFilterOption prefixFilter; diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotDiffHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotDiffHandler.java index 7955db9c711b..19e8c7097127 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotDiffHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotDiffHandler.java @@ -22,7 +22,7 @@ import org.apache.hadoop.ozone.client.OzoneClient; import org.apache.hadoop.ozone.client.OzoneSnapshotDiff; import org.apache.hadoop.ozone.shell.Handler; -import org.apache.hadoop.ozone.shell.ListOptions; +import org.apache.hadoop.ozone.shell.ListPaginationOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; import org.apache.hadoop.ozone.shell.bucket.BucketUri; import picocli.CommandLine; @@ -50,7 +50,7 @@ public class ListSnapshotDiffHandler extends Handler { private boolean listAllStatus; @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; @Override protected OzoneAddress getAddress() { diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java index 3382e2d5be3e..8573374c58fe 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/snapshot/ListSnapshotHandler.java @@ -22,7 +22,7 @@ import org.apache.hadoop.ozone.client.OzoneClient; import org.apache.hadoop.ozone.client.OzoneSnapshot; import org.apache.hadoop.ozone.shell.Handler; -import org.apache.hadoop.ozone.shell.ListOptions; +import org.apache.hadoop.ozone.shell.ListPaginationOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; import org.apache.hadoop.ozone.shell.PrefixFilterOption; import org.apache.hadoop.ozone.shell.bucket.BucketUri; @@ -41,7 +41,7 @@ public class ListSnapshotHandler extends Handler { private BucketUri snapshotPath; @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; @CommandLine.Mixin private PrefixFilterOption prefixFilter; diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/volume/ListVolumeHandler.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/volume/ListVolumeHandler.java index a117365556d0..17548bdeba47 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/volume/ListVolumeHandler.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/volume/ListVolumeHandler.java @@ -23,7 +23,7 @@ import org.apache.hadoop.ozone.client.OzoneClientException; import org.apache.hadoop.ozone.client.OzoneVolume; import org.apache.hadoop.ozone.shell.Handler; -import org.apache.hadoop.ozone.shell.ListOptions; +import org.apache.hadoop.ozone.shell.ListPaginationOptions; import org.apache.hadoop.ozone.shell.OzoneAddress; import org.apache.hadoop.ozone.shell.PrefixFilterOption; import org.apache.hadoop.ozone.shell.Shell; @@ -47,7 +47,7 @@ public class ListVolumeHandler extends Handler { private String uri; @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; @CommandLine.Mixin private PrefixFilterOption prefixFilter; diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java index 6bc2e4b13641..89d0c323daf7 100644 --- a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java @@ -22,7 +22,7 @@ import org.apache.hadoop.hdds.cli.AbstractSubcommand; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.ozone.debug.logs.container.utils.ContainerDatanodeDatabase; -import org.apache.hadoop.ozone.shell.ListOptions; +import org.apache.hadoop.ozone.shell.ListPaginationOptions; import picocli.CommandLine; @@ -42,7 +42,7 @@ public class ListContainers extends AbstractSubcommand implements Callable private HddsProtos.LifeCycleState state; @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; @CommandLine.ParentCommand private ContainerLogController parent; From 10252aabe2d3c7fb73947561990ecc88d7f5295b Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 07:22:58 +0200 Subject: [PATCH 3/9] extract ExclusiveLimit to top level class ListLimitOptions --- .../hadoop/ozone/shell/ListLimitOptions.java | 60 +++++++++++++++++++ .../ozone/shell/ListPaginationOptions.java | 26 +------- 2 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java new file mode 100644 index 000000000000..3331bf515a97 --- /dev/null +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.shell; + +import picocli.CommandLine; + +/** + * Options for limiting the size of lists. + * Usage: + *
+ * {@code
+ * @CommandLine.ArgGroup
+ * private ListLimitOptions limitOptions;
+ * }
+ * 
+ */ +public class ListLimitOptions { + + @CommandLine.Option(names = {"--length", "-l"}, + description = "Maximum number of items to list", + defaultValue = "100", + showDefaultValue = CommandLine.Help.Visibility.ALWAYS) + private int limit; + + @CommandLine.Option(names = {"--all", "-a"}, + description = "List all results", + defaultValue = "false") + private boolean all; + + public boolean isAll() { + return all; + } + + public int getLimit() { + if (all) { + return Integer.MAX_VALUE; + } + if (limit < 1) { + throw new IllegalArgumentException( + "List length should be a positive number"); + } + + return limit; + } +} diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java index 7e538ec1e491..fdb0a1321166 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java @@ -25,7 +25,7 @@ public class ListPaginationOptions { @CommandLine.ArgGroup(exclusive = true) - private ExclusiveLimit exclusiveLimit = new ExclusiveLimit(); + private ListLimitOptions limitOptions = new ListLimitOptions(); @CommandLine.Option(names = {"--start", "-s"}, description = "The item to start the listing from.\n" + @@ -33,35 +33,15 @@ public class ListPaginationOptions { private String startItem; public int getLimit() { - if (exclusiveLimit.all) { - return Integer.MAX_VALUE; - } - if (exclusiveLimit.limit < 1) { - throw new IllegalArgumentException( - "List length should be a positive number"); - } - - return exclusiveLimit.limit; + return limitOptions.getLimit(); } public boolean isAll() { - return exclusiveLimit.all; + return limitOptions.isAll(); } public String getStartItem() { return startItem; } - static class ExclusiveLimit { - @CommandLine.Option(names = {"--length", "-l"}, - description = "Maximum number of items to list", - defaultValue = "100", - showDefaultValue = CommandLine.Help.Visibility.ALWAYS) - private int limit; - - @CommandLine.Option(names = {"--all", "-a"}, - description = "List all results", - defaultValue = "false") - private boolean all; - } } From 6da31728dc7e0873edfa63b19816f8a6dc772106 Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 07:43:27 +0200 Subject: [PATCH 4/9] `ozone debug logs container list` only supports limit, not pagination --- .../hadoop/ozone/debug/logs/container/ListContainers.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java index 89d0c323daf7..b7505cf340e5 100644 --- a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java @@ -22,7 +22,7 @@ import org.apache.hadoop.hdds.cli.AbstractSubcommand; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.ozone.debug.logs.container.utils.ContainerDatanodeDatabase; -import org.apache.hadoop.ozone.shell.ListPaginationOptions; +import org.apache.hadoop.ozone.shell.ListLimitOptions; import picocli.CommandLine; @@ -41,8 +41,8 @@ public class ListContainers extends AbstractSubcommand implements Callable required = true) private HddsProtos.LifeCycleState state; - @CommandLine.Mixin - private ListPaginationOptions listOptions; + @CommandLine.ArgGroup + private ListLimitOptions listOptions; @CommandLine.ParentCommand private ContainerLogController parent; From a449d9bddcbfcea8bd446531e9a177258fb701e1 Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 07:46:09 +0200 Subject: [PATCH 5/9] exclusive == true by default --- .../org/apache/hadoop/ozone/shell/ListPaginationOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java index fdb0a1321166..6797351e377c 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java @@ -24,7 +24,7 @@ */ public class ListPaginationOptions { - @CommandLine.ArgGroup(exclusive = true) + @CommandLine.ArgGroup private ListLimitOptions limitOptions = new ListLimitOptions(); @CommandLine.Option(names = {"--start", "-s"}, From 9e12456b1aa39fb3f8f89a75b47865dc8b77f6e0 Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 07:55:45 +0200 Subject: [PATCH 6/9] improve javadoc --- .../apache/hadoop/ozone/shell/ListLimitOptions.java | 1 + .../hadoop/ozone/shell/ListPaginationOptions.java | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java index 3331bf515a97..5bd056f05507 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java @@ -21,6 +21,7 @@ /** * Options for limiting the size of lists. + *

* Usage: *

  * {@code
diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java
index 6797351e377c..71d15a51e2e7 100644
--- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java
+++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java
@@ -20,7 +20,15 @@
 import picocli.CommandLine;
 
 /**
- * Common options for 'list' commands.
+ * Options to provide pagination of lists.
+ * 

+ * Usage: + *

+ * {@code
+ * @CommandLine.Mixin
+ * private ListPaginationOptions listOptions;
+ * }
+ * 
*/ public class ListPaginationOptions { From 0af559ad5c45f92a506ede9a60273995c7ad992a Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 08:16:52 +0200 Subject: [PATCH 7/9] Applications that want to reuse Argument Groups across subcommands need to use Mixins --- .../hadoop/ozone/shell/ListLimitOptions.java | 35 +++++++++++-------- .../ozone/shell/ListPaginationOptions.java | 4 +-- .../debug/logs/container/ListContainers.java | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java index 5bd056f05507..d3e44ea87b4e 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java @@ -25,37 +25,42 @@ * Usage: *
  * {@code
- * @CommandLine.ArgGroup
+ * @CommandLine.Mixin
  * private ListLimitOptions limitOptions;
  * }
  * 
*/ public class ListLimitOptions { - @CommandLine.Option(names = {"--length", "-l"}, - description = "Maximum number of items to list", - defaultValue = "100", - showDefaultValue = CommandLine.Help.Visibility.ALWAYS) - private int limit; - - @CommandLine.Option(names = {"--all", "-a"}, - description = "List all results", - defaultValue = "false") - private boolean all; + @CommandLine.ArgGroup + private ExclusiveGroup group = new ExclusiveGroup(); public boolean isAll() { - return all; + return group.all; } public int getLimit() { - if (all) { + if (group.all) { return Integer.MAX_VALUE; } - if (limit < 1) { + if (group.limit < 1) { throw new IllegalArgumentException( "List length should be a positive number"); } - return limit; + return group.limit; + } + + static class ExclusiveGroup { + @CommandLine.Option(names = {"--length", "-l"}, + description = "Maximum number of items to list", + defaultValue = "100", + showDefaultValue = CommandLine.Help.Visibility.ALWAYS) + private int limit; + + @CommandLine.Option(names = {"--all", "-a"}, + description = "List all results", + defaultValue = "false") + private boolean all; } } diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java index 71d15a51e2e7..b0ab9efbea4a 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java @@ -32,8 +32,8 @@ */ public class ListPaginationOptions { - @CommandLine.ArgGroup - private ListLimitOptions limitOptions = new ListLimitOptions(); + @CommandLine.Mixin + private ListLimitOptions limitOptions; @CommandLine.Option(names = {"--start", "-s"}, description = "The item to start the listing from.\n" + diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java index b7505cf340e5..63e65f5e8277 100644 --- a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/logs/container/ListContainers.java @@ -41,7 +41,7 @@ public class ListContainers extends AbstractSubcommand implements Callable required = true) private HddsProtos.LifeCycleState state; - @CommandLine.ArgGroup + @CommandLine.Mixin private ListLimitOptions listOptions; @CommandLine.ParentCommand From 4f689f8cb199df8ea337fc7c2a1eb3b2517ba6bb Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 08:30:46 +0200 Subject: [PATCH 8/9] `ozone admin nssummary` only supports limit, not pagination --- .../hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java index 43d2cfc956d3..6b85576b1e1c 100644 --- a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java +++ b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java @@ -33,7 +33,7 @@ import org.apache.commons.io.FileUtils; import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.server.JsonUtils; -import org.apache.hadoop.ozone.shell.ListPaginationOptions; +import org.apache.hadoop.ozone.shell.ListLimitOptions; import org.apache.hadoop.ozone.shell.PrefixFilterOption; import picocli.CommandLine; @@ -68,7 +68,7 @@ public class DiskUsageSubCommand implements Callable { private boolean noHeader; @CommandLine.Mixin - private ListPaginationOptions listOptions; + private ListLimitOptions listOptions; @CommandLine.Mixin private PrefixFilterOption prefixFilter; From 002027793597204e0f6075b2bd7a99ab86f717ca Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Thu, 8 May 2025 09:21:34 +0200 Subject: [PATCH 9/9] fix javadoc: invalid usage of tag {@code --- .../apache/hadoop/ozone/shell/ListLimitOptions.java | 12 +----------- .../hadoop/ozone/shell/ListPaginationOptions.java | 12 +----------- .../hadoop/ozone/shell/PrefixFilterOption.java | 2 +- 3 files changed, 3 insertions(+), 23 deletions(-) diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java index d3e44ea87b4e..edfeafb11485 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListLimitOptions.java @@ -19,17 +19,7 @@ import picocli.CommandLine; -/** - * Options for limiting the size of lists. - *

- * Usage: - *

- * {@code
- * @CommandLine.Mixin
- * private ListLimitOptions limitOptions;
- * }
- * 
- */ +/** Options for limiting the size of lists. Use with {@link CommandLine.Mixin}. */ public class ListLimitOptions { @CommandLine.ArgGroup diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java index b0ab9efbea4a..086a05272d33 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java @@ -19,17 +19,7 @@ import picocli.CommandLine; -/** - * Options to provide pagination of lists. - *

- * Usage: - *

- * {@code
- * @CommandLine.Mixin
- * private ListPaginationOptions listOptions;
- * }
- * 
- */ +/** Options to provide pagination of lists. Use with {@link CommandLine.Mixin}. */ public class ListPaginationOptions { @CommandLine.Mixin diff --git a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/PrefixFilterOption.java b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/PrefixFilterOption.java index d3c65a156e18..20d75ed98b80 100644 --- a/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/PrefixFilterOption.java +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/PrefixFilterOption.java @@ -19,7 +19,7 @@ import picocli.CommandLine; -/** Option for filtering lists by prefix. */ +/** Option for filtering lists by prefix. Use with {@link CommandLine.Mixin}. */ public class PrefixFilterOption { @CommandLine.Option(names = {"--prefix", "-p"},