This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit bbb46daa0b9de75224f288ccf90a7923ba8d37ae Author: Benoit Tellier <[email protected]> AuthorDate: Mon Feb 15 16:20:37 2021 +0700 JAMES-3477 WebAdmin CLI commands to manage global quotas --- server/protocols/webadmin-cli/pom.xml | 12 +- .../java/org/apache/james/cli/WebAdminCli.java | 2 + .../cli/quota/DeleteGlobalQuotaCountCommand.java | 54 ++++++ .../cli/quota/DeleteGlobalQuotaSizeCommand.java | 54 ++++++ .../cli/quota/GetGlobalQuotaCountCommand.java | 51 +++++ .../james/cli/quota/GetGlobalQuotaSizeCommand.java | 52 +++++ .../apache/james/cli/quota/GlobalQuotaCommand.java | 43 +++++ .../james/cli/quota/GlobalQuotaCountCommand.java | 44 +++++ .../james/cli/quota/GlobalQuotaSizeCommand.java | 44 +++++ .../org/apache/james/cli/quota/QuotaCommand.java | 56 ++++++ .../cli/quota/SetGlobalQuotaCountCommand.java | 57 ++++++ .../james/cli/quota/SetGlobalQuotaSizeCommand.java | 58 ++++++ .../org/apache/james/httpclient/QuotaClient.java | 43 +++++ .../java/org/apache/james/cli/QuotaManageTest.java | 210 +++++++++++++++++++++ 14 files changed, 776 insertions(+), 4 deletions(-) diff --git a/server/protocols/webadmin-cli/pom.xml b/server/protocols/webadmin-cli/pom.xml index bdfe312..ee31404 100644 --- a/server/protocols/webadmin-cli/pom.xml +++ b/server/protocols/webadmin-cli/pom.xml @@ -45,17 +45,21 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> - <artifactId>james-server-webadmin-integration-test-common</artifactId> + <artifactId>james-server-memory-guice</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> - <artifactId>testing-base</artifactId> + <artifactId>james-server-util</artifactId> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>james-server-webadmin-integration-test-common</artifactId> <scope>test</scope> </dependency> <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>james-server-memory-guice</artifactId> + <groupId>${james.groupId}</groupId> + <artifactId>testing-base</artifactId> <scope>test</scope> </dependency> <dependency> diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java index 02acc00..817963a 100644 --- a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java @@ -26,6 +26,7 @@ import java.util.concurrent.Callable; import org.apache.james.cli.domain.DomainCommand; import org.apache.james.cli.mailbox.MailboxCommand; +import org.apache.james.cli.quota.QuotaCommand; import org.apache.james.cli.user.UserCommand; import org.apache.james.httpclient.FeignClientFactory; import org.apache.james.httpclient.JwtToken; @@ -78,6 +79,7 @@ public class WebAdminCli implements Callable<Integer> { .addSubcommand(new DomainCommand(out, parent, err)) .addSubcommand(new UserCommand(out, parent, err)) .addSubcommand(new MailboxCommand(out, parent, err)) + .addSubcommand(new QuotaCommand(out, parent, err)) .execute(args); } diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/DeleteGlobalQuotaCountCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/DeleteGlobalQuotaCountCommand.java new file mode 100644 index 0000000..829d88a --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/DeleteGlobalQuotaCountCommand.java @@ -0,0 +1,54 @@ +/****************************************************************** + * 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.james.cli.quota; + +import static org.apache.james.cli.domain.DomainDeleteCommand.DELETED_CODE; + +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; +import org.apache.james.httpclient.QuotaClient; + +import feign.Response; +import picocli.CommandLine; + [email protected]( + name = "delete", + description = "Delete quota counts limit that applies for all users") +public class DeleteGlobalQuotaCountCommand implements Callable<Integer> { + @CommandLine.ParentCommand + GlobalQuotaCountCommand parentCommand; + + @Override + public Integer call() { + try { + QuotaClient quotaClient = parentCommand.parentCommand.quotaCommand.fullyQualifiedURL(); + Response rs = quotaClient.deleteQuotaCount(); + if (rs.status() == DELETED_CODE) { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } else { + return WebAdminCli.CLI_FINISHED_FAILED; + } + } catch (Exception e) { + e.printStackTrace(parentCommand.parentCommand.quotaCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/DeleteGlobalQuotaSizeCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/DeleteGlobalQuotaSizeCommand.java new file mode 100644 index 0000000..1aecc73 --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/DeleteGlobalQuotaSizeCommand.java @@ -0,0 +1,54 @@ +/****************************************************************** + * 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.james.cli.quota; + +import static org.apache.james.cli.domain.DomainDeleteCommand.DELETED_CODE; + +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; +import org.apache.james.httpclient.QuotaClient; + +import feign.Response; +import picocli.CommandLine; + [email protected]( + name = "delete", + description = "Delete quota sizes limit that applies for all users") +public class DeleteGlobalQuotaSizeCommand implements Callable<Integer> { + @CommandLine.ParentCommand + GlobalQuotaSizeCommand parentCommand; + + @Override + public Integer call() { + try { + QuotaClient quotaClient = parentCommand.parentCommand.quotaCommand.fullyQualifiedURL(); + Response rs = quotaClient.deleteQuotaSize(); + if (rs.status() == DELETED_CODE) { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } else { + return WebAdminCli.CLI_FINISHED_FAILED; + } + } catch (Exception e) { + e.printStackTrace(parentCommand.parentCommand.quotaCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GetGlobalQuotaCountCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GetGlobalQuotaCountCommand.java new file mode 100644 index 0000000..3270e90 --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GetGlobalQuotaCountCommand.java @@ -0,0 +1,51 @@ +/****************************************************************** + * 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.james.cli.quota; + +import java.util.Optional; +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; +import org.apache.james.httpclient.QuotaClient; + +import picocli.CommandLine; + [email protected]( + name = "get", + description = "Get quota counts limit that applies for all users") +public class GetGlobalQuotaCountCommand implements Callable<Integer> { + @CommandLine.ParentCommand + GlobalQuotaCountCommand parentCommand; + + @Override + public Integer call() { + try { + QuotaClient quotaClient = parentCommand.parentCommand.quotaCommand.fullyQualifiedURL(); + String message = Optional.ofNullable(quotaClient.getQuotaCount()) + .map(Object::toString) + .orElse("No global quota defined"); + parentCommand.parentCommand.quotaCommand.out.println(message); + return WebAdminCli.CLI_FINISHED_SUCCEED; + } catch (Exception e) { + e.printStackTrace(parentCommand.parentCommand.quotaCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GetGlobalQuotaSizeCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GetGlobalQuotaSizeCommand.java new file mode 100644 index 0000000..24eca51 --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GetGlobalQuotaSizeCommand.java @@ -0,0 +1,52 @@ +/****************************************************************** + * 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.james.cli.quota; + +import java.util.Optional; +import java.util.concurrent.Callable; + +import org.apache.commons.io.FileUtils; +import org.apache.james.cli.WebAdminCli; +import org.apache.james.httpclient.QuotaClient; + +import picocli.CommandLine; + [email protected]( + name = "get", + description = "Get quota sizes limit that applies for all users") +public class GetGlobalQuotaSizeCommand implements Callable<Integer> { + @CommandLine.ParentCommand + GlobalQuotaSizeCommand parentCommand; + + @Override + public Integer call() { + try { + QuotaClient quotaClient = parentCommand.parentCommand.quotaCommand.fullyQualifiedURL(); + String message = Optional.ofNullable(quotaClient.getQuotaSize()) + .map(FileUtils::byteCountToDisplaySize) + .orElse("No global quota defined"); + parentCommand.parentCommand.quotaCommand.out.println(message); + return WebAdminCli.CLI_FINISHED_SUCCEED; + } catch (Exception e) { + e.printStackTrace(parentCommand.parentCommand.quotaCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaCommand.java new file mode 100644 index 0000000..0b17c76 --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaCommand.java @@ -0,0 +1,43 @@ +/****************************************************************** + * 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.james.cli.quota; + +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; + +import picocli.CommandLine; + [email protected]( + name = "global", + description = "Quota that applies for all users", + subcommands = { + GlobalQuotaCountCommand.class, + GlobalQuotaSizeCommand.class + }) +public class GlobalQuotaCommand implements Callable<Integer> { + @CommandLine.ParentCommand + QuotaCommand quotaCommand; + + @Override + public Integer call() { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaCountCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaCountCommand.java new file mode 100644 index 0000000..bd4ee8d --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaCountCommand.java @@ -0,0 +1,44 @@ +/****************************************************************** + * 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.james.cli.quota; + +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; + +import picocli.CommandLine; + [email protected]( + name = "count", + description = "Quota counts limit that applies for all users", + subcommands = { + DeleteGlobalQuotaCountCommand.class, + GetGlobalQuotaCountCommand.class, + SetGlobalQuotaCountCommand.class + }) +public class GlobalQuotaCountCommand implements Callable<Integer> { + @CommandLine.ParentCommand + GlobalQuotaCommand parentCommand; + + @Override + public Integer call() { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaSizeCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaSizeCommand.java new file mode 100644 index 0000000..e0e77dd --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaSizeCommand.java @@ -0,0 +1,44 @@ +/****************************************************************** + * 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.james.cli.quota; + +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; + +import picocli.CommandLine; + [email protected]( + name = "size", + description = "Quota sizes limit that applies for all users", + subcommands = { + DeleteGlobalQuotaSizeCommand.class, + GetGlobalQuotaSizeCommand.class, + SetGlobalQuotaSizeCommand.class + }) +public class GlobalQuotaSizeCommand implements Callable<Integer> { + @CommandLine.ParentCommand + GlobalQuotaCommand parentCommand; + + @Override + public Integer call() { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/QuotaCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/QuotaCommand.java new file mode 100644 index 0000000..c3bf9b3 --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/QuotaCommand.java @@ -0,0 +1,56 @@ +/****************************************************************** + * 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.james.cli.quota; + +import java.io.PrintStream; +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; +import org.apache.james.httpclient.QuotaClient; + +import picocli.CommandLine; + [email protected]( + name = "quota", + description = "Manage Quotas", + subcommands = { + GlobalQuotaCommand.class + }) +public class QuotaCommand implements Callable<Integer> { + + protected final WebAdminCli webAdminCli; + protected final PrintStream out; + protected final PrintStream err; + + public QuotaCommand(PrintStream out, WebAdminCli webAdminCli, PrintStream err) { + this.out = out; + this.webAdminCli = webAdminCli; + this.err = err; + } + + @Override + public Integer call() { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } + + public QuotaClient fullyQualifiedURL() { + return webAdminCli.feignClientFactory(err).target(QuotaClient.class, webAdminCli.jamesUrl); + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/SetGlobalQuotaCountCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/SetGlobalQuotaCountCommand.java new file mode 100644 index 0000000..be4bbdc --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/SetGlobalQuotaCountCommand.java @@ -0,0 +1,57 @@ +/****************************************************************** + * 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.james.cli.quota; + +import static org.apache.james.cli.domain.DomainDeleteCommand.DELETED_CODE; + +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; +import org.apache.james.httpclient.QuotaClient; + +import feign.Response; +import picocli.CommandLine; + [email protected]( + name = "set", + description = "Quota counts limit that applies for all users") +public class SetGlobalQuotaCountCommand implements Callable<Integer> { + @CommandLine.ParentCommand + GlobalQuotaCountCommand parentCommand; + + @CommandLine.Parameters + Long count; + + @Override + public Integer call() { + try { + QuotaClient quotaClient = parentCommand.parentCommand.quotaCommand.fullyQualifiedURL(); + Response rs = quotaClient.setQuotaCount(count); + if (rs.status() == DELETED_CODE) { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } else { + return WebAdminCli.CLI_FINISHED_FAILED; + } + } catch (Exception e) { + e.printStackTrace(parentCommand.parentCommand.quotaCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/SetGlobalQuotaSizeCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/SetGlobalQuotaSizeCommand.java new file mode 100644 index 0000000..9a5f42c --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/quota/SetGlobalQuotaSizeCommand.java @@ -0,0 +1,58 @@ +/****************************************************************** + * 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.james.cli.quota; + +import static org.apache.james.cli.domain.DomainDeleteCommand.DELETED_CODE; + +import java.util.concurrent.Callable; + +import org.apache.james.cli.WebAdminCli; +import org.apache.james.httpclient.QuotaClient; +import org.apache.james.util.Size; + +import feign.Response; +import picocli.CommandLine; + [email protected]( + name = "set", + description = "Quota counts limit that applies for all users") +public class SetGlobalQuotaSizeCommand implements Callable<Integer> { + @CommandLine.ParentCommand + GlobalQuotaSizeCommand parentCommand; + + @CommandLine.Parameters + String size; + + @Override + public Integer call() { + try { + QuotaClient quotaClient = parentCommand.parentCommand.quotaCommand.fullyQualifiedURL(); + Response rs = quotaClient.setQuotaSize(Size.parse(size).asBytes()); + if (rs.status() == DELETED_CODE) { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } else { + return WebAdminCli.CLI_FINISHED_FAILED; + } + } catch (Exception e) { + e.printStackTrace(parentCommand.parentCommand.quotaCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } + } +} \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/httpclient/QuotaClient.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/httpclient/QuotaClient.java new file mode 100644 index 0000000..7aa7153 --- /dev/null +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/httpclient/QuotaClient.java @@ -0,0 +1,43 @@ +/****************************************************************** + * 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.james.httpclient; + +import feign.RequestLine; +import feign.Response; + +public interface QuotaClient { + @RequestLine("GET /quota/count") + Long getQuotaCount(); + + @RequestLine("GET /quota/size") + Long getQuotaSize(); + + @RequestLine("PUT /quota/count") + Response setQuotaCount(Long count); + + @RequestLine("PUT /quota/size") + Response setQuotaSize(Long size); + + @RequestLine("DELETE /quota/count") + Response deleteQuotaCount(); + + @RequestLine("DELETE /quota/size") + Response deleteQuotaSize(); +} diff --git a/server/protocols/webadmin-cli/src/test/java/org/apache/james/cli/QuotaManageTest.java b/server/protocols/webadmin-cli/src/test/java/org/apache/james/cli/QuotaManageTest.java new file mode 100644 index 0000000..0cc556f --- /dev/null +++ b/server/protocols/webadmin-cli/src/test/java/org/apache/james/cli/QuotaManageTest.java @@ -0,0 +1,210 @@ +/****************************************************************** + * 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.james.cli; + +import static org.apache.james.MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE; +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; + +import org.apache.james.GuiceJamesServer; +import org.apache.james.JamesServerBuilder; +import org.apache.james.JamesServerExtension; +import org.apache.james.modules.TestJMAPServerModule; +import org.apache.james.util.Port; +import org.apache.james.utils.WebAdminGuiceProbe; +import org.apache.james.webadmin.integration.WebadminIntegrationTestModule; +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import com.google.common.collect.ImmutableList; + +class QuotaManageTest { + @RegisterExtension + static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider()) + .server(configuration -> GuiceJamesServer.forConfiguration(configuration) + .combineWith(IN_MEMORY_SERVER_AGGREGATE_MODULE) + .overrideWith(new WebadminIntegrationTestModule()) + .overrideWith(new TestJMAPServerModule())) + .build(); + + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + private final ByteArrayOutputStream errorStreamCaptor = new ByteArrayOutputStream(); + + Port port; + + @BeforeEach + void setUp(GuiceJamesServer server) { + port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); + } + + @AfterEach + void tearDown() { + System.err.println(new String(errorStreamCaptor.toByteArray(), StandardCharsets.UTF_8)); + } + + @Nested + class Global { + @Nested + class Count { + @Test + void getShouldReturnNoneByDefault() { + int exitCode = executeFluent("quota", "global", "count", "get"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("No global quota defined".toCharArray()); + }); + } + + @Test + void getShouldReturnSetValue() { + executeFluent("quota", "global", "count", "set", "128"); + + int exitCode = executeFluent("quota", "global", "count", "get"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("128".toCharArray()); + }); + } + + @Test + void getShouldNotReturnDeletedValue() { + executeFluent("quota", "global", "count", "set", "128"); + + executeFluent("quota", "global", "count", "delete"); + + int exitCode = executeFluent("quota", "global", "count", "get"); + + SoftAssertions.assertSoftly(softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("No global quota defined".toCharArray()); + }); + } + + @Test + void deleteShouldBeIdempotent() { + executeFluent("quota", "global", "count", "delete"); + int exitCode = executeFluent("quota", "global", "count", "delete"); + + assertThat(exitCode).isEqualTo(0); + } + + @Test + void setShouldRespectLastWriteWin() { + executeFluent("quota", "global", "count", "set", "128"); + executeFluent("quota", "global", "count", "set", "256"); + + int exitCode = executeFluent("quota", "global", "count", "get"); + + SoftAssertions.assertSoftly(softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("256".toCharArray()); + }); + } + } + + @Nested + class Size { + @Test + void getShouldReturnNoneByDefault() { + int exitCode = executeFluent("quota", "global", "size", "get"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("No global quota defined".toCharArray()); + }); + } + + @Test + void getShouldReturnSetValue() { + executeFluent("quota", "global", "size", "set", "128"); + + int exitCode = executeFluent("quota", "global", "size", "get"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("128 bytes".toCharArray()); + }); + } + + @Test + void unitsShouldBeSupported() { + executeFluent("quota", "global", "size", "set", "128M"); + + int exitCode = executeFluent("quota", "global", "size", "get"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("128 MB".toCharArray()); + }); + } + + @Test + void getShouldNotReturnDeletedValue() { + executeFluent("quota", "global", "size", "set", "128"); + + executeFluent("quota", "global", "size", "delete"); + + int exitCode = executeFluent("quota", "global", "size", "get"); + + SoftAssertions.assertSoftly(softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("No global quota defined".toCharArray()); + }); + } + + @Test + void deleteShouldBeIdempotent() { + executeFluent("quota", "global", "size", "delete"); + int exitCode = executeFluent("quota", "global", "size", "delete"); + + assertThat(exitCode).isEqualTo(0); + } + + @Test + void setShouldRespectLastWriteWin() { + executeFluent("quota", "global", "size", "set", "128"); + executeFluent("quota", "global", "size", "set", "256"); + + int exitCode = executeFluent("quota", "global", "size", "get"); + + SoftAssertions.assertSoftly(softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("256 bytes".toCharArray()); + }); + } + } + } + + private int executeFluent(String... args) { + return WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), + ImmutableList.<String>builder().add("--url", "http://127.0.0.1:" + port.getValue()) + .addAll(ImmutableList.copyOf(args)) + .build()); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
