/**
* Copyright 2016 Yahoo Inc.
*
* Licensed 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 com.yahoo.pulsar.admin.cli;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException;
import com.beust.jcommander.Parameters;
import com.yahoo.pulsar.client.admin.PulsarAdmin;
import com.yahoo.pulsar.client.admin.PulsarAdminException;
import com.yahoo.pulsar.common.policies.data.ResourceQuota;
@Parameters(commandDescription = "Operations about resource quotas")
public class CmdResourceQuotas extends CmdBase {
@Parameters(commandDescription = "Get the resource quota for specified namespace bundle, or default quota if no namespace/bundle specified.")
private class GetResourceQuota extends CliCommand {
@Parameter(names = { "--namespace",
"-n" }, description = "property/cluster/namespace, must be specified together with '--bundle'\n")
private java.util.List<String> names;
@Parameter(names = { "--bundle",
"-b" }, description = "{start-boundary}_{end-boundary}, must be specified together with '--namespace'\n")
private String bundle;
@Override
void run() throws PulsarAdminException, ParameterException {
if (bundle == null && names == null) {
print(admin.resourceQuotas().getDefaultResourceQuota());
} else if (bundle != null && names != null) {
String namespace = validateNamespace(names);
print(admin.resourceQuotas().getNamespaceBundleResourceQuota(namespace, bundle));
} else {
throw new ParameterException("namespace and bundle must be provided together.");
}
}
}
@Parameters(commandDescription = "Set the resource quota for specified namespace bundle, or default quota if no namespace/bundle specified.")
private class SetResourceQuota extends CliCommand {
@Parameter(names = { "--namespace",
"-n" }, description = "property/cluster/namespace, must be specified together with '--bundle'\n")
private java.util.List<String> names;
@Parameter(names = { "--bundle",
"-b" }, description = "{start-boundary}_{end-boundary}, must be specified together with '--namespace'\n")
private String bundle;
@Parameter(names = { "--msgRateIn",
"-mi" }, description = "expected incoming messages per second\n", required = true)
private long msgRateIn = 0;
@Parameter(names = { "--msgRateOut",
"-mo" }, description = "expected outgoing messages per second\n", required = true)
private long msgRateOut = 0;
@Parameter(names = { "--bandwidthIn",
"-bi" }, description = "expected inbound bandwidth (bytes/second)\n", required = true)
private long bandwidthIn = 0;
@Parameter(names = { "--bandwidthOut",
"-bo" }, description = "expected outbound bandwidth (bytes/second)\n", required = true)
private long bandwidthOut = 0;
@Parameter(names = { "--memory", "-mem" }, description = "expected memory usage (Mbytes)\n", required = true)
private long memory = 0;
@Parameter(names = { "--dynamic",
"-d" }, description = "dynamic (allow to be dynamically re-calculated) or not\n")
private boolean dynamic = false;
@Override
void run() throws PulsarAdminException {
ResourceQuota quota = new ResourceQuota();
quota.setMsgRateIn(msgRateIn);
quota.setMsgRateOut(msgRateOut);
quota.setBandwidthIn(bandwidthIn);
quota.setBandwidthOut(bandwidthOut);
quota.setMemory(memory);
quota.setDynamic(dynamic);
if (bundle == null && names == null) {
admin.resourceQuotas().setDefaultResourceQuota(quota);
} else if (bundle != null && names != null) {
String namespace = validateNamespace(names);
admin.resourceQuotas().setNamespaceBundleResourceQuota(namespace, bundle, quota);
} else {
throw new ParameterException("namespace and bundle must be provided together.");
}
}
}
@Parameters(commandDescription = "Reset the specified namespace bundle's resource quota to default value.")
private class ResetNamespaceBundleResourceQuota extends CliCommand {
@Parameter(names = { "--namespace", "-n" }, description = "property/cluster/namespace\n", required = true)
private java.util.List<String> names;
@Parameter(names = { "--bundle", "-b" }, description = "{start-boundary}_{end-boundary}\n", required = true)
private String bundle;
@Override
void run() throws PulsarAdminException {
String namespace = validateNamespace(names);
admin.resourceQuotas().resetNamespaceBundleResourceQuota(namespace, bundle);
}
}
public CmdResourceQuotas(PulsarAdmin admin) {
super("resource-quotas", admin);
jcommander.addCommand("get", new GetResourceQuota());
jcommander.addCommand("set", new SetResourceQuota());
jcommander.addCommand("reset-namespace-bundle-quota", new ResetNamespaceBundleResourceQuota());
}
}