/**
 * 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.hadoop.mapreduce;

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceAudience.Public;
import org.apache.hadoop.classification.InterfaceStability.Unstable;

/**
 * Place holder for cluster level configuration keys.
 * 
 * The keys should have "mapreduce.cluster." as the prefix. 
 *
 */
@InterfaceAudience.Private
public interface MRConfig {

  // Cluster-level configuration parameters
  public static final String TEMP_DIR = "mapreduce.cluster.temp.dir";
  public static final String LOCAL_DIR = "mapreduce.cluster.local.dir";
  public static final String MAPMEMORY_MB = "mapreduce.cluster.mapmemory.mb";
  public static final String REDUCEMEMORY_MB = 
    "mapreduce.cluster.reducememory.mb";
  public static final String MR_ACLS_ENABLED = "mapreduce.cluster.acls.enabled";
  public static final String MR_ADMINS =
    "mapreduce.cluster.administrators";
  @Deprecated
  public static final String MR_SUPERGROUP =
    "mapreduce.cluster.permissions.supergroup";

  //Delegation token related keys
  public static final String  DELEGATION_KEY_UPDATE_INTERVAL_KEY = 
    "mapreduce.cluster.delegation.key.update-interval";
  public static final long    DELEGATION_KEY_UPDATE_INTERVAL_DEFAULT = 
    24*60*60*1000; // 1 day
  public static final String  DELEGATION_TOKEN_RENEW_INTERVAL_KEY = 
    "mapreduce.cluster.delegation.token.renew-interval";
  public static final long    DELEGATION_TOKEN_RENEW_INTERVAL_DEFAULT = 
    24*60*60*1000;  // 1 day
  public static final String  DELEGATION_TOKEN_MAX_LIFETIME_KEY = 
    "mapreduce.cluster.delegation.token.max-lifetime";
  public static final long    DELEGATION_TOKEN_MAX_LIFETIME_DEFAULT = 
    7*24*60*60*1000; // 7 days
  
  public static final String RESOURCE_CALCULATOR_PROCESS_TREE =
    "mapreduce.job.process-tree.class";
  public static final String STATIC_RESOLUTIONS = 
    "mapreduce.job.net.static.resolutions";

  public static final String MASTER_ADDRESS  = "mapreduce.jobtracker.address";
  public static final String MASTER_USER_NAME = 
    "mapreduce.jobtracker.kerberos.principal";

  public static final String FRAMEWORK_NAME  = "mapreduce.framework.name";
  public static final String CLASSIC_FRAMEWORK_NAME  = "classic";
  public static final String YARN_FRAMEWORK_NAME  = "yarn";
  public static final String LOCAL_FRAMEWORK_NAME = "local";

  public static final String TASK_LOCAL_OUTPUT_CLASS =
  "mapreduce.task.local.output.class";

  public static final String PROGRESS_STATUS_LEN_LIMIT_KEY =
    "mapreduce.task.max.status.length";
  public static final int PROGRESS_STATUS_LEN_LIMIT_DEFAULT = 512;

  public static final int MAX_BLOCK_LOCATIONS_DEFAULT = 15;
  public static final String MAX_BLOCK_LOCATIONS_KEY =
    "mapreduce.job.max.split.locations";

  public static final String SHUFFLE_SSL_ENABLED_KEY =
    "mapreduce.shuffle.ssl.enabled";

  public static final boolean SHUFFLE_SSL_ENABLED_DEFAULT = false;

  public static final String SHUFFLE_CONSUMER_PLUGIN =
    "mapreduce.job.reduce.shuffle.consumer.plugin.class";

  /**
   * Configuration key to enable/disable IFile readahead.
   */
  public static final String MAPRED_IFILE_READAHEAD =
    "mapreduce.ifile.readahead";

  public static final boolean DEFAULT_MAPRED_IFILE_READAHEAD = true;

  /**
   * Configuration key to set the IFile readahead length in bytes.
   */
  public static final String MAPRED_IFILE_READAHEAD_BYTES =
    "mapreduce.ifile.readahead.bytes";

  public static final int DEFAULT_MAPRED_IFILE_READAHEAD_BYTES =
    4 * 1024 * 1024;

  /**
   * Whether users are explicitly trying to control resource monitoring
   * configuration for the MiniMRCluster. Disabled by default.
   */
  public static final String MAPREDUCE_MINICLUSTER_CONTROL_RESOURCE_MONITORING
      = "mapreduce.minicluster.control-resource-monitoring";
  public static final boolean
      DEFAULT_MAPREDUCE_MINICLUSTER_CONTROL_RESOURCE_MONITORING = false;

  @Public
  @Unstable
  public static final String MAPREDUCE_APP_SUBMISSION_CROSS_PLATFORM =
      "mapreduce.app-submission.cross-platform";
  @Public
  @Unstable
  public static final boolean DEFAULT_MAPREDUCE_APP_SUBMISSION_CROSS_PLATFORM =
      false;

  /**
   * Enable application master webapp ui actions.
   */
  String MASTER_WEBAPP_UI_ACTIONS_ENABLED =
      "mapreduce.webapp.ui-actions.enabled";
  boolean DEFAULT_MASTER_WEBAPP_UI_ACTIONS_ENABLED = true;
  String MULTIPLE_OUTPUTS_CLOSE_THREAD_COUNT = "mapreduce.multiple-outputs-close-threads";
  int DEFAULT_MULTIPLE_OUTPUTS_CLOSE_THREAD_COUNT = 10;
}
  
