#
#
# 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.
#
#
class hdp2-hadoop::params(
) inherits hdp2::params 
{

  ##TODO: for testing in masterless mode
  $use_preconditions = false
  ####  
  $conf_dir = $hdp2::params::hadoop_conf_dir 

  ####### users

  $hdfs_user = $hdp2::params::hdfs_user
  $yarn_user = $hdp2::params::yarn_user
  $mapred_user = $hdp2::params::mapred_user
  
  ### hadoop-env
  
  $dtnode_heapsize = hdp_default("hadoop/hadoop-env/dtnode_heapsize","1024m")

  $hadoop_heapsize = hdp_default("hadoop/hadoop-env/hadoop_heapsize","1024m")

  $hadoop_logdirprefix = hdp_default("hadoop/hadoop-env/hadoop_logdirprefix","/var/log/hadoop")

  $hadoop_piddirprefix = hdp_default("hadoop/hadoop-env/hadoop_piddirprefix","/var/run/hadoop")
  $run_dir = $hadoop_piddirprefix
  
  $namenode_formatted_mark_dir = "${run_dir}/hdfs/namenode/formatted/"
  
  $yarn_heapsize = hdp_default("hadoop/yarn-env/yarn_heapsize","1024")

  $rm_heapsize = hdp_default("hadoop/yarn-env/rm_heapsize","1024")

  $rm_opt_maxnewsize = hdp_default("hadoop/yarn-env/rm_opt_maxnewsize","200m")

  $rm_opt_newsize = hdp_default("hadoop/yarn-env/rm_opt_newsize","200m")

  $namenode_heapsize = hdp_default("hadoop/hadoop-env/namenode_heapsize","1024m")

  $namenode_opt_maxnewsize = hdp_default("hadoop/hadoop-env/namenode_opt_maxnewsize","640m")

  $namenode_opt_newsize = hdp_default("hadoop/hadoop-env/namenode_opt_newsize","640m")
  
  ### compression related
  if (($hdp2::params::mapreduce_lzo_enabled == true) and ($hdp2::params::mapreduce_snappy_enabled == true)) {
    $mapred_compress_map_output = true
    $compression_codecs =  "org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.SnappyCodec"
    $mapred_map_output_compression_codec = "org.apache.hadoop.io.compress.SnappyCodec"
  } elsif ($hdp2::params::mapreduce_snappy_enabled == true) {
    $mapred_compress_map_output = true
    $compression_codecs = "org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec" 
    $mapred_map_output_compression_codec = "org.apache.hadoop.io.compress.SnappyCodec"
  } elsif ($hdp2::params::mapreduce_lzo_enabled == true) {
    $mapred_compress_map_output = true
    $compression_codecs = "org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec"
    $mapred_map_output_compression_codec = "com.hadoop.compression.lzo.LzoCodec"
  } else { 
    $mapred_compress_map_output = false
    $compression_codecs = "org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec"
    $mapred_map_output_compression_codec = "org.apache.hadoop.io.compress.DefaultCodec"
  }

  ### core-site
  $enable_security_authorization = hdp_default("hadoop/core-site/enable_security_authorization","false")

  $fs_checkpoint_dir = hdp_default("hadoop/core-site/fs_checkpoint_dir","/tmp/dfs/namesecondary")

  $proxyuser_group = hdp_default("hadoop/core-site/proxyuser_group","users")

  $security_type = hdp_default("hadoop/core-site/security_type","simple")
  
  ### hdfs-site
  $datanode_du_reserved = hdp_default("hadoop/hdfs-site/datanode_du_reserved",1073741824)

  $dfs_block_local_path_access_user = hdp_default("hadoop/hdfs-site/dfs_block_local_path_access_user","hbase")

  $dfs_data_dir = $hdp2::params::dfs_data_dir

  $dfs_datanode_address = hdp_default("hadoop/hdfs-site/dfs_datanode_address",50010)

  $dfs_datanode_data_dir_perm = hdp_default("hadoop/hdfs-site/dfs_datanode_data_dir_perm",750)

  $dfs_datanode_failed_volume_tolerated = hdp_default("hadoop/hdfs-site/dfs_datanode_failed_volume_tolerated",0)

  $dfs_datanode_http_address = hdp_default("hadoop/hdfs-site/dfs_datanode_http_address",50075)

  $dfs_exclude = hdp_default("hadoop/hdfs-site/dfs_exclude","dfs.exclude")

  $dfs_include = hdp_default("hadoop/hdfs-site/dfs_include","dfs.include")
  
  $dfs_name_dir = hdp_default("hadoop/hdfs-site/dfs_name_dir","/tmp/hadoop-hdfs/dfs/name")
  
  $dfs_replication = hdp_default("hadoop/hdfs-site/dfs_replication",3)

  $dfs_support_append = hdp_default("hadoop/hdfs-site/dfs_support_append",true)

  $dfs_webhdfs_enabled = hdp_default("hadoop/hdfs-site/dfs_webhdfs_enabled","false")


 ######### yarn #########

   ### yarn-site
  $yarn_nm_local_dirs = hdp_default("hadoop/yarn-site/yarn_nm_local_dirs","/tmp/hadoop-yarn/nm/local")

  $yarn_nm_log_dirs = hdp_default("hadoop/yarn-site/yarn_nm_log_dirs", "/tmp/hadoop-yarn/nm/logs")

  $scheduler_name = hdp_default("hadoop/yarn-site/scheduler_name","org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler")

  $container_executor = hdp_default("hadoop/yarn-site/container_executor","org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor")

 ######### mapred #######
   ### mapred-site

  $mapred_system_dir = '/mapred/system'

  $mapreduce_io_sort_mb = hdp_default("hadoop/mapred-site/mapreduce_io_sort_mb","200")

  $io_sort_spill_percent = hdp_default("hadoop/mapred-site/io_sort_spill_percent","0.9")

  $mapred_map_child_java_opts_sz = hdp_default("hadoop/mapred-site/mapred_map_child_java_opts_sz","-Xmx1024m")
  
  $mapred_reduce_child_java_opts_sz = hdp_default("hadoop/mapred-site/mapred_reduce_child_java_opts_sz","-Xmx2048m")

  $mapred_cluster_map_mem_mb = hdp_default("hadoop/mapred-site/mapred_cluster_map_mem_mb","-1")

  $mapred_cluster_max_map_mem_mb = hdp_default("hadoop/mapred-site/mapred_cluster_max_map_mem_mb","-1")

  $mapred_cluster_max_red_mem_mb = hdp_default("hadoop/mapred-site/mapred_cluster_max_red_mem_mb","-1")

  $mapred_cluster_red_mem_mb = hdp_default("hadoop/mapred-site/mapred_cluster_red_mem_mb","-1")

  $mapred_hosts_exclude = hdp_default("hadoop/mapred-site/mapred_hosts_exclude","mapred.exclude")

  $mapred_hosts_include = hdp_default("hadoop/mapred-site/mapred_hosts_include","mapred.include")

  $mapred_job_map_mem_mb = hdp_default("hadoop/mapred-site/mapred_job_map_mem_mb","1024")

  $mapred_job_red_mem_mb = hdp_default("hadoop/mapred-site/mapred_job_red_mem_mb","2048")

  $mapred_jobstatus_dir = hdp_default("hadoop/mapred-site/mapred_jobstatus_dir","file:////mapred/jobstatus")

  $mapred_local_dir = hdp_default("hadoop/mapred-site/mapred_local_dir","/tmp/hadoop-mapred/mapred/local")
   
  $mapred_map_tasks_max = hdp_default("hadoop/mapred-site/mapred_map_tasks_max",4)

  $mapred_red_tasks_max = hdp_default("hadoop/mapred-site/mapred_red_tasks_max",4)

  $mapreduce_userlog_retainhours = hdp_default("hadoop/mapred-site/mapreduce_userlog_retainhours",24)

  $maxtasks_per_job = hdp_default("hadoop/mapred-site/maxtasks_per_job","-1")

  $task_controller = hdp_default("hadoop/mapred-site/task_controller","org.apache.hadoop.mapred.DefaultTaskController")

  #### health_check

  $security_enabled = hdp_default("hadoop/health_check/security_enabled","false")

  $task_bin_exe = hdp_default("hadoop/health_check/task_bin_exe")
}
