use of org.apache.kafka.common.quota.ClientQuotaEntity in project kafka by apache.
the class ClientQuotaControlManagerTest method testInvalidQuotaKeys.
@Test
public void testInvalidQuotaKeys() {
SnapshotRegistry snapshotRegistry = new SnapshotRegistry(new LogContext());
ClientQuotaControlManager manager = new ClientQuotaControlManager(snapshotRegistry);
ClientQuotaEntity entity = entity(ClientQuotaEntity.USER, "user-1");
// Invalid + valid keys
assertInvalidQuota(manager, entity, quotas("not.a.quota.key", 0.0, QuotaConfigs.REQUEST_PERCENTAGE_OVERRIDE_CONFIG, 99.9));
// Valid + invalid keys
assertInvalidQuota(manager, entity, quotas(QuotaConfigs.REQUEST_PERCENTAGE_OVERRIDE_CONFIG, 99.9, "not.a.quota.key", 0.0));
// Null key
assertInvalidQuota(manager, entity, quotas(null, 99.9));
}
use of org.apache.kafka.common.quota.ClientQuotaEntity in project kafka by apache.
the class AlterClientQuotasResponse method fromQuotaEntities.
public static AlterClientQuotasResponse fromQuotaEntities(Map<ClientQuotaEntity, ApiError> result, int throttleTimeMs) {
List<EntryData> entries = new ArrayList<>(result.size());
for (Map.Entry<ClientQuotaEntity, ApiError> entry : result.entrySet()) {
ApiError e = entry.getValue();
entries.add(new EntryData().setErrorCode(e.error().code()).setErrorMessage(e.message()).setEntity(toEntityData(entry.getKey())));
}
return new AlterClientQuotasResponse(new AlterClientQuotasResponseData().setThrottleTimeMs(throttleTimeMs).setEntries(entries));
}
use of org.apache.kafka.common.quota.ClientQuotaEntity in project kafka by apache.
the class ClientQuotasImage method describe.
public DescribeClientQuotasResponseData describe(DescribeClientQuotasRequestData request) {
DescribeClientQuotasResponseData response = new DescribeClientQuotasResponseData();
Map<String, String> exactMatch = new HashMap<>();
Set<String> typeMatch = new HashSet<>();
for (DescribeClientQuotasRequestData.ComponentData component : request.components()) {
if (component.entityType().isEmpty()) {
throw new InvalidRequestException("Invalid empty entity type.");
} else if (exactMatch.containsKey(component.entityType()) || typeMatch.contains(component.entityType())) {
throw new InvalidRequestException("Entity type " + component.entityType() + " cannot appear more than once in the filter.");
}
if (!(component.entityType().equals(IP) || component.entityType().equals(USER) || component.entityType().equals(CLIENT_ID))) {
throw new UnsupportedVersionException("Unsupported entity type " + component.entityType());
}
switch(component.matchType()) {
case MATCH_TYPE_EXACT:
if (component.match() == null) {
throw new InvalidRequestException("Request specified " + "MATCH_TYPE_EXACT, but set match string to null.");
}
exactMatch.put(component.entityType(), component.match());
break;
case MATCH_TYPE_DEFAULT:
if (component.match() != null) {
throw new InvalidRequestException("Request specified " + "MATCH_TYPE_DEFAULT, but also specified a match string.");
}
exactMatch.put(component.entityType(), null);
break;
case MATCH_TYPE_SPECIFIED:
if (component.match() != null) {
throw new InvalidRequestException("Request specified " + "MATCH_TYPE_SPECIFIED, but also specified a match string.");
}
typeMatch.add(component.entityType());
break;
default:
throw new InvalidRequestException("Unknown match type " + component.matchType());
}
}
if (exactMatch.containsKey(IP) || typeMatch.contains(IP)) {
if ((exactMatch.containsKey(USER) || typeMatch.contains(USER)) || (exactMatch.containsKey(CLIENT_ID) || typeMatch.contains(CLIENT_ID))) {
throw new InvalidRequestException("Invalid entity filter component " + "combination. IP filter component should not be used with " + "user or clientId filter component.");
}
}
// TODO: this is O(N). We should add indexing here to speed it up. See KAFKA-13022.
for (Entry<ClientQuotaEntity, ClientQuotaImage> entry : entities.entrySet()) {
ClientQuotaEntity entity = entry.getKey();
ClientQuotaImage quotaImage = entry.getValue();
if (matches(entity, exactMatch, typeMatch, request.strict())) {
response.entries().add(toDescribeEntry(entity, quotaImage));
}
}
return response;
}
use of org.apache.kafka.common.quota.ClientQuotaEntity in project kafka by apache.
the class ClientQuotasDelta method apply.
public ClientQuotasImage apply() {
Map<ClientQuotaEntity, ClientQuotaImage> newEntities = new HashMap<>(image.entities().size());
for (Entry<ClientQuotaEntity, ClientQuotaImage> entry : image.entities().entrySet()) {
ClientQuotaEntity entity = entry.getKey();
ClientQuotaDelta change = changes.get(entity);
if (change == null) {
newEntities.put(entity, entry.getValue());
} else {
ClientQuotaImage quotaImage = change.apply();
if (!quotaImage.isEmpty()) {
newEntities.put(entity, quotaImage);
}
}
}
for (Entry<ClientQuotaEntity, ClientQuotaDelta> entry : changes.entrySet()) {
ClientQuotaEntity entity = entry.getKey();
if (!newEntities.containsKey(entity)) {
ClientQuotaImage quotaImage = entry.getValue().apply();
if (!quotaImage.isEmpty()) {
newEntities.put(entity, quotaImage);
}
}
}
return new ClientQuotasImage(newEntities);
}
use of org.apache.kafka.common.quota.ClientQuotaEntity in project kafka by apache.
the class DescribeClientQuotasResponse method fromQuotaEntities.
public static DescribeClientQuotasResponse fromQuotaEntities(Map<ClientQuotaEntity, Map<String, Double>> entities, int throttleTimeMs) {
List<EntryData> entries = new ArrayList<>(entities.size());
for (Map.Entry<ClientQuotaEntity, Map<String, Double>> entry : entities.entrySet()) {
ClientQuotaEntity quotaEntity = entry.getKey();
List<EntityData> entityData = new ArrayList<>(quotaEntity.entries().size());
for (Map.Entry<String, String> entityEntry : quotaEntity.entries().entrySet()) {
entityData.add(new EntityData().setEntityType(entityEntry.getKey()).setEntityName(entityEntry.getValue()));
}
Map<String, Double> quotaValues = entry.getValue();
List<ValueData> valueData = new ArrayList<>(quotaValues.size());
for (Map.Entry<String, Double> valuesEntry : entry.getValue().entrySet()) {
valueData.add(new ValueData().setKey(valuesEntry.getKey()).setValue(valuesEntry.getValue()));
}
entries.add(new EntryData().setEntity(entityData).setValues(valueData));
}
return new DescribeClientQuotasResponse(new DescribeClientQuotasResponseData().setThrottleTimeMs(throttleTimeMs).setErrorCode((short) 0).setErrorMessage(null).setEntries(entries));
}
Aggregations