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..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,8 @@ 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.ListLimitOptions; +import org.apache.hadoop.ozone.shell.PrefixFilterOption; import picocli.CommandLine; /** @@ -67,7 +68,10 @@ public class DiskUsageSubCommand implements Callable { private boolean noHeader; @CommandLine.Mixin - private ListOptions listOptions; + private ListLimitOptions listOptions; + + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; private static final String ENDPOINT = "/api/v1/namespace/du"; @@ -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/ListLimitOptions.java similarity index 65% 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/ListLimitOptions.java index 3b0d7f117f8f..edfeafb11485 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/ListLimitOptions.java @@ -19,48 +19,29 @@ import picocli.CommandLine; -/** - * Common options for 'list' commands. - */ -public class ListOptions { - - @CommandLine.ArgGroup(exclusive = true) - private ExclusiveLimit exclusiveLimit = new ExclusiveLimit(); +/** Options for limiting the size of lists. Use with {@link CommandLine.Mixin}. */ +public class ListLimitOptions { - @CommandLine.Option(names = {"--start", "-s"}, - description = "The item to start the listing from.\n" + - "This will be excluded from the result.") - private String startItem; + @CommandLine.ArgGroup + private ExclusiveGroup group = new ExclusiveGroup(); - @CommandLine.Option(names = {"--prefix", "-p"}, - description = "Prefix to filter the items") - private String prefix; + public boolean isAll() { + return group.all; + } public int getLimit() { - if (exclusiveLimit.all) { + if (group.all) { return Integer.MAX_VALUE; } - if (exclusiveLimit.limit < 1) { + if (group.limit < 1) { throw new IllegalArgumentException( "List length should be a positive number"); } - return exclusiveLimit.limit; - } - - public boolean isAll() { - return exclusiveLimit.all; - } - - public String getStartItem() { - return startItem; - } - - public String getPrefix() { - return prefix; + return group.limit; } - static class ExclusiveLimit { + static class ExclusiveGroup { @CommandLine.Option(names = {"--length", "-l"}, description = "Maximum number of items to list", defaultValue = "100", 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 new file mode 100644 index 000000000000..086a05272d33 --- /dev/null +++ b/hadoop-ozone/cli-shell/src/main/java/org/apache/hadoop/ozone/shell/ListPaginationOptions.java @@ -0,0 +1,45 @@ +/* + * 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 to provide pagination of lists. Use with {@link CommandLine.Mixin}. */ +public class ListPaginationOptions { + + @CommandLine.Mixin + private ListLimitOptions limitOptions; + + @CommandLine.Option(names = {"--start", "-s"}, + description = "The item to start the listing from.\n" + + "This will be excluded from the result.") + private String startItem; + + public int getLimit() { + return limitOptions.getLimit(); + } + + public boolean isAll() { + return limitOptions.isAll(); + } + + public String getStartItem() { + return startItem; + } + +} 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..20d75ed98b80 --- /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. Use with {@link CommandLine.Mixin}. */ +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..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,8 +25,9 @@ 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; import picocli.CommandLine; import picocli.CommandLine.Command; @@ -40,7 +41,10 @@ public class ListBucketHandler extends VolumeHandler { @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; + + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; @CommandLine.Option(names = {"--has-snapshot"}, description = "Only show buckets that have at least one active snapshot.") @@ -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..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,8 +24,9 @@ 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; import picocli.CommandLine; import picocli.CommandLine.Command; @@ -39,7 +40,10 @@ public class ListKeyHandler extends VolumeBucketHandler { @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; + + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; @Override protected void execute(OzoneClient client, OzoneAddress address) @@ -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/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 f422126f80c4..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,8 +22,9 @@ 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; import picocli.CommandLine; @@ -40,7 +41,10 @@ public class ListSnapshotHandler extends Handler { private BucketUri snapshotPath; @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; + + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; @Override protected OzoneAddress getAddress() { @@ -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..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,8 +23,9 @@ 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; import org.apache.hadoop.security.UserGroupInformation; import picocli.CommandLine; @@ -46,7 +47,10 @@ public class ListVolumeHandler extends Handler { private String uri; @CommandLine.Mixin - private ListOptions listOptions; + private ListPaginationOptions listOptions; + + @CommandLine.Mixin + private PrefixFilterOption prefixFilter; @Option(names = {"--user", "-u"}, description = "List accessible volumes of the user. This will be ignored" @@ -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()); 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..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 @@ -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.ListLimitOptions; import picocli.CommandLine; @@ -42,7 +42,7 @@ public class ListContainers extends AbstractSubcommand implements Callable private HddsProtos.LifeCycleState state; @CommandLine.Mixin - private ListOptions listOptions; + private ListLimitOptions listOptions; @CommandLine.ParentCommand private ContainerLogController parent;