in core/src/main/scala/kafka/server/AdminManager.scala [855:939]
def handleDescribeClientQuotas(userComponent: Option[ClientQuotaFilterComponent],
clientIdComponent: Option[ClientQuotaFilterComponent], strict: Boolean): Map[ClientQuotaEntity, Map[String, Double]] = {
def toOption(opt: java.util.Optional[String]): Option[String] =
if (opt == null)
None
else if (opt.isPresent)
Some(opt.get)
else
Some(null)
val user = userComponent.flatMap(c => toOption(c.`match`))
val clientId = clientIdComponent.flatMap(c => toOption(c.`match`))
def sanitized(name: Option[String]): String = name.map(n => sanitizeEntityName(n)).getOrElse("")
val sanitizedUser = sanitized(user)
val sanitizedClientId = sanitized(clientId)
def wantExact(component: Option[ClientQuotaFilterComponent]): Boolean = component.exists(_.`match` != null)
val exactUser = wantExact(userComponent)
val exactClientId = wantExact(clientIdComponent)
def wantExcluded(component: Option[ClientQuotaFilterComponent]): Boolean = strict && !component.isDefined
val excludeUser = wantExcluded(userComponent)
val excludeClientId = wantExcluded(clientIdComponent)
val userEntries = if (exactUser && excludeClientId)
Map((Some(user.get), None) -> adminZkClient.fetchEntityConfig(ConfigType.User, sanitizedUser))
else if (!excludeUser && !exactClientId)
adminZkClient.fetchAllEntityConfigs(ConfigType.User).map { case (name, props) =>
(Some(desanitizeEntityName(name)), None) -> props
}
else
Map.empty
val clientIdEntries = if (excludeUser && exactClientId)
Map((None, Some(clientId.get)) -> adminZkClient.fetchEntityConfig(ConfigType.Client, sanitizedClientId))
else if (!exactUser && !excludeClientId)
adminZkClient.fetchAllEntityConfigs(ConfigType.Client).map { case (name, props) =>
(None, Some(desanitizeEntityName(name))) -> props
}
else
Map.empty
val bothEntries = if (exactUser && exactClientId)
Map((Some(user.get), Some(clientId.get)) ->
adminZkClient.fetchEntityConfig(ConfigType.User, s"${sanitizedUser}/clients/${sanitizedClientId}"))
else if (!excludeUser && !excludeClientId)
adminZkClient.fetchAllChildEntityConfigs(ConfigType.User, ConfigType.Client).map { case (name, props) =>
val components = name.split("/")
if (components.size != 3 || components(1) != "clients")
throw new IllegalArgumentException(s"Unexpected config path: ${name}")
(Some(desanitizeEntityName(components(0))), Some(desanitizeEntityName(components(2)))) -> props
}
else
Map.empty
def matches(nameComponent: Option[ClientQuotaFilterComponent], name: Option[String]): Boolean = nameComponent match {
case Some(component) =>
toOption(component.`match`) match {
case Some(n) => name.exists(_ == n)
case None => name.isDefined
}
case None =>
!name.isDefined || !strict
}
def fromProps(props: Map[String, String]): Map[String, Double] = {
props.map { case (key, value) =>
val doubleValue = try value.toDouble catch {
case _: NumberFormatException =>
throw new IllegalStateException(s"Unexpected client quota configuration value: $key -> $value")
}
key -> doubleValue
}
}
(userEntries ++ clientIdEntries ++ bothEntries).map { case ((u, c), p) =>
val quotaProps = p.asScala.filter { case (key, _) => QuotaConfigs.isQuotaConfig(key) }
if (quotaProps.nonEmpty && matches(userComponent, u) && matches(clientIdComponent, c))
Some(userClientIdToEntity(u, c) -> fromProps(quotaProps))
else
None
}.flatten.toMap
}