content: /*
   * 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.kafka.clients.admin;
  
  import org.apache.kafka.clients.ClientDnsLookup;
  import org.apache.kafka.clients.CommonClientConfigs;
  import org.apache.kafka.clients.MetadataRecoveryStrategy;
  import org.apache.kafka.common.config.AbstractConfig;
  import org.apache.kafka.common.config.ConfigDef;
  import org.apache.kafka.common.config.ConfigDef.Importance;
  import org.apache.kafka.common.config.ConfigDef.Type;
  import org.apache.kafka.common.config.SecurityConfig;
  import org.apache.kafka.common.metrics.JmxReporter;
  import org.apache.kafka.common.metrics.Sensor;
  import org.apache.kafka.common.security.auth.SecurityProtocol;
  import org.apache.kafka.common.utils.Utils;
  
  import java.util.Map;
  import java.util.Set;
  
  import static org.apache.kafka.common.config.ConfigDef.Range.atLeast;
  import static org.apache.kafka.common.config.ConfigDef.Range.between;
  import static org.apache.kafka.common.config.ConfigDef.ValidString.in;
  
  /**
   * The AdminClient configuration class, which also contains constants for configuration entry names.
   */
  public class AdminClientConfig extends AbstractConfig {
      private static final ConfigDef CONFIG;
  
      /**
       * <code>bootstrap.servers</code>
       */
      public static final String BOOTSTRAP_SERVERS_CONFIG = CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG;
      private static final String BOOTSTRAP_SERVERS_DOC = CommonClientConfigs.BOOTSTRAP_SERVERS_DOC;
  
      /**
       * <code>bootstrap.controllers</code>
       */
      public static final String BOOTSTRAP_CONTROLLERS_CONFIG = "bootstrap.controllers";
      public static final String BOOTSTRAP_CONTROLLERS_DOC = "A list of host/port pairs to use for establishing the initial " +
              "connection to the KRaft controller quorum. This list should be in the form <code>host1:port1,host2:port2,...</code>.";
  
      /**
       * <code>client.dns.lookup</code>
       */
      public static final String CLIENT_DNS_LOOKUP_CONFIG = CommonClientConfigs.CLIENT_DNS_LOOKUP_CONFIG;
      private static final String CLIENT_DNS_LOOKUP_DOC = CommonClientConfigs.CLIENT_DNS_LOOKUP_DOC;
  
      /**
       * <code>reconnect.backoff.ms</code>
       */
      public static final String RECONNECT_BACKOFF_MS_CONFIG = CommonClientConfigs.RECONNECT_BACKOFF_MS_CONFIG;
      private static final String RECONNECT_BACKOFF_MS_DOC = CommonClientConfigs.RECONNECT_BACKOFF_MS_DOC;
  
      /**
       * <code>reconnect.backoff.max.ms</code>
       */
      public static final String RECONNECT_BACKOFF_MAX_MS_CONFIG = CommonClientConfigs.RECONNECT_BACKOFF_MAX_MS_CONFIG;
      private static final String RECONNECT_BACKOFF_MAX_MS_DOC = CommonClientConfigs.RECONNECT_BACKOFF_MAX_MS_DOC;
  
      /**
       * <code>retry.backoff.ms</code>
       */
      public static final String RETRY_BACKOFF_MS_CONFIG = CommonClientConfigs.RETRY_BACKOFF_MS_CONFIG;
      private static final String RETRY_BACKOFF_MS_DOC = CommonClientConfigs.RETRY_BACKOFF_MS_DOC;
  
      /**
       * <code>retry.backoff.max.ms</code>
       */
      public static final String RETRY_BACKOFF_MAX_MS_CONFIG = CommonClientConfigs.RETRY_BACKOFF_MAX_MS_CONFIG;
      private static final String RETRY_BACKOFF_MAX_MS_DOC = CommonClientConfigs.RETRY_BACKOFF_MAX_MS_DOC;
  
      /**
       * <code>enable.metrics.push</code>
       */
      public static final String ENABLE_METRICS_PUSH_CONFIG = CommonClientConfigs.ENABLE_METRICS_PUSH_CONFIG;
      public static final String ENABLE_METRICS_PUSH_DOC = CommonClientConfigs.ENABLE_METRICS_PUSH_DOC;
  
      /** <code>socket.connection.setup.timeout.ms</code> */
      public static final String SOCKET_CONNECTION_SETUP_TIMEOUT_MS_CONFIG = CommonClientConfigs.SOCKET_CONNECTION_SETUP_TIMEOUT_MS_CONFIG;
  
      /** <code>socket.connection.setup.timeout.max.ms</code> */
      public static final String SOCKET_CONNECTION_SETUP_TIMEOUT_MAX_MS_CONFIG = CommonClientConfigs.SOCKET_CONNECTION_SETUP_TIMEOUT_MAX_MS_CONFIG;
  
      /** <code>connections.max.idle.ms</code> */
      public static final String CONNECTIONS_MAX_IDLE_MS_CONFIG = CommonClientConfigs.CONNECTIONS_MAX_IDLE_MS_CONFIG;
      private static final String CONNECTIONS_MAX_IDLE_MS_DOC = CommonClientConfigs.CONNECTIONS_MAX_IDLE_MS_DOC;
  
      /** <code>request.timeout.ms</code> */
      public static final String REQUEST_TIMEOUT_MS_CONFIG = CommonClientConfigs.REQUEST_TIMEOUT_MS_CONFIG;
      private static final String REQUEST_TIMEOUT_MS_DOC = CommonClientConfigs.REQUEST_TIMEOUT_MS_DOC;
  
      public static final String CLIENT_ID_CONFIG = CommonClientConfigs.CLIENT_ID_CONFIG;
      private static final String CLIENT_ID_DOC = CommonClientConfigs.CLIENT_ID_DOC;
  
      public static final String METADATA_MAX_AGE_CONFIG = CommonClientConfigs.METADATA_MAX_AGE_CONFIG;
      private static final String METADATA_MAX_AGE_DOC = CommonClientConfigs.METADATA_MAX_AGE_DOC;
  
      public static final String SEND_BUFFER_CONFIG = CommonClientConfigs.SEND_BUFFER_CONFIG;
      private static final String SEND_BUFFER_DOC = CommonClientConfigs.SEND_BUFFER_DOC;
  
      public static final String RECEIVE_BUFFER_CONFIG = CommonClientConfigs.RECEIVE_BUFFER_CONFIG;
      private static final String RECEIVE_BUFFER_DOC = CommonClientConfigs.RECEIVE_BUFFER_DOC;
  
      public static final String METRIC_REPORTER_CLASSES_CONFIG = CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG;
      private static final String METRIC_REPORTER_CLASSES_DOC = CommonClientConfigs.METRIC_REPORTER_CLASSES_DOC;
  
      public static final String METRICS_NUM_SAMPLES_CONFIG = CommonClientConfigs.METRICS_NUM_SAMPLES_CONFIG;
      private static final String METRICS_NUM_SAMPLES_DOC = CommonClientConfigs.METRICS_NUM_SAMPLES_DOC;
  
      public static final String METRICS_SAMPLE_WINDOW_MS_CONFIG = CommonClientConfigs.METRICS_SAMPLE_WINDOW_MS_CONFIG;
      private static final String METRICS_SAMPLE_WINDOW_MS_DOC = CommonClientConfigs.METRICS_SAMPLE_WINDOW_MS_DOC;
  
      public static final String METRICS_RECORDING_LEVEL_CONFIG = CommonClientConfigs.METRICS_RECORDING_LEVEL_CONFIG;
  
      public static final String SECURITY_PROTOCOL_CONFIG = CommonClientConfigs.SECURITY_PROTOCOL_CONFIG;
      public static final String DEFAULT_SECURITY_PROTOCOL = CommonClientConfigs.DEFAULT_SECURITY_PROTOCOL;
      private static final String SECURITY_PROTOCOL_DOC = CommonClientConfigs.SECURITY_PROTOCOL_DOC;
      private static final String METRICS_RECORDING_LEVEL_DOC = CommonClientConfigs.METRICS_RECORDING_LEVEL_DOC;
  
      public static final String RETRIES_CONFIG = CommonClientConfigs.RETRIES_CONFIG;
      public static final String DEFAULT_API_TIMEOUT_MS_CONFIG = CommonClientConfigs.DEFAULT_API_TIMEOUT_MS_CONFIG;
  
      public static final String METADATA_RECOVERY_STRATEGY_CONFIG = CommonClientConfigs.METADATA_RECOVERY_STRATEGY_CONFIG;
      public static final String METADATA_RECOVERY_STRATEGY_DOC = CommonClientConfigs.METADATA_RECOVERY_STRATEGY_DOC;
      public static final String DEFAULT_METADATA_RECOVERY_STRATEGY = CommonClientConfigs.DEFAULT_METADATA_RECOVERY_STRATEGY;
  
      public static final String METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS_CONFIG = CommonClientConfigs.METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS_CONFIG;
      public static final String METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS_DOC = CommonClientConfigs.METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS_DOC;
      public static final long DEFAULT_METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS = CommonClientConfigs.DEFAULT_METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS;
  
      /**
       * <code>security.providers</code>
       */
      public static final String SECURITY_PROVIDERS_CONFIG = SecurityConfig.SECURITY_PROVIDERS_CONFIG;
      private static final String SECURITY_PROVIDERS_DOC = SecurityConfig.SECURITY_PROVIDERS_DOC;
  
      static {
          CONFIG = new ConfigDef().define(BOOTSTRAP_SERVERS_CONFIG,
                                          Type.LIST,
                                          "",
                                          Importance.HIGH,
                                          BOOTSTRAP_SERVERS_DOC).
                                   define(BOOTSTRAP_CONTROLLERS_CONFIG,
                                           Type.LIST,
                                           "",
                                           Importance.HIGH,
                                           BOOTSTRAP_CONTROLLERS_DOC)
                                  .define(CLIENT_ID_CONFIG, Type.STRING, "", Importance.MEDIUM, CLIENT_ID_DOC)
                                  .define(METADATA_MAX_AGE_CONFIG, Type.LONG, 5 * 60 * 1000, atLeast(0), Importance.LOW, METADATA_MAX_AGE_DOC)
                                  .define(SEND_BUFFER_CONFIG, Type.INT, 128 * 1024, atLeast(CommonClientConfigs.SEND_BUFFER_LOWER_BOUND), Importance.MEDIUM, SEND_BUFFER_DOC)
                                  .define(RECEIVE_BUFFER_CONFIG, Type.INT, 64 * 1024, atLeast(CommonClientConfigs.RECEIVE_BUFFER_LOWER_BOUND), Importance.MEDIUM, RECEIVE_BUFFER_DOC)
                                  .define(RECONNECT_BACKOFF_MS_CONFIG,
                                          Type.LONG,
                                          50L,
                                          atLeast(0L),
                                          Importance.LOW,
                                          RECONNECT_BACKOFF_MS_DOC)
                                  .define(RECONNECT_BACKOFF_MAX_MS_CONFIG,
                                          Type.LONG,
                                          1000L,
                                          atLeast(0L),
                                          Importance.LOW,
                                          RECONNECT_BACKOFF_MAX_MS_DOC)
                                  .define(RETRY_BACKOFF_MS_CONFIG,
                                          Type.LONG,
                                          CommonClientConfigs.DEFAULT_RETRY_BACKOFF_MS,
                                          atLeast(0L),
                                          Importance.LOW,
                                          RETRY_BACKOFF_MS_DOC)
                                  .define(RETRY_BACKOFF_MAX_MS_CONFIG,
                                          Type.LONG,
                                          CommonClientConfigs.DEFAULT_RETRY_BACKOFF_MAX_MS,
                                          atLeast(0L),
                                          Importance.LOW,
                                          RETRY_BACKOFF_MAX_MS_DOC)
                                  .define(ENABLE_METRICS_PUSH_CONFIG,
                                          Type.BOOLEAN,
                                          false,
                                          Importance.LOW,
                                          ENABLE_METRICS_PUSH_DOC)
                                  .define(REQUEST_TIMEOUT_MS_CONFIG,
                                          Type.INT,
                                          30000,
                                          atLeast(0),
                                          Importance.MEDIUM,
                                          REQUEST_TIMEOUT_MS_DOC)
                                  .define(SOCKET_CONNECTION_SETUP_TIMEOUT_MS_CONFIG,
                                          Type.LONG,
                                          CommonClientConfigs.DEFAULT_SOCKET_CONNECTION_SETUP_TIMEOUT_MS,
                                          Importance.MEDIUM,
                                          CommonClientConfigs.SOCKET_CONNECTION_SETUP_TIMEOUT_MS_DOC)
                                  .define(SOCKET_CONNECTION_SETUP_TIMEOUT_MAX_MS_CONFIG,
                                          Type.LONG,
                                          CommonClientConfigs.DEFAULT_SOCKET_CONNECTION_SETUP_TIMEOUT_MAX_MS,
                                          Importance.MEDIUM,
                                          CommonClientConfigs.SOCKET_CONNECTION_SETUP_TIMEOUT_MAX_MS_DOC)
                                  .define(CONNECTIONS_MAX_IDLE_MS_CONFIG,
                                          Type.LONG,
                                          5 * 60 * 1000,
                                          Importance.MEDIUM,
                                          CONNECTIONS_MAX_IDLE_MS_DOC)
                                  .define(RETRIES_CONFIG,
                                          Type.INT,
                                          Integer.MAX_VALUE,
                                          between(0, Integer.MAX_VALUE),
                                          Importance.LOW,
                                          CommonClientConfigs.RETRIES_DOC)
                                  .define(DEFAULT_API_TIMEOUT_MS_CONFIG,
                                          Type.INT,
                                          60000,
                                          atLeast(0),
                                          Importance.MEDIUM,
                                          CommonClientConfigs.DEFAULT_API_TIMEOUT_MS_DOC)
                                  .define(METRICS_SAMPLE_WINDOW_MS_CONFIG,
                                          Type.LONG,
                                          30000,
                                          atLeast(0),
                                          Importance.LOW,
                                          METRICS_SAMPLE_WINDOW_MS_DOC)
                                  .define(METRICS_NUM_SAMPLES_CONFIG, Type.INT, 2, atLeast(1), Importance.LOW, METRICS_NUM_SAMPLES_DOC)
                                  .define(METRIC_REPORTER_CLASSES_CONFIG,
                                          Type.LIST,
                                          JmxReporter.class.getName(),
                                          Importance.LOW,
                                          METRIC_REPORTER_CLASSES_DOC)
                                  .define(METRICS_RECORDING_LEVEL_CONFIG,
                                          Type.STRING,
                                          Sensor.RecordingLevel.INFO.toString(),
                                          in(Sensor.RecordingLevel.INFO.toString(), Sensor.RecordingLevel.DEBUG.toString(), Sensor.RecordingLevel.TRACE.toString()),
                                          Importance.LOW,
                                          METRICS_RECORDING_LEVEL_DOC)
                                  .define(CLIENT_DNS_LOOKUP_CONFIG,
                                          Type.STRING,
                                          ClientDnsLookup.USE_ALL_DNS_IPS.toString(),
                                          in(ClientDnsLookup.USE_ALL_DNS_IPS.toString(),
                                             ClientDnsLookup.RESOLVE_CANONICAL_BOOTSTRAP_SERVERS_ONLY.toString()),
                                          Importance.MEDIUM,
                                          CLIENT_DNS_LOOKUP_DOC)
                                  // security support
                                  .define(SECURITY_PROVIDERS_CONFIG,
                                          Type.STRING,
                                          null,
                                          Importance.LOW,
                                          SECURITY_PROVIDERS_DOC)
                                  .define(SECURITY_PROTOCOL_CONFIG,
                                          Type.STRING,
                                          DEFAULT_SECURITY_PROTOCOL,
                                          ConfigDef.CaseInsensitiveValidString
                                                  .in(Utils.enumOptions(SecurityProtocol.class)),
                                          Importance.MEDIUM,
                                          SECURITY_PROTOCOL_DOC)
                                  .withClientSslSupport()
                                  .withClientSaslSupport()
                                  .define(METADATA_RECOVERY_STRATEGY_CONFIG,
                                          Type.STRING,
                                          DEFAULT_METADATA_RECOVERY_STRATEGY,
                                          ConfigDef.CaseInsensitiveValidString
                                                  .in(Utils.enumOptions(MetadataRecoveryStrategy.class)),
                                          Importance.LOW,
                                          METADATA_RECOVERY_STRATEGY_DOC)
                                  .define(METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS_CONFIG,
                                          Type.LONG,
                                          DEFAULT_METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS,
                                          atLeast(0),
                                          Importance.LOW,
                                          METADATA_RECOVERY_REBOOTSTRAP_TRIGGER_MS_DOC);
      }
  
      @Override
      protected Map<String, Object> postProcessParsedConfig(final Map<String, Object> parsedValues) {
          CommonClientConfigs.postValidateSaslMechanismConfig(this);
          CommonClientConfigs.warnDisablingExponentialBackoff(this);
          return CommonClientConfigs.postProcessReconnectBackoffConfigs(this, parsedValues);
      }
  
      public AdminClientConfig(Map<?, ?> props) {
          this(props, false);
      }
  
      protected AdminClientConfig(Map<?, ?> props, boolean doLog) {
          super(CONFIG, props, doLog);
      }
  
      public static Set<String> configNames() {
          return CONFIG.names();
      }
  
      public static ConfigDef configDef() {
          return  new ConfigDef(CONFIG);
      }
  
      public static void main(String[] args) {
          System.out.println(CONFIG.toHtml(4, config -> "adminclientconfigs_" + config));
      }
  
  }
  